tls_post_process_client_hello:no shared cipher错误成因咨询
错误成因分析:SMTP服务器TLS握手失败相关问题
问题现象
通过Node.js的nodemailer.sendMail发送邮件,初始输出显示提交成功:
message ID of message sent: <2a6156f0-dd20-cfe8-64b2-41c1fc511167@mywebsite.org> sendResult: {"accepted":["myownemail@gmail.com"],"rejected":[],"envelopeTime":7,"messageTime":45,"messageSize":761,"response":"250 OK: message queued","envelope":{"from":"No_Reply@mywebsite.org","to":["myownemail@gmail.com"]},"messageId":"<2a6156f0-dd20-cfe8-64b2-41c1fc511167@mywebsite.org>"}
但未收到目标邮件,半小时后日志出现以下错误:
Error 00E80674957F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../deps/openssl/openssl/ssl/statem/statem_srvr.c:2240: Error Socket closed unexpectedly Error 00E80674957F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../deps/openssl/openssl/ssl/statem/statem_srvr.c:2240:
后续还出现更多相关错误:
Error read ECONNRESET Error 00E80674957F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../deps/openssl/openssl/ssl/statem/statem_srvr.c:2240: Error 00E80674957F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../deps/openssl/openssl/ssl/statem/statem_srvr.c:2240: Error 00E80674957F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../deps/openssl/openssl/ssl/statem/statem_srvr.c:2240: Error 00E80674957F0000:error:0A0000C1:SSL routines:tls_post_process_client_hello:no shared cipher:../deps/openssl/openssl/ssl/statem/statem_srvr.c:2240: Error 00E80674957F0000:error:0A00009C:SSL routines:ssl3_get_record:http request:../deps/openssl/openssl/ssl/record/ssl3_record.c:345: Error Socket closed unexpectedly Error 00E80674957F0000:error:0A00010B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:354:
环境信息
- Node.js后端配合NGINX处理API请求,同服务器部署Node.js SMTP服务器
- SMTP服务器监听465端口,未针对SMTP配置NGINX转发
- 已排除Digital Ocean端口限制(使用465而非受限的25端口)
已尝试的修复
- 将Certbot生成的SSL证书扩展至smtp子域名,问题未解决
- SMTP服务器证书配置代码:
environmentSpecificOptions = { secure: true, disabledCommands: ['AUTH'], key: fs.readFileSync("/etc/letsencrypt/live/api.mywebsite.org/privkey.pem"), cert: fs.readFileSync("/etc/letsencrypt/live/api.mywebsite.org/fullchain.pem"), name: process.env.SMTP_HOST, hideSize: false, } const startMailServer = () => { const options = environmentSpecificOptions; const mailServer = new SMTPServer(options); const listenPort = process.env.SMTP_PORT; console.log('\n' + "Listen port for smtp server will be: " + process.env.SMTP_PORT); mailServer.listen(listenPort); mailServer.onConnect("error", err => { console.log('\n' + `emailServer listening on port ${listenPort}`.blue); }); mailServer.on("error", err => { console.log('\n' + "Error %s", err.message); }); }
错误成因解析
1. no shared cipher(无共享加密套件)
这是核心错误,原因是你的SMTP服务器与目标邮箱的MX服务器(比如Gmail的邮件服务器)在TLS握手阶段,没有共同支持的加密套件。可能的具体情况:
- Node.js内置的OpenSSL默认启用的加密套件,和目标服务器支持的套件无重叠
- 你的服务器配置的加密套件过于老旧或过于严格,导致对方无法匹配
2. read ECONNRESET/Socket closed unexpectedly
这是TLS握手失败后的连锁反应:当握手失败时,目标服务器会主动关闭连接,或者网络层面连接中断,从而触发这类错误。
3. ssl3_get_record:http request
有非SMTP客户端(比如网络爬虫、配置错误的服务)向你的465端口发送了HTTP请求,而不是符合SMTP协议的TLS握手请求,导致SSL解析失败。
4. ssl3_get_record:wrong version number
客户端发送的TLS/SSL版本与你的服务器支持的版本不兼容,比如客户端使用了已被禁用的老旧版本(如SSL3.0),或者服务器不支持客户端使用的TLS版本。
另外需要注意:初始显示的“发送成功”只是Nodemailer将邮件提交到了你自己的SMTP服务器队列,并不代表邮件已成功投递到目标邮箱。你的SMTP服务器在尝试与目标邮箱的MX服务器建立连接并完成TLS握手时失败,导致邮件无法投递,重试几次后才记录下错误日志。
内容的提问来源于stack exchange,提问作者generic3892372
相关产品推荐
相关产品推荐

