node.js - Node.js https 的 SSL 握手失败

标签 node.js ssl docker wireshark handshake

我有一个正在运行的 API express使用https 。为了进行测试,我一直使用tinycert.org作为证书,它在我的机器上运行良好。

我正在使用docker打包应用程序,以及 docker-machinedocker-compose在 digital ocean 服务器上运行它。

当我尝试连接 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容器上的 Node 没有可用的密码,但它有一个巨大的列表,所以不可能是这样。我不确定发生了什么以及如何补救。

编辑

这是我的 createServer() block :

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. 不要将您的证书转换为 .pem;它可以作为 .crt 和 .key 文件正常工作。

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

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

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

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

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

关于node.js - Node.js https 的 SSL 握手失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33440228/

相关文章:

SSL 编程接口(interface)

windows - docker 警告 : failed to get default registry endpoint from daemon

javascript - 尝试加载 Chrome 配置文件时出现 Puppeteer "Unable to move ShaderCache"

node.js - 请求在 express.js 中挂起

node.js - Angular 6 端口 [编号] 已在使用中。使用 '--port' 指定不同的端口

java - 连接到邮件服务器时出现异常

javascript - Pug:使用 pug/jade 在每个循环中调用函数

java - 从系统读取 java 应用程序中的 p12 文件时出现 NoSuchElementException?

docker - 如何在 Docker 容器和主机系统之间共享 Assets (图片、文本文档等)?

docker - 具有外部包依赖性的 Golang 测试未通过 Gitlab Ci,但通过本地