优化 Nginx 的 HTTPS配置

作者: 麻辣阁 分类: wordpress 发布时间: 2018-11-30 13:33

dhparam

执行如下命令:

openssl dhparam -out /etc/letsencrypt/live/mylog.xyz/dh4096.pem 4096

修改 nginx配置文件, 加入:

ssl_dhparam             /etc/letsencrypt/live/mylog.xyz/dh4096.pem;

ssl_protocols和ssl_ciphers

SSLv3是有漏洞的,所以不应该启用这货,并启用启用向前保密, 配置 nginx:

    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256: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";

session resumption, 会话恢复

    ssl_session_cache shared:SSL:50m;
    ssl_session_timeout 10m;

ocsp stapling

对于一个可信任的 CA 机构颁发的有效证书,在证书到期之前,只要 CA 没有把其吊销,那么这个证书就是有效可信任的。有时,由于某些特殊原因(比如私钥泄漏,证书信息有误,CA 有漏洞被黑客利用,颁发了其他域名的证书等等),需要吊销某些证书。那浏览器或者客户端如何知道当前使用的证书已经被吊销了呢,通常有两种方式:CRL(Certificate Revocation List,证书吊销列表)和 OCSP(Online Certificate Status Protocol,在线证书状态协议).

  • CRL: CRL 是由 CA 机构维护的一个列表,列表中包含已经被吊销的证书序列号和吊销时间。浏览器可以定期去下载这个列表用于校验证书是否已被吊销。可以看出,CRL 只会越来越大,而且当一个证书刚被吊销后,浏览器在更新 CRL 之前还是会信任这个证书的,实时性较差。在每个证书的详细信息中,都可以找到对应颁发机构的 CRL 地址。
  • OCSP: OCSP 是一个在线证书查询接口,它建立一个可实时响应的机制,让浏览器可以实时查询每一张证书的有效性,解决了 CRL 的实时性问题,但是 OCSP 也引入了一个性能问题,某些客户端会在 SSL 握手时去实时查询 OCSP 接口,并在得到结果前会阻塞后续流程,这对性能影响很大,严重影响用户体验。(OCSP 地址也在证书的详细信息中)

OCSP Stapling 就是为了解决 OCSP 性能问题而生的,其原理是:在 SSL 握手时,服务器去证书 CA 查询 OCSP 接口,并将 OCSP 查询结果通过 Certificate Status 消息发送给浏览器,从而让浏览器跳过自己去验证的过程而直接拿到结果,OCSP 响应本身有了签名,无法伪造,所以 OCSP Stapling 既提高了效率也不会影响安全性。另外服务器有更好的网络,能更快地获取到 OCSP 结果,同时也可以将结果缓存起来,极大的提高了性能、效率和用户体验。

ssl_stapling on;

验证:

openssl s_client -connect mylog.xyz:443 -servername mylog.xyz -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"

验证成功的输出:

OCSP response:
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response

验证失败的输出:

OCSP response: no response sent

HSTS

HSTS(HTTP Strict Transport Security)国际互联网工程组织IETF正在推行一种新的Web安全协议,HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";

includeSubdomains为可选参数,如果你的子域名没证书,不要添加这个参数。max-age为过期时间,不要设置的过短。

有些配置有可能在 /etc/letsencrypt/options-ssl-nginx.conf 中已经写入了, 不需要重写.

SSL Server Test

可以在 https://www.ssllabs.com/ssltest/ 上测试, 搞到 A+ 吧!

最佳实践: SSL and TLS Deployment Best Practices

参考

nginx 的中文字符等可能导致的 letsencrypt 错误

Attempting to renew cert xxx from /etc/letsencrypt/renewal/xxx.conf produced an unexpected error: 'ascii' codec can't decode byte 0xe9 in position 2: ordinal not in range(128). Skipping.

执行如下命令, 并修改输出的提示行即可:

grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx

参考: UnicodeDecodeError

错误: 您的连接不是私密连接,攻击者可能会试图从 xxx.com 窃取您的信息

这有可能是你为同一域名的多个子域名设置了 Let’s Encrypt 证书,但更新证书的顺序有误导致的, 如你为 mylog.xyz, www.mylog.xyz 同时设置了证书, 并且后者会跳转到 mylog.xyz, 但是更新 Let’s Encrypt 证书时 www.mylog.xyz 放在了后面更新, 就会导致类似的问题,处理方式:

  • 先更新 www.mylog.xyz 的 Let’s Encrypt 证书
  • 在更新 mylog.xyz 的 Let’s Encrypt 证书即可

发表评论

电子邮件地址不会被公开。 必填项已用*标注