使用node.js https进行SSL握手失败

时间:2015-10-30 16:04:02

标签: node.js ssl docker wireshark handshake

我使用express使用https运行API。为了测试,我一直在使用tinycert.org获取证书,这些证书可以在我的机器上正常工作。

我正在使用docker打包应用,docker-machine使用docker-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”,然后下一帧是“握手失败(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);

1 个答案:

答案 0 :(得分: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添加到选项中。