在HTTPS服务器部署Twilio SMS遇SSL版本错误,求排查方案
Twilio SMS部署到HTTPS服务器后出现SSL版本错误排查思路
问题背景
本地HTTP环境下基于NodeJS(v16.13.1)集成的基础Twilio SMS功能运行正常,但部署到HTTPS staging服务器后出现如下SSL错误:
[Error: 140251391358848:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332: ] { library: 'SSL routines', function: 'ssl3_get_record', reason: 'wrong version number', code: 'ESOCKET', command: 'CONN' }
服务器上其他SSL连接均正常,通过curl https://api.twilio.com/ -v测试也能正常访问Twilio API。
实现代码
const Twilio = require('twilio'); this.twilioClient = new Twilio(accountSID, authToken); this.twilioClient.messages .create({ body: textBody, to: recipientPhone, from: this.twilioConfig.sendingNumber }) .then((message) => logger.log(`SMS Sent: messageId: ${message.sid}`)) .catch((err) => logger.log(`Error sending SMS: ${err}`))
环境版本
- NodeJS v16.13.1
- Twilio ^3.80.0
已尝试的Apache SSL配置
# SSLProtocol all -SSLv2 # SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 +TLSv1.2 SSLProtocol all +TLSv1.2
每次修改配置后都重启了Apache,但问题仍未解决,Twilio官方表示仅支持TLSv1.2,已专门启用该版本。
排查思路
1. 区分Apache与NodeJS的SSL配置
Apache的SSL配置是针对服务器对外提供HTTPS服务的,而NodeJS应用发起Twilio API请求属于客户端SSL连接,两者配置相互独立。需单独确认NodeJS自身的TLS版本设置:
- 在代码中强制指定TLSv1.2版本,修改Twilio客户端初始化逻辑:
const Twilio = require('twilio'); const https = require('https'); const tlsAgent = new https.Agent({ secureProtocol: 'TLSv1_2_method', minVersion: 'TLSv1.2' }); this.twilioClient = new Twilio(accountSID, authToken, { httpClient: new Twilio.HttpClient(tlsAgent) });
- 验证NodeJS默认TLS版本:在服务器执行
node -e "console.log(require('tls').DEFAULT_MIN_VERSION, require('tls').DEFAULT_MAX_VERSION)",确认输出包含TLSv1.2。若默认版本过低,可通过环境变量NODE_OPTIONS=--tls-min-v1.2启动Node应用。
2. 排查代理/防火墙拦截
虽然curl能正常访问Twilio API,但NodeJS应用可能走了不同的代理路径:
- 检查Node应用是否配置了
HTTP_PROXY/HTTPS_PROXY环境变量,若有,确认代理服务器支持TLSv1.2,且未篡改SSL连接。 - 排查服务器防火墙是否对Node应用的出站请求做了SSL拦截(如透明代理、SSL解密),这类设备可能强制使用旧版TLS协议。
3. 升级Twilio客户端版本
当前使用的Twilio ^3.80.0版本发布于2022年,可能存在特定环境下的SSL兼容问题:
- 执行
npm update twilio升级到最新稳定版,新版本可能修复了TLS连接相关的bug。 - 查看Twilio Node SDK更新日志,确认是否有针对TLS握手的修复记录。
4. 检查服务器OpenSSL版本
NodeJS的SSL依赖系统OpenSSL库,执行openssl version检查版本,确保不低于1.0.1g(TLSv1.2的最低要求版本)。若版本过低,需升级OpenSSL后重启Node应用。
5. 开启SSL调试日志
在代码中添加调试参数,捕获TLS握手细节:
// 仅调试用,生产环境请勿开启 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; process.env.NODE_DEBUG = 'tls'; // 原Twilio代码保持不变
启动应用后查看调试输出,确认TLS握手阶段是否使用了正确的协议版本。
内容的提问来源于stack exchange,提问作者Miles Alden
相关产品推荐
相关产品推荐

