我想做的是使用 Node Express 和 Swagger 创建 api 端点。 我要部署项目的服务器是Ubuntu。
在服务器上设置节点项目后,安装 Apache2 并使用 SSL 证书和密钥设置 HTTPS,访问该站点效果良好。
但是,每当我尝试从本地向服务器发送 API 请求时,它都会返回一条错误,并显示“无法验证第一个证书”消息。
我拥有的证书和密钥文件是:
.conf 文件:
<VirtualHost *:80>
ServerName servername.com
Redirect permanent / https://servername.com/
</VirtualHost>
<VirtualHost *:443>
ServerName servername.com
SSLEngine on
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
SSLCertificateKeyFile /etc/apache2/ssl/KeyFile_Wildcard.servername.com_crt.key
SSLProxyCACertificateFile /etc/apache2/ssl/CA_GLOBALSIGN_ROOT_CA.crt
SSLCertificateFile /etc/apache2/ssl/complete_chain.crt
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / https://servername.com:3005/
ProxyPassReverse / https://servername.com:3005/
</VirtualHost>
node项目中的app.js文件:
const express = require('express');
const orderRoutes = require('./routes/orderRoutes');
const swaggerUi = require('swagger-ui-express');
const swaggerJSDoc = require('swagger-jsdoc');
const swaggerDef = require('./utils/swaggerDef');
const https = require('https');
const fs = require('fs');
const app = express();
app.use(express.json());
const options = {
swaggerDefinition: swaggerDef,
apis: ['./routes/*.js', './controllers/*.js'],
};
const swaggerSpec = swaggerJSDoc(options);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
app.use('/api', orderRoutes);
const PORT = process.env.PORT || 3005;
const privateKey = fs.readFileSync('/etc/apache2/ssl/KeyFile_Wildcard.servername_crt.key');
const certificate = fs.readFileSync('/etc/apache2/ssl/complete_chain.crt');
const credentials = {
key: privateKey,
cert: certificate
}
const httpsServer = https.createServer(credentials, app);
httpsServer.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
module.exports = app;
我测试了 openssl s_client -connect servername.com:443,但它也返回无法验证第一个证书。
我也尝试过使用nginx,但结果是一样的。
有人可以帮我解决这个问题吗?
提前致谢!
链中包含什么?要设置服务器(无需客户端身份验证),您只需要链和密钥文件。
客户端期望的第一个证书是服务器的证书,后跟任何中间证书,然后可选地后跟根证书。毕竟,客户端应该已经在其信任存储中拥有根证书。