使用Axios向Node.js服务器发起HTTPS请求时遇ERR_SSL_PROTOCOL_ERROR错误求助
解决Node.js HTTPS服务器的ERR_SSL_PROTOCOL_ERROR问题
核心排查方向及解决步骤
1. 修复证书链完整性问题
你的HTTPS服务器配置里只用了certificate.pem,但Certbot颁发的证书通常需要包含中间证书的fullchain.pem才能让客户端完整验证信任链。把服务器配置里的cert路径换成fullchain文件:
const options = { key: fs.readFileSync('/path/to/private-key.pem'), // 替换成fullchain.pem cert: fs.readFileSync('/path/to/fullchain.pem'), // 先注释掉自定义ciphers,用默认值测试 // ciphers: '...' };
2. 分离服务器HTTPS与数据库SSL配置
你给MySQL配置的SSL和服务器的HTTPS是完全独立的两个服务,当前问题出在服务器的HTTPS连接上,先暂时注释掉数据库的SSL配置,排除干扰:
const db = mysql.createPool({ host: "123.456.789.012", user: "myuser", port: "3306", password: "mypassword", database: "mydb", // 暂时注释,先解决HTTPS问题 // ssl: { // ca: fs.readFileSync('/path/to/ca.crt'), // key: fs.readFileSync('/path/to/private-key.pem'), // cert: fs.readFileSync('/path/to/certificate.pem') // } });
3. 检查证书文件的路径与权限
确保Node.js进程有读取证书文件的权限,比如用以下命令验证:
ls -l /path/to/private-key.pem /path/to/fullchain.pem
如果权限不足,执行:
chmod 644 /path/to/private-key.pem /path/to/fullchain.pem
同时确认路径是绝对路径,避免相对路径导致的文件找不到问题。
4. 验证客户端请求的正确性
- 确保Axios请求的是
https://yourdomain.com:8081(注意是HTTPS,不是HTTP) - 如果是本地测试,不要用
localhost访问,因为你的证书是绑定域名的,域名不匹配会触发SSL错误,改用域名访问或者配置hosts映射
5. 简化HTTPS配置,排除自定义cipher干扰
你配置的cipher列表过于复杂,可能存在客户端不支持的加密套件,先去掉自定义ciphers配置,使用Node.js默认的加密套件集合,再测试连接。
6. 检查服务器端口与防火墙
确认服务器的8081端口已经对外开放(云服务器的安全组、本地防火墙都要放行),可以用telnet yourdomain.com 8081测试端口是否可达。
内容的提问来源于stack exchange,提问作者jaime
相关产品推荐
相关产品推荐

