Apache2 Node Express 无法验证第一个证书

Apache2 Node Express unable to verify the first certificate

提问人:seung 提问时间:10/27/2023 最后编辑:seung 更新时间:10/29/2023 访问量:27

问:

我正在尝试做的是使用 Node Express 和 Swagger 制作 api 端点。 我要部署项目的服务器是 Ubuntu。

在服务器上设置节点项目后,安装 Apache2 并使用 SSL 证书和密钥设置 HTTPS,访问站点运行良好。

但是,每当我尝试将 API 请求从本地发送到服务器时,它都会返回一个错误,并显示“无法验证第一个证书”消息。

我拥有的证书和密钥文件是:

  1. CA_GLOBALSIGN_ROOT_CA.crt
  2. File_Wildcard.servername.com.crt
  3. ChainFile_ChainBundle.crt
  4. KeyFile_Wildcard.servername.com_crt.key
  5. complete_chain.crt(这是我通过组合(1)制作的。(2) 和 (3) 文件)。

.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>

节点项目中的 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,但结果是一样的。

有人可以帮我解决这个问题吗?

提前致谢!

节点.js SSL https apache2 swagger-node-express

评论


答:

0赞 Maarten Bodewes 10/29/2023 #1

链中包含什么?要设置服务器(无需客户端身份验证),您只需要链和密钥文件。

客户端期望的第一个证书是服务器的证书,后跟任何中间证书,然后是根证书(可选)。毕竟,客户端的信任存储中应该已经有根证书。