我在我的应用程序中使用了iojs和koa,最近我决定将iojs更新到nodejs v4.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?
发布于 2017-08-07 11:14:36
谢谢你的回答!
正如我所怀疑的,这个问题与openssl无关。
在我的应用程序中,我有一个带有应用程序配置的config.js文件。在其中,我读取证书文件并将它们添加到javascript对象中。
问题是,我正在使用lodash模块合并两个javascript对象(其中一个包含证书文件)。
我使用的是lodash模块的旧版本,它似乎使用了一个Buffer来合并这些文件。该版本中的Buffer实现与新Node.js版本中的Buffer实现不匹配。这会导致证书文件的不正确合并,并导致ERR_SSL_VERSION_OR_CIPHER_MISMATCH错误消息。
长话短说,在将lodash模块更新到最新版本之后,证书开始按预期工作。
发布于 2016-06-20 13:12:46
将有一个信任存储(keystore)文件,其中需要注册所有受信任的证书。您必须在那里注册这个新创建的证书。客户端使用该信任存储文件来检查证书是否可信。
欲知更多详情,请参阅以下连结:
创建自签名证书(openssl和keytool)
希望能帮上忙。
发布于 2016-06-21 11:54:14
从错误信息判断,自签名证书没有任何问题。但是提供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最后,您将希望通过提供更多‘ll选项来配置https服务器提供的密码套件。
https://stackoverflow.com/questions/37139718
复制相似问题