问题描述
前阵子在写自己的网站的时候遇到了一个非常奇怪的现象。
我的网站域名为flowersink.com,为了藏公网IP又购买了一个域名为flowersink.cn用来作为接口地址(后来发现这个行为着实没必要)
其中两个域名都申请了阿里云的免费SSL证书,com域名已经通过了备案,cn域名则没有备案(接口地址我觉得不用备案)
网站在电脑端使用完全没问题,但在手机端却无法访问接口。
手机端调出控制台,浏览器报错:
An error occurred {"headers": {"normalizedNames": {}, "lazyUpdate": null, "headers": {}}, "status": 0, "statusText": "Unknown Error", "url": "https://www.flowersink.cn/blog", "ok": false, "name": "HttpErrorResponse", "message": "Http failure response for https://www.flowersink.cn/blog: 0 Unknown Error", "error": {"isTrusted": true}}
ERROR Http failure response for https://www.flowersink.cn/blog: 0 Unknown Error
使用苹果手机访问接口地址https://www.flowersink.cn/blog
,则页面会报错:
An SSL error has occurred and a secure connection to the server cannot be made.
使用安卓手机访问接口地址则是报错DNS解析失败
问题分析
虽然我的解决方案是采用了一个方法来避免这个问题,但我依旧对问题进行了研究和尝试。
以下尝试方法只是我使用后无效,不代表其他人无效哦。
为什么域名无法访问
因为我的服务器、两个域名都处于国内,所以无论是否将域名作为接口地址,都需要通过备案才可以正常访问。
为什么电脑可以正常访问而手机不可以
因为我在电脑使用的是谷歌浏览器,拦截并不严格(我自己也设置过,允许访问不安全网址)。
而手机端使用的Via、safari都具有严格的拦截机制。
如果在电脑端使用safari,同样无法正常访问。
做过哪些尝试
TLS协议配置
因为许多浏览器已经不再支持旧版本的TLSv1.1协议,所以需要在IGNIX配置中删掉
ssl_protocols TLSv1.2 TLSv1.3;
更新加密套件
由于浏览器一直在更新,如果加密套件过旧,也会被浏览器拦截,在IGNIX配置中修改
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
HSTS头配置
在IGNIX配置中添加
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
重新申请免费证书
因为我的cn域名使用的是阿里云免费证书pro,而com域名是免费证书
于是我给cn域名申请了com相同的免费证书,重新配置。
为cn域名申请let's Encrypt证书
由于cn域名并没有通过备案,DNS无法正常解析,自然过不了证书的授权。
解决方案
在通过和技术群里的大佬交流后,一位大佬说了一句“你为什么不用备案域名的泛域名来作为接口地址呢?例如api.xxxx.xxx”让我醍醐灌顶。
于是我为flowerink.com申请了Let's Encrypt证书,认证了*.flowersink.com域名,通过配置将接口反向代理至api.flowersink.com,最后成功实现。