节点 js https net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH [复制]

node js https net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH [duplicate]

提问人:san 提问时间:9/4/2023 最后编辑:Steffen Ullrichsan 更新时间:9/4/2023 访问量:45

问:

我实现了以下代码,使节点js在https上运行

const https = require('https');
const options = {
        key: fs.readFileSync('apache key file path.key', "UTF-8"),
        crt: fs.readFileSync('apache crt file path.crt', "UTF-8")

}
const httpsvr = https.createServer(options, (req, res) => {
       res.writeHead(200, { 'Content-Type': 'text/plain' });
       res.end('TEST HTTPS\n');
});

const io = require('socket.io')(httpsvr);

httpsvr.listen(8443);

io.on("connect_error", (err) => {
    console.log('connect error ' + err.message );
});

io.on('connection', function (socket) {
   socket.on('TestNodeEvent', function (data) {
     console.log(data);
     console.log('io8443 connected');
   });
});`

这将运行 https 服务器。但客户端无法建立 socket.io 连接。因此广播不会发生

socket = io('https://xxx.xxx.xxx.xx:8443');
socket.on('testupdate', function (data) `

我尝试向其他用户发送页面刷新信号,但套接字 io 连接不正确。 我从浏览器收到以下错误

Chrome - net::ERR_SSL_VERSION_OR_CIPHER_MISMATCH

Firefox -
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at      https://xxx.xxx.xxx.xx:8443/socket.io/?EIO=4&transport=polling&t=OfUXCGt. (Reason: CORS request did not succeed). Status code: (null).

`

Node JS version  - v14.21.3
socket.io        - 4.2.0
socket.io-client - 4.2.0

我想让页面刷新发生在其他用户身上,而一个人使用应该从其他用户那里选择的特定选项

这就是我在后端执行 culr 和 openssl 时得到的

openssl s_client -connect xxx.xxx.xxx.xxx:8443
CONNECTED(00000003)
139917842872128:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:ssl/record/rec_layer_s3.c:1544:SSL alert number 40
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 289 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---

node.js Linux Apache SSL socket.io

评论

0赞 Steffen Ullrich 9/4/2023
请提供您在服务器端获得的输出,即从您的 nodejs
0赞 san 9/4/2023
谢谢大家。当我尝试使用我的服务器证书apache时,我没有收到任何控制台.log消息,我在node.log中出现以下错误
0赞 san 9/4/2023
我的节点.log当我使用 apache 密钥和证书文件时没有获得任何日志,我收到此错误错误:错误:0909006C:PEM 例程:get_name::没有起跑线原因:“没有起跑线”,代码:“ERR_OSSL_PEM_NO_START_LINE”
0赞 Steffen Ullrich 9/4/2023
该行表示您的证书和/或密钥的格式错误。因此,它们无法加载,因此无法对这些进行 HTTPS。这是与此问题相关的其他问题的重复。

答:

-1赞 Anant Kumar 9/4/2023 #1

如果你在 ubuntu 上使用 Apache 或 nginx,你应该修改你的代码

const https = require('https');
对于 HTTPS 服务器,请使用 CERTBOT,首先尝试安装 certbot,安装成功后,如果您使用的是 apache,请运行此命令

sudo certbot --apache

或者,如果您使用的是 nginx

sudo certbot --nginx

评论

0赞 Steffen Ullrich 9/4/2023
我看不出这是如何回答这个问题的。
0赞 Anant Kumar 9/4/2023
对不起,如果你没有得到答案,实际上我的意思是说,如果你正在创建HTTPS服务器,那么你还需要使用Certbot添加和ssl,然后你可以通过HTTPS访问它,一般来说,当你从HTTPS服务器在HTTP上请求时,会发生跨域请求错误 出于测试目的 您可以从浏览器禁用安全检查
0赞 san 9/4/2023
嗨@AnantKumar我无法发送 http 请求,因为 chrome 不允许它 socket = io('xxx.xxx.xxx.xx:8443');这在 http 上工作正常,但是当我实现 https 时,我可以看到节点 js 请求进入 linux 服务器但没有日志
0赞 Steffen Ullrich 9/4/2023
@AnantKumar:OP 在这里没有使用反向代理(只需检查端口) - 所以关于 apache 和 nginx 的任何事情都没有意义。所以 OP 似乎也已经拿到了证书——所以关于 certbot 的任何事情在这里也无关紧要。
0赞 san 9/4/2023
大家好,当我使用 ps -ef|grep 节点根 1378 1 0 Aug19 时?00:00:00 /usr/sbin/mcelog --ignorenodev --daemon --foreground root 3880627 1 3 15:10 ?00:00:42 /usr/bin/node /usr/wasp11/source/prod/node/node_start.js root 3901301 3407795 0 15:31 pts/3 00:00:00 grep --color=auto 节点