【问题标题】:ERR_SSL_VERSION_OR_CIPHER_MISMATCH with node v7.9.0 httpsERR_SSL_VERSION_OR_CIPHER_MISMATCH 与节点 v7.9.0 https
【发布时间】:2018-02-24 01:56:22
【问题描述】:

这段代码在节点 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 上,这是编写本文时 Node 的最新稳定版本

【问题讨论】:

    标签: javascript node.js ssl https


    【解决方案1】:

    迟到但:通常 SSL/TLS 服务器包括 HTTPS 服务器需要私钥和(匹配的)证书或链,以用于 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 是否/何时使用/支持这个。

    【讨论】:

      猜你喜欢
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多