随机 SSL 握手失败

随机 SSL 握手失败

我在客户端看到一些奇怪的 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 时总是发生,而是偶尔发生。

相关内容