问题描述:
谷歌浏览器
<a>标签下载静态文件 偶发出现 失败 - 证书有误情况。 SSL层 Certificate Unknown (46)错误。
环境:
https协议,nginx/1.15.12,谷歌浏览器版本73.0.3683.86
火狐验证,没有这个问题。
解决过程:
出现报错后,点击谷歌浏览器报错详情。跳转下面url。
https://support.google.com/chrome/?p=ui_download_errors&hl=zh-CN&ctx=35
里面只有 下载被阻止、网络故障,这类的错误。没有提到证书有误的情况。没有得到帮助。
查看服务器nginx配置,下载文件,nginx直接返回静态文件
location ~*^/(xxx)/(.*)\.(xlsx|txt)$ {
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_types application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
root /opt/xxx/xxxx;
}
查看了nginx日志,浏览器出现偶发报错时,请求没进来,没有报错,没有请求收到的日志。成功下载文件的时候,会正常出现请求日志。
发现访问站点其他url之后,证书有误报错消失。
下载文件用的是 html超链接。(vue环境)
<a :href="item.template.filePath" :download="item.template.fileName" class="link" target="_blank">
开始抓包定位问题。抓包看到,通过点击超链接
在三次握手后,ssl层报错
Level: Fatal (2)
Description: Certificate Unknown (46)
然后连接就断开了。
问题分析
这个报错是登录,或者点击链接一段时间后出现。也就是谷歌浏览器在页面访问后台一段时间后,在tpc/ip握手后,一段时间后会挥手断开。
问题应该是出在 ssl没有申请 安全的证书。正常访问页面,可以在页面点击允许建立不安全的ssl连接。在这次tcp握手后只要不断开,可以正常下载超链接的文件。
但是长时间不操作,tcp握手断开后,再进行文件下载,需要重新建立ssl连接。
文件下载,建立ssl连接的时候,用谷歌浏览器,会校验证书是否在安全机构登记过。不是安全证书就直接断开连接了。
然而火狐下载不会出现这个问题。所以应该是谷歌浏览器对<a>标签ssl证书校验比较严格的问题。
解决方法
--解决方法一
解决方法是使用了js方式来跳转。 window.open("下载资源的相对路径")。
但是这样,无法使用自定义的名字。超链接<a>属性在download属性中可以设置下载后修改的名字。。
--解决方法二
在谷歌浏览器 启动的快捷方式中 目标 加上 -ignore-certificate-errors
需要添加参数 --ignore-certificate-errors
如果谷歌浏览器安装路径带有空格, 右键快捷方式,进入属性, 在目标栏 如下加入参数
"C:\Program Files\Google Chrome\chrome.exe" --ignore-certificate-errors
如果路径没有空格,直接在后方添加
--ignore-certificate-errors
因为站点,没有申请签发认证的SSL证书,是自己给自己颁发的,所以在SSL认证的时候出现失败。所以第三方客户也认同第二种修改方式。不然需要花钱申请签发认证的SSL证书。