Ubuntu服务器NodeJS+Nginx API出现ERR_SSL_PROTOCOL_ERROR的无域名解决方法
解决无域名下Nginx+NodeJS API的ERR_SSL_PROTOCOL_ERROR问题
首先纠正一个基础错误:你用https://xxx.xxx.xxx.xxx:80访问本身就不合理——80是HTTP默认端口,HTTPS默认用443端口,端口不匹配也会触发SSL协议错误。下面是几种无需域名的解决办法:
方案一:改用HTTP访问(无加密,适合测试/内部使用)
- 编辑Nginx配置文件,注释掉所有SSL相关配置项(
ssl_certificate、ssl_certificate_key等),将监听端口改为80:server { listen 80; server_name 167.xx.xx.xx; location / { proxy_pass http://localhost:3000; # 替换为你的NodeJS服务实际监听端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - 重启Nginx生效:
sudo systemctl restart nginx - 访问时直接用
http://167.xx.xx.xx/get-all-products(默认80端口可省略)
方案二:生成自签名SSL证书(加密访问,适合测试/内部信任场景)
自签名证书无法被浏览器默认信任,但能解决SSL协议错误,步骤如下:
- 先创建证书存储目录:
sudo mkdir -p /etc/nginx/ssl - 生成自签名证书和私钥,Common Name必须填你的服务器IP:
执行时除了Common Name填openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/ip.key -out /etc/nginx/ssl/ip.crt167.xx.xx.xx,其他字段可直接回车留空 - 修改Nginx配置,监听443端口并启用SSL:
server { listen 443 ssl; server_name 167.xx.xx.xx; ssl_certificate /etc/nginx/ssl/ip.crt; ssl_certificate_key /etc/nginx/ssl/ip.key; location / { proxy_pass http://localhost:3000; # 替换为你的NodeJS服务端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - 重启Nginx:
sudo systemctl restart nginx - 访问时用
https://167.xx.xx.xx/get-all-products,浏览器会提示证书不安全,手动添加信任即可;如果是客户端程序访问,需要将该自签名证书导入客户端的信任列表。
方案三:申请IP-based免费SSL证书(适合需要公网信任的场景)
部分CA支持为公网IP颁发免费证书,但需要验证你对该IP的控制权:
- 验证方式通常为HTTP验证:在服务器80端口的根目录下放置指定验证文件,CA会访问该IP的验证路径确认控制权
- 申请到证书后,将证书和私钥配置到Nginx的SSL项中即可,流程和自签名证书的Nginx配置一致
- 注意:这类证书有效期较短(一般90天),需要定期续签,且验证步骤比自签名复杂。
内容的提问来源于stack exchange,提问作者sneaker
相关产品推荐
相关产品推荐

