【问题标题】:Self signed SSL does not work after upgrading from iojs to nodejs v4.4.4从 iojs 升级到 nodejs v4.4.4 后,自签名 SSL 不起作用
【发布时间】:2016-09-05 12:02:50
【问题描述】:

我在我的应用程序中使用 iojs 和 koa,最近我决定将 iojs 更新到 nodejs v4.4.4。更新非常顺利,我的应用程序立即运行。问题是我在我的开发机器上使用自签名 SSL 证书,在我更新到 nodejs 后,当我尝试访问该网站时收到以下消息:

此站点无法提供安全连接

localhost 使用不受支持的协议。

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

客户端和服务器不支持通用的 SSL 协议版本或 密码套件。这很可能是服务器需要RC4时造成的, 这不再被认为是安全的。

我正在使用nvm,所以我尝试切换到 iojs 并且网站再次运行。

经过阅读后,我发现我必须将openssl 更新为版本1.0.2g,而不是我用来创建.key.crt 文件的1.0.1g。所以我更新了openssl 并生成了新的密钥和证书文件,如下所示:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

遗憾的是,这并没有解决问题。

这是我用来在服务器上设置 https 的代码:

let sslOptions = {
            key: fs.readFileSync('/etc/apache2/ssl/apache.key'),
            cert: fs.readFileSync('/etc/apache2/ssl/apache.crt')
                 };

let server = require('https').createServer(sslOptions, app.callback())

我做错了吗?为什么对iojs有效,对nodejs无效?

【问题讨论】:

  • 错误消息显示在浏览器中,对吗?哪一个?
  • 它在 Chrome 中显示,但我在 Firefox 中也收到一条错误消息。在 Firefox 中是 Error code: SSL_ERROR_INAPPROPRIATE_FALLBACK_ALERT
  • 如果它仅用于开发目的,我建议添加一个例外。请参阅此处的 cmets gaboesquivel.com/blog/2014/… 了解 chrome。如果不行,你有没有想过让我们加密?或者更残酷的this
  • 我已经尝试了第一个链接。它几乎与我上面描述的相同。
  • 为什么不试试 nginx 可以帮助 SSL 便宜而且不需要购买 SSL。

标签: node.js ssl openssl koa iojs


【解决方案1】:

会有一个信任库(keystore)文件,所有受信任的证书都需要在其中注册。您必须在那里注册这个新创建的证书。客户端使用该信任库文件来检查证书是否可以信任。

有关更多详细信息,您可以参考以下链接:-

Creating Self Signed Certificates (openssl & keytool)

希望对你有帮助。

【讨论】:

  • 这可能适用于 Java,但我认为没有办法在 Node.js 中使用密钥库来创建 HTTPS 服务器。我也找不到openssl.cfg(如博客文章中所述)。我将 openssl 作为 apt-get 包安装,所以也许这就是问题所在。
  • 查看此链接以将受信任的 CA 添加到节点 js..stackoverflow.com/questions/21004645/… 该帖子是为了明确概念。
  • 在 openssl home dir 中运行以下命令:- find 。 -name "openssl.cfg"
【解决方案2】:

从错误信息来看,自签名证书没有问题。但是提供 ssl 连接的“服务器”不支持协议版本和密码套件的合适组合。

openssl s_client -connect localhost:443

或更详细的

openssl s_client -connect localhost:443 -debug

可能会告诉您在 ssl 握手期间出了什么问题。

您还可以通过名为 sslscan 的工具了解提供了哪些组合

apt-get install sslscan
sslscan localhost:443
sslscan localhost:443 | grep Accepted

最后,您需要通过提供更多 ssl 选项来配置您的 https 服务器提供的密码套件。

请看这里https://certsimple.com/blog/a-plus-node-js-ssl

【讨论】:

  • 我尝试了openssl s_client 并收到以下消息CONNECTED(00000003) 139962603136672:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:769: no peer certificate available No client certificate CA names sent New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : 0000 Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None Verify return code: 0 (ok)
  • 我对 SSL 不是很了解,您对问题所在有什么见解吗?
  • sslscan 工具没有返回 Accepted 密码
  • 在我链接的站点中,作者在您的 sslOptions 对象中定义了另一个键。看到它说 Cipher is (NONE) 在你的代码中复制 ciphers: [...].join(':') 的最后一个版本,如果有帮助,请尝试。
  • 我之前尝试过添加密码,但没有成功。当我现在添加它并尝试使用 openssl 命令时,它仍然显示Cipher is (NONE)。我正在使用nvm 进行版本管理。难道是当我从 iojs 切换到 node 时,tls.js 文件仍然是一样的,并且旧密码在那里?
【解决方案3】:

我不是 NodeJS 专家。但似乎您需要在节点服务器上禁用 RC4。我认为这就是问题所在。

【讨论】:

    【解决方案4】:

    感谢您的回答!

    正如我所怀疑的,问题出在与 openssl 无关的东西上。

    在我的应用程序中,我有一个带有应用程序配置的 config.js 文件。 在其中,我正在读取证书文件并将它们添加到 javascript 对象中。

    问题是,我正在使用 lodash 模块来合并 2 个 javascript 对象(其中一个包含证书文件)。

    我使用的是旧版本的lodash 模块,它似乎使用Buffer 来合并文件。该版本中的Buffer 实现与新Node.js 版本中的Buffer 实现不匹配。这会导致证书文件的错误合并,并导致出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH 错误消息。

    长话短说,将lodash 模块更新到最新版本后,证书开始按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-04
      • 2017-02-07
      • 2017-08-13
      • 2019-09-11
      • 2020-09-25
      • 2015-12-08
      • 2017-07-06
      • 1970-01-01
      相关资源
      最近更新 更多