【问题标题】:SSL handshake failure with node.js httpsnode.js https 的 SSL 握手失败
【发布时间】:2016-01-31 03:06:11
【问题描述】:

我有一个使用express 使用https 运行的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);

【问题讨论】:

  • 您好!你能粘贴你的 https.createServer() 行吗?
  • 顺便说一句,我尝试在笔记本电脑的虚拟机中运行我的整个设置,它也可以在那里运行。
  • 不知道会不会和这个stackoverflow.com/questions/21767003/…有关
  • 嘿,你有想过这个吗?我也遇到了同样的情况,谢谢
  • @JaredWilkin 恐怕我没有。不确定我到底做了什么来解决它,但我有一段时间没有看到这个问题了。抱歉没有更多用处!

标签: node.js ssl docker wireshark handshake


【解决方案1】:

我也遇到这个问题很久了,有一个奇怪的解决方法:

  1. 不要将您的证书转换为 .pem;它可以作为 .crt 和 .key 文件正常工作。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 2018-07-28
    • 2015-08-17
    • 2012-10-11
    • 2015-03-16
    • 2021-12-28
    • 2018-10-17
    相关资源
    最近更新 更多