我有一个正在运行的 API express
使用https
。为了进行测试,我一直使用tinycert.org作为证书,它在我的机器上运行良好。
我正在使用docker
打包应用程序,以及 docker-machine
与 docker-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);
最佳答案
我也遇到这个问题很长时间了,有一个奇怪的解决方法:
不要将您的证书转换为 .pem;它可以作为 .crt 和 .key 文件正常工作。
将
ca: fs.readFileSync("path to CA Bundle file")
添加到 https 选项。
看来您的服务器仅发送顶级证书,而 CA 捆绑文件包含非浏览器使用所需的中间证书和根证书。重要!重新安装 Node 或将 Node 更新到最新版本。
如果您使用的是 Linux,则可以使用sudo apt-get Upgrade
(这可能需要一段时间)。重新下载您的证书或获取新证书。
如果您充当自己的证书颁发机构,它可能无法识别/信任该证书,因此请尝试在 ssllabs.com 上测试您的网站.
如果您使用的是 http2 API,请尝试将 allowHTTP1: true
添加到选项中。
关于node.js - Node.js https 的 SSL 握手失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33440228/