HTTPS后报错ERR_SPDY_INADEQUATE_TRAN
最近我们的网站采用全站Https后,因为App有接入webview,有三星S7、华为G7、乐视1s的用户反馈app内的web出现ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY错误。
经过排查研究后发现是Nginx服务器需要设置ssl_ciphers;
Nginx默认设置是ssl_ciphers HIGH:!aNULL:!MD5;这样设置包含有最安全可靠版本的SSL/TLS的加密套件。但是对于低版本的浏览器或者浏览器本身使用的加密方式是其他的加密方式就会报出:ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY的错误;
在网上查到可以使用ssl_ciphers配置解决这个问题
EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
因为我们不想开这么多的配置,最后尝试使用
ssl_ciphers EECDH+AES128:HIGH:!aNULL:!MD5;
也解决了Android 下webview ERR_SPDY_INADEQUATE_TRANSPORT_SECURITY的错误
https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html 里有提到The recommended cipher suite for backwards compatibility (IE6/WinXP):
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
这样配置可以保证最大的兼容性,但是由于我们不需要向下兼容那么多,所以还是按需配置。
下面是一个ssl握手的过程,没有进行客户端验证:
1.C-S:ClientHello---cipher-suit-list
2.S-C:ServerHello---selected-cipher-suit
3.S-C:ServerKeyExchange
4.S-C:ServerHelloDone
5.C-S:ClientKeyExchange
6.C-S:完成
7.S-C:完成
CipherSuite,是在 SSL 握手中需要协商的很重要的一个参数。客户端会在Client Hello中带上它所支持的 CipherSuite 列表,服务端会从中选定一个并通过Server Hello返回。如果客户端支持的 CipherSuite 列表与服务端配置的 CipherSuite 列表没有交集,会导致无法完成协商,握手失败。
推荐配置参考:
cipherli Apache、Nginx、Lighttpd一些推荐配置。
cloudflare 推荐的的配置