我在我的应用程序中使用了iojs和koa,最近我决定将iojs更新为nodejs v4.4.4。更新非常顺利,我的应用程序立即运行。问题是我在我的开发机器上使用自签名SSL证书,在我更新到nodejs后,当我尝试访问该网站时收到以下消息:
此网站无法提供安全连接
localhost使用不受支持的协议。
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
客户端和服务器不支持常见的SSL协议版本或 密码套件。这很可能是在服务器需要RC4时引起的, 这不再被认为是安全的。
我正在使用nvm
所以我尝试切换到iojs并且网站再次运行。
经过一些阅读后,我发现我必须将openssl
更新为版本1.0.2g
,而不是我用来创建1.0.1g
和{{1}的.key
文件。所以我更新了.crt
并生成了新的密钥和证书文件,如下所示:
openssl
可悲的是,这并未解决问题。
这是我用来在服务器上设置https的代码:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
我做错了吗?为什么它适用于iojs并且不能与nodejs一起使用?
答案 0 :(得分:3)
将有一个信任库(密钥库)文件,其中需要注册所有可信证书。您必须在那里注册这个新创建的证书。客户端使用该信任库文件来检查证书是否可信任。
有关详细信息,请参阅以下链接: -
Creating Self Signed Certificates (openssl & keytool)
我希望它有所帮助。
答案 1 :(得分: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服务器提供的密码套件。
答案 2 :(得分:1)
感谢您的回答!
我怀疑,问题出在与openssl无关的问题上。
在我的应用程序中,我有一个带有应用程序配置的config.js
文件。
在其中我正在读取证书文件并将它们添加到javascript对象。
问题是,我使用lodash
模块合并了2个javascript对象(其中一个包含证书文件)。
我使用的是lodash
模块的旧版本,看起来它使用了Buffer
来合并文件。该版本中的Buffer
实施与新Buffer
版本中的Node.js
实施不匹配。这导致证书文件的合并不正确,并导致ERR_SSL_VERSION_OR_CIPHER_MISMATCH
错误消息。
长话短说,在将lodash
模块更新到最新版本后,证书开始按预期工作。
答案 3 :(得分:0)
我不是NodeJS专家。但似乎您需要在节点服务器上禁用RC4。我认为这就是问题所在。