从 iojs 升级到 nodejs v4.4.4 后,自签名 SSL 不起作用

Self signed SSL does not work after upgrading from iojs to nodejs v4.4.4

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

This site can’t provide a secure connection

localhost uses an unsupported protocol.

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

The client and server don't support a common SSL protocol version or cipher suite. This is likely to be caused when the server needs RC4, which is no longer considered secure.

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

经过一番阅读,我发现我必须将 openssl 更新到版本 1.0.2g 而不是我用来创建 .key.crt 文件。所以我更新了 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无效?

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

更多详情可参考下方link:-

Creating Self Signed Certificates (openssl & keytool)

希望对您有所帮助。

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

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

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

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

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

感谢您的回答!

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

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

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

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

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