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



我在应用程序中使用iojs和koa,最近我决定将iojs更新到nodejsv4.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?

根据错误消息判断自签名证书没有任何问题。但是提供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

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

请参阅此处https://certsimple.com/blog/a-plus-node-js-ssl

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

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

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

我希望它能有所帮助。

感谢您的回答!

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

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

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

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

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

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

最新更新