https接口在手机上无法正常访问的解决方案

376 阅读3分钟

问题描述

前阵子在写自己的网站的时候遇到了一个非常奇怪的现象。

我的网站域名为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,最后成功实现。

image.png