[node.js https的SSL握手失败

问题描述 投票:3回答:1

我有一个使用expresshttps一起运行的API。为了进行测试,我一直在使用tinycert.org获得证书,这些证书在我的计算机上可以正常工作。

我正在使用docker打包应用程序,并使用docker-machinedocker-compose来在数字海洋服务器上运行它。

[当我尝试连接Chrome时,出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH。用curl运行此程序时,出现握手失败:curl: (35) SSL peer handshake failed, the server most likely requires a client certificate to connect

[我试图用Wireshark的SSL解剖器进行调试,但是它没有给我更多信息:我可以看到“ Client Hello”,然后下一帧是“ Handshake Failure(40)”。

我认为docker容器上的节点可能没有可用的密码,但是它的列表很大,所以不可能是这样。我不确定发生了什么事以及如何补救。

编辑

这是我的createServer()块:

let app = express();
let httpsOpts = {
    key:  fs.readFileSync("./secure/key.pem"),
    cert: fs.readFileSync("./secure/cert.pem")
};
let port = 8080;
https.createServer(httpsOpts, app).listen(port);
node.js ssl docker wireshark handshake
1个回答
0
投票

我也已经有很长时间了,有一个奇怪的解决方法:

  1. 不要将您的证书转换为.pem;它可以很好地用作.crt和.key文件。

  2. ca: fs.readFileSync("path to CA bundle file")添加到https选项。看来您的服务器仅在发送顶级证书,并且CA Bundle文件包含非浏览器使用所需的中间证书和根证书。

  3. 重要!将节点重新安装或更新到最新版本。如果您使用的是Linux,则可以使用sudo apt-get upgrade(可能需要一段时间)。

  4. 重新下载证书或获取新证书。

如果您是自己的证书颁发机构,则可能无法识别/信任证书,因此请尝试在ssllabs.com上测试您的站点。

如果使用的是http2 API,请尝试在选项中添加allowHTTP1: true

© www.soinside.com 2019 - 2024. All rights reserved.