我在客户端看到一些奇怪的 SSL 握手失败。我们有一个自定义的 Web JS 应用程序,只能通过带有较旧 Webkit 的浏览器访问(如 Epiphany 中的浏览器)。来自客户端的所有请求都来自同一浏览器(版本和类型)。
以下是症状:
a.)客户端浏览器显示SSL握手失败:
- 如果重新加载网页,错误仍然存在
- 如果浏览器会话被终止并且新会话被加载,错误就会消失
b.) 在 nginx 错误、syslog 或 openssl 日志中未发现 SSL 错误
c.) 在 tcp dump 中我看到一些奇怪的偶尔的 SSL 握手错误:
- 列表项错误证书状态响应
- 无证书
- 内部错误
d.) 我们正在使用 Let's encrypt SSL 证书
即nginx.conf:
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2;# 放弃 SSLv3,参考:POODLE
ssl_prefer_server_ciphers开启;
nginx 充当代理,将所有 http 流量重定向到 https
已启用站点:
服务器 {
listen 80; server_name srv_name; return 301 https://$host$request_uri;
}
服务器 {
listen 443; server_name srv_name; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; ssl on; ssl_certificate fullchain.pem_path; ssl_certificate_key privkey.pem_path; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; location /robots.txt { alias /opt/robots.txt; } location /.well-known/ { alias /usr/share/nginx/html/.well-known/; } location / { proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://localhost:8000/; break; }
}
f.)基本流程:
- 客户端浏览器打开 http URL 并获取 301 重定向到 https
- js 应用程序定期进行 ajax 调用(我怀疑这些调用也会由于 SSL 握手失败而随机失败,因为 HTTP 响应代码等于 0)
- 如果 ajax 调用返回 http 响应代码 0,则页面重新加载(location.reload()),通常导致客户端浏览器中出现 SSL 握手失败消息。
g.) 迁移到新服务器后开始出现问题(从 Ubuntu 14.04 lts(openssl 1.0.1f 2014 年 1 月 6 日)到 Ubuntu 16.04 lts(1.0.2g 2016 年 3 月 1 日)应用程序和客户端浏览器版本保持不变。
您知道下一步该看哪里吗?为什么这种情况不是在客户端打开 URL 时总是发生,而是偶尔发生。