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

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

本网站无法提供安全连接

本地主机使用不受支持的协议。

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

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

我使用nvm所以我尝试切换到iojs和网站再次工作。

读了一些后,我发现我必须更新openssl到版本1.0.2g而不是我用来创build.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 

可能会告诉你在握手过程中出了什么问题。

你也可以find一个名为sslscan的工具提供的组合

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

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

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

将会有一个信任库(keystore)文件,其中所有的可信证书都需要注册。 你将不得不在这里注册这个新创build的证书。 客户端使用该信任库文件来检查证书是否可信。

欲了解更多详情,请参考以下链接:

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

我希望它有帮助。

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

谢谢你的答案!

正如我所怀疑的那样,这个问题与openssl无关。

在我的应用程序中,我有一个config.js文件与应用程序configuration。 在里面我正在读证书文件,并将它们添加到一个JavaScript对象。

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

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

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