我使用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);
答案 0 :(得分:0)
我也已经有很长时间了,有一个奇怪的解决方法:
不要将您的证书转换为.pem;它可以很好地用作.crt和.key文件。
将ca: fs.readFileSync("path to CA bundle file")
添加到https选项。
看来您的服务器仅在发送顶级证书,并且CA bundle文件中包含非浏览器所需的中间证书和根证书。
重要!!将节点重新安装或更新为最新版本。
如果您使用的是Linux,则可以使用sudo apt-get upgrade
(可能需要一段时间)。
重新下载您的证书或获取新证书。
如果您是自己的证书颁发机构,则可能无法识别/信任证书,因此请尝试在ssllabs.com上测试您的网站。
如果您使用的是http2 API,请尝试将allowHTTP1: true
添加到选项中。