You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:35:34