Strapi调用WooCommerce API时出现SSL相关错误求助
解决WooCommerce API对接的SSL连接错误
错误原因解析
出现的两类错误指向不同的SSL/连接问题:
EPROTO+SSL alert number 80:SSL握手阶段的内部错误,核心原因是Strapi服务器(Node.js)与远端WooCommerce站点的TLS协议版本、加密套件不兼容,或者远端站点SSL配置存在异常(如证书链不完整、旧协议强制禁用)。ECONNRESET:连接被远端主动重置,一般是握手失败后服务器断开连接,也可能是网络层面的拦截。
浏览器能正常访问的原因:浏览器的TLS兼容逻辑更灵活,会自动尝试多种协议版本和加密套件,而Node.js默认配置的兼容范围较窄。
排查与修复步骤
1. 验证远端站点的SSL兼容性
在Strapi服务器上执行openssl命令,测试目标站点支持的TLS版本和加密套件:
# 测试TLS 1.2 openssl s_client -connect your-woocommerce-site.com:443 -tls1_2 # 测试TLS 1.3 openssl s_client -connect your-woocommerce-site.com:443 -tls1_3
查看命令输出:
- 如果某一版本能成功握手,说明远端仅支持该版本的TLS
- 记录输出中的
Cipher Suite字段,这是远端支持的加密套件
2. 精细化配置Node.js HTTPS Agent
针对不兼容的站点,调整HTTPS Agent的参数,匹配远端的SSL配置:
try { const https = require('https'); const agent = new https.Agent({ // 强制使用远端支持的TLS版本(比如从openssl测试结果选TLSv1.2) minVersion: 'TLSv1.2', maxVersion: 'TLSv1.2', // 填入openssl输出中远端支持的加密套件 ciphers: 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256', keepAlive: true, // 调试阶段临时禁用证书校验(生产环境必须关闭此选项) rejectUnauthorized: false }); const response = await fetch(url, { agent }); const data = await response.json(); ctx.body = data; } catch (error) { console.error('Failed to fetch from WooCommerce', error); ctx.throw(500, 'Failed to fetch data from WooCommerce'); }
3. 检查Node.js内置OpenSSL版本
Node.js 16.x依赖内置OpenSSL,运行以下命令查看版本:
node -p "process.versions.openssl"
如果版本低于1.1.1n,可能对部分新加密套件支持不足,建议升级到Node.js 16.x最新稳定版(如16.20.2),或切换到Node.js 18.x LTS版本(内置更新的OpenSSL)。
4. 排查网络与权限问题
- 在服务器上用curl测试API访问:
如果curl也失败,可能是Strapi服务器的IP被远端站点防火墙拦截,或远端开启了IP白名单限制。curl -v "https://your-woocommerce-site.com/wp-json/wc/v3/products?page=1&per_page=10" -u "consumer_key:consumer_secret" - 确认WooCommerce的consumer key/secret权限是否完整,是否有权限访问目标API端点。
5. 临时绕过SSL验证(仅调试)
如果确认是远端证书配置问题(如自签名证书),可以临时在Agent中添加rejectUnauthorized: false,但生产环境绝对不能使用,必须修复远端证书问题。
内容的提问来源于stack exchange,提问作者Ben H
相关产品推荐
相关产品推荐

