HTTPS 即 HTTP over SSL/TLS。基本配置完成后,关键是选择合适的 cipher suite(密钥套件)。
可以用 SSL Labs 的 SSL Server Test 检测 Web 服务器的 TLS 配置是否安全,证书链是否可信、完整,浏览器兼容性如何等等。也可以用国内的 MySSL,增加了一系列国内浏览器和搜索引擎爬虫(“蜘蛛”)支持。
基本上,只要配置好 cipher suite 就能获得高评级。SSL Labs 有一份官方最佳实践 SSL and TLS Deployment Best Practices,推荐的 cipher suite 如下:
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES128-SHA
ECDHE-ECDSA-AES256-SHA
ECDHE-ECDSA-AES128-SHA256
ECDHE-ECDSA-AES256-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-SHA
ECDHE-RSA-AES256-SHA
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES256-SHA384
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES128-SHA
DHE-RSA-AES256-SHA
DHE-RSA-AES128-SHA256
DHE-RSA-AES256-SHA256
有时候这种“安全”不合时宜,比如需要增加 DES-CBC3-SHA 才能支持 IE8 浏览器。另外上面缺失 chacha20 系列 cipher suite。可以参考 MozillaWiki 的 Security/Server Side TLS 页面,在现代兼容、中等兼容、回退兼容三个层面,有比较详细的介绍。
可以在测试环境配置完毕,使用前面说过的工具进行检测,仔细查看各个浏览器的 TLS 握手成功状况。
如果想查看当前浏览器的 cipher suite 支持等信息,SSL Labs 和 MySSL 也有相应网页。而我更偏爱 ssl.haka.se,可以直观看出当前 TLS 连接的信息,更是支持 TLS 1.3 0-RTT(Early Data)检测。这个网页是开源的。
简单介绍就是这样。最后贴上我目前使用的 TLS 相关的 Nginx 配置,A+ 评级:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 2h;
ssl_stapling on;
ssl_stapling_verify on;
ssl_prefer_server_ciphers on;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256';
ssl_certificate /yourdir/cert.crt;
ssl_certificate_key /yourdir/cert.key;
ssl_dhparam /yourdir/dhparam.pem;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; # 请确保你理解 HSTS 再使用这行配置
草,工作上就遇到了兼容win7的加密套件问题,谷歌一下第二个就是熟悉的网站,绝了
testssl.sh 是命令行工具,也很好用。