我最近从 Positive ssl 购买了个人 ssl 证书。在我通过激活和验证解决了所有问题后,我终于能够下载证书文件了。
我得到的文件是:
www.niknet.ddns.net.ca-bundle
www.niknet.ddns.net.crt
www.niknet.ddns.net.p7b
之前我只使用
.key
和.crt
它工作得很好,但现在我正在使用 .ca-bundle
和 .crt
文件
这是我用来将这些文件包含到 Node js 中的 ssl 库中的代码
var httpPort = process.env.PORT || 80;
var httpsPort = process.env.PORT || 443;
var server = http.createServer(app).listen(httpPort);
var server = https.createServer({
secureProtocol : 'TLSv1_2_server_method',
ciphers : "AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH",
honorCipherOrder : true,
ca: fs.readFileSync(__dirname + '/niknet_ddns_net.ca-bundle'),
cert: fs.readFileSync(__dirname + '/niknet_ddns_net.crt')
},app).listen(httpsPort);
var io = require('socket.io').listen(server);
但我一生都无法获得正常工作的证书。 我刚刚收到此错误
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
我一直在阅读其他帖子并尝试添加他们的代码但没有任何效果。 我还在某处读到,node.js 的 ssl 或 tls 库已过时,并且我的证书可能太新。如果这是真的,我还可以使用其他第三方 ssl 库吗?
运行此命令:
openssl req -nodes -new -x509 -keyout server.key -out server.cert
记住将其设置为本地主机:
Common Name (e.g. server FQDN or YOUR name) []:
本地主机
然后
https.createServer({
key: fs.readFileSync('./ssl/server.key'),
cert: fs.readFileSync('./ssl/server.cert')
},app)
如果添加的证书未在 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
的第一个参数中正确指示,则会出现
createServer()
。
使用下面的命令使用 openssl 测试了密钥和 crt(在浏览器中尝试https://hostname:8888)..并发现缺少确切的密码。
openssl s_server -cert server.crt -key server.key -CAfile octopz.zende.sk.ca-bundle -accept 8888 -www
然后添加到nodejs代码中。
var server = https.createServer({
key: privateKey,
cert: certificate,
ca: certificateAuthority,
ciphers: [
"ECDHE-RSA-AES128-SHA256",
"DHE-RSA-AES128-SHA256",
"AES128-GCM-SHA256",
"RC4",
"HIGH",
"!MD5",
"!aNULL"
].join(':'),
}, app);
成功了!
对于其他语言,我们有很多这样的欺骗,但我能找到的最接近的 Nodejs 是 How to create an HTTPS server in Node.js? ,这不是特定的,或者 ERR_SSL_VERSION_OR_CIPHER_MISMATCH with Node v7.9.0 https ,这是无解答。所以:
SSL/TLS 服务器,包括 HTTPS 服务器需要私钥和证书/链(极少数例外情况不适用)。您可以使用 CA 颁发的证书(和链)而不是自行创建(通常是自签名)的证书,只要 CA 颁发的证书用于相同的私钥,但是您仍然必须提供私钥 。您可以同时使用
cert
和 key
,也可以将证书(以及可选的链)和密钥组合到 PKCS12(也称为 PFX)文件中,然后使用 pfx
。
除了你问的问题,并且可以说是偏离主题的SO,不要使用RC4。它被认为在密码学上被破坏了,尽管在实践中平均来说仍然相当困难/成本高昂,而且大多数使用 SSL/TLS/HTTPS 的标准已经禁止它好几年了,特别是rfc7465。