节点js中的ERR_SSL_VERSION_OR_CIPHER_MISMATCH

问题描述 投票:0回答:3

我最近从 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 库吗?

node.js ssl server tls1.2
3个回答
6
投票

运行此命令:

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()


2
投票

使用下面的命令使用 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);

成功了!


1
投票

对于其他语言,我们有很多这样的欺骗,但我能找到的最接近的 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

© www.soinside.com 2019 - 2024. All rights reserved.