移动数据访问网站出现ERR_SSL_PROTOCOL_ERROR问题求助
问题:移动数据下调用API出现ERR_SSL_PROTOCOL_ERROR,WiFi环境正常
我用Python-Flask搭建了API服务,部署在AWS EC2的子域名api.example.com上,安装了Let's Encrypt Certbot通配符证书(CN为*.example.com)。React应用部署在另一台服务器的example.com域名下,访问https://www.example.com时调用该API,WiFi环境下运行正常,但使用移动数据时出现ERR_SSL_PROTOCOL_ERROR错误。
我的Nginx配置文件如下:
server { listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot server_name api.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_session_timeout 10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305'; # HSTS (optional) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; location / { proxy_pass http://127.0.0.1:5000; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; #add_header Access-Control-Allow-Headers "Authorization, Origin, X-Requested-With, Content-Type, Accept"; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header Access-Control-Allow-Credentials 'true'; } }
可能的原因及解决步骤
1. IPv6兼容性问题
移动网络对IPv6的支持可能存在差异,配置中监听了IPv6的443端口,但部分运营商的IPv6路由或解析存在故障。
- 临时测试:注释掉
listen [::]:443 ssl ipv6only=on;这一行,重启Nginx后用移动数据验证是否恢复正常。 - 长期处理:
- 检查EC2实例的IPv6配置,确保安全组、路由表已开放IPv6的443端口
- 若IPv6不是必须,可直接禁用IPv6监听,仅保留
listen 443 ssl;
2. 移动运营商SSL拦截/缓存
部分移动运营商会对HTTPS流量做中间拦截,导致证书验证失败或协议不兼容。
- 验证方法:用移动数据直接访问
https://api.example.com,查看浏览器显示的证书是否为Let's Encrypt官方证书,若显示运营商证书则说明存在拦截。 - 解决方法:
- 修复HSTS配置中的转义问题:将
"替换为双引号",确保浏览器能正确识别强制HTTPS规则:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - 调整加密套件:在现有套件基础上添加少量兼容移动设备的安全套件(如
AES128-SHA256),平衡兼容性与安全性 - 本地执行
openssl s_client -connect api.example.com:443,检查SSL握手过程是否存在异常
- 修复HSTS配置中的转义问题:将
3. DNS解析异常
移动数据的DNS服务器可能未正确解析api.example.com,或缓存了旧的IP记录。
- 验证方法:在移动设备终端执行
nslookup api.example.com,对比WiFi环境下的解析IP是否一致。 - 解决方法:
- 检查域名DNS记录(如Route53),确保A/AAAA记录指向正确的EC2实例IP,将TTL设置为300秒加速缓存更新
- 若使用第三方DNS服务,确认服务状态正常,无解析延迟
4. Nginx配置细节问题
- 证书权限检查:确认
/etc/letsencrypt/live/example.com/下的证书文件存在,且Nginx进程拥有读取权限 - 完善CORS配置:针对OPTIONS请求单独处理,避免移动数据下预请求失败,修改location块如下:
注意:开启location / { if ($request_method = OPTIONS) { add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; add_header Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type"; add_header Access-Control-Allow-Credentials "true"; add_header Access-Control-Allow-Origin "https://www.example.com"; add_header Content-Length 0; add_header Content-Type text/plain; return 204; } proxy_pass http://127.0.0.1:5000; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header Access-Control-Allow-Credentials 'true'; add_header Access-Control-Allow-Origin "https://www.example.com"; }Access-Control-Allow-Credentials时,Access-Control-Allow-Origin必须指定明确域名,不能用通配符
5. AWS网络规则限制
移动数据的IP范围可能未被EC2安全组或网络ACL允许访问443端口。
- 检查安全组入站规则:确保允许
0.0.0.0/0访问443(HTTPS)端口 - 检查网络ACL:确认入站、出站规则均允许443端口流量通行
内容的提问来源于stack exchange,提问作者pn1982
相关产品推荐
相关产品推荐

