ERR_SSL_VERSION_OR_CIPHER_MISMATCH,节点v7.9.0 https

时间:2017-09-15 00:30:46

标签: javascript node.js ssl https

此代码在节点v7.9.0(Electron当前使用的版本)中创建https服务器,并侦听端口8000:

require('https').createServer(
  {},
  (req, res) => {
    res.writeHead(200);
    res.end('hello world/n');
  }
).listen(8000);

很遗憾,当我在服务器运行时访问Chrome中的https://localhost:8000时,我会收到ERR_SSL_VERSION_OR_CIPHER_MISMATCH。我如何通过此错误?如何找出服务器可用的密码和使用的协议(希望是最新版本的TLS)?

编辑在编写本节点时最新稳定版本的节点v8.5.0上也会出现此错误

1 个答案:

答案 0 :(得分:0)

后期,但是:通常,包括 HTTPS服务器在内的SSL / TLS服务器需要私钥和(匹配的)证书或链,才能用于SSL / TLS握手中的公钥算法。有关示例,请参见How to create an HTTPS server in Node.js?

从技术上讲,协议中定义了一些不需要密钥和证书的“匿名”密钥交换机制,但是人们普遍认为它们不够安全,并且默认情况下在OpenSSL(因此是nodejs)中被禁用。还有一些使用非公钥算法的密钥交换机制,例如PSK,SRP,Kerberos,但是它们使用起来更加困难,并且需要特殊的配置,我不相信可以用nodejs来完成(而且您当然没有这样做)做)。

因此,如果没有密钥和证书,并且没有启用匿名或其他特殊的密钥交换,则服务器支持的密码套件集就是没有元素的空集-并且您进行的每次连接尝试都会失败,因为空集永远不会与客户提供的一组密码套件的非空交集。

认为,您仍然可以通过查看针对不同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是否/何时使用/支持它。