javascript - ERR_SSL_VERSION_OR_CIPHER_MISMATCH Node v7.9.0 https

标签 javascript node.js ssl https

此代码在 Node v7.9.0(Electron 当前使用的版本)中创建一个 https 服务器,并在端口 8000 上监听:

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

不幸的是,当我访问https://localhost:8000在运行服务器的 Chrome 中,我得到 ERR_SSL_VERSION_OR_CIPHER_MISMATCH。我如何克服这个错误?我如何找出服务器提供的密码以及它使用的协议(protocol)(希望是最新版本的 TLS)?

编辑 这个错误也发生在 node v8.5.0 上,这是撰写本文时 Node 的最新稳定版本

最佳答案

晚了但是:通常一个 SSL/TLS 服务器包括一个 HTTPS 服务器需要一个私钥和(匹配的)证书或链来用于 SSL/TLS 握手中的公钥算法。参见 How to create an HTTPS server in Node.js?例如。

从技术上讲,协议(protocol)中定义了一些不需要 key 和证书的“匿名” key 交换机制,但它们被广泛认为不够安全,默认情况下在 OpenSSL(以及 nodejs)中被禁用。还有一些使用非公钥算法的 key 交换机制,如 PSK、SRP、Kerberos,但它们更难使用并且需要特殊配置,我不相信可以用 nodejs 完成(你当然没有做)。

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

认为您仍然可以通过查看为不同 ClientHello 版本返回的警报版本来找出它支持的协议(protocol)版本,但我不确定这样做有什么好处.在任何情况下,自 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 是否/何时使用/支持这个。

关于javascript - ERR_SSL_VERSION_OR_CIPHER_MISMATCH Node v7.9.0 https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46229995/

相关文章:

windows - Tivoli Monitoring Agent 中的 SSL 漏洞

javascript - 在 d3.js 中如何创建用于投影的动态比例值?

javascript - Jquery .insertBefore 忽略结束标签并自动关闭丢失的标签

javascript - 如何在 Angular4 中根据日期对对象数组进行排序?

php - 自定义表单验证和提交

php - 停止通配符 SSL 将子域重定向到主域

javascript - 如何在小型 Nodejs 聊天应用程序中向其他人发送文件

node.js - 在 Heroku 上运行 Node.js 应用程序时出错

javascript - webpack - 我什么时候应该对 application.js 文件使用 require vs import

iOS - 使用 TLS-PSK 连接到套接字