6

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

此站点无法提供安全连接

localhost 使用不受支持的协议。

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

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

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

经过一番阅读,我发现我必须更新openssl到版本1.0.2g而不是1.0.1g我用来创建.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?

4

4 回答 4

3

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

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

创建自签名证书(openssl 和 keytool)

我希望它有所帮助。

于 2016-06-20T13:12:46.437 回答
3

从错误消息来看,自签名证书没有任何问题。但是提供 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

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

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

于 2016-06-21T11:54:14.450 回答
1

谢谢你的回答!

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

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

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

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

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

于 2017-08-07T11:14:36.597 回答
0

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

于 2016-06-21T13:36:19.867 回答