我有一个使用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”,然后下一帧是“ 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);
我也已经有很长时间了,有一个奇怪的解决方法:
不要将您的证书转换为.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
。