我在应用程序中使用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。我认为这就是问题所在。