此代码在node v7.9.0(Electron当前使用的版本)中创建一个https服务器,并监听端口8000:
require('https').createServer(
{},
(req, res) => {
res.writeHead(200);
res.end('hello world/n');
}
).listen(8000);
不幸的是,当我访问时https://本地主机:8000 https://localhost:8000在服务器运行的 Chrome 中,我收到 ERR_SSL_VERSION_OR_CIPHER_MISMATCH。我该如何克服这个错误?如何查明服务器正在提供哪些密码以及它正在使用哪种协议(希望是最新版本的 TLS)?
EDIT此错误也发生在 Node v8.5.0 上,这是撰写本文时 Node 的最新稳定版本
迟到但:通常是 SSL/TLS 服务器,包括HTTPS 服务器需要私钥和(匹配的)证书或链用于 SSL/TLS 握手中的公钥算法。看如何在 Node.js 中创建 HTTPS 服务器? https://stackoverflow.com/questions/5998694/how-to-create-an-https-server-in-node-js举些例子。
从技术上讲,协议中定义了一些不需要密钥和证书的“匿名”密钥交换机制,但它们被广泛认为不够安全,并且默认在 OpenSSL(以及 Nodejs)中被禁用。还有一些使用非公钥算法的密钥交换机制,如 PSK、SRP、Kerberos,但它们使用起来要困难得多,并且需要特殊配置,我不认为可以用 Nodejs 来完成这些配置(而且你当然没有这样做)做)。
因此,如果没有密钥和证书,并且没有启用匿名或其他特殊密钥交换,服务器支持的密码套件集是没有元素的空集——并且您所做的每次连接尝试都会失败,因为空集永远不会有非空交集使用客户端提供的一组密码套件。
I think您仍然可以通过查看不同 ClientHello 版本返回的警报版本来找出它支持的协议版本,但我不确定这会有什么好处。无论如何,自 2012 年发布 OpenSSL 1.0.1 以来,OpenSSL 已经支持 TLS 1.0 到 1.2,甚至 Nodejs 7.9.0 也比 2012 年更新了很多。OpenSSL 还支持 SSLv3,但在最近的版本中,它被禁用或排除在构建之外默认;如果您的版本仍然包含它,您不应该使用它,因为 POODLE 攻击会破坏它。 (只有当您使用仅支持 SSLv3 而不能支持任何 TLS 的非常旧的客户端时,通常才会发生这种情况,因此不要使用此类客户端。)实际上,低于 1.1.0 的 OpenSSL“支持”SSLv2,因为代码仍然存在,但默认配置禁用它; SSLv2 早已被破坏和禁止,您绝对不应该使用它。
截至 2018 年 9 月,OpenSSL 1.1.1 发布并支持 TLS 1.3。我不知道nodejs是否/何时使用/支持这个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)