Nginx官网反向代理时配置SSL证书,需要enable ngx_http_ssl_module模块,且需要支持的openssl开发版,默认配置参数比较少,但是可以根据实际情况对性能及安全性做成优化,具体如下!
一、SSL参数具体优化(这里只填主要的)
1. ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
苹果APP只支持TLSv1.2,会优先使用TLSv1.2,考虑到客户端兼容性,其他2各也加上
2. ssl_certificate_key ssl/minminmsn.comsha256.key;
私钥,服务器加密使用
3. ssl_certificate ssl/minminmsn.comsha256.crt;
证书,客户端解密使用,服务器证书和中间证书合并到一个文件,不需要根证书;另外1.7.3版本增加了新指令ssl_password_file可以支持带密码的私钥
4. ssl_session_cache shared:SSL:10m;
会耗费一部分内存,1m可以同时保存4000个会话,10m理论支持4万个会话,注意这个改动后需要重启 nginx才会生效,nginx启动时会申请资源,一般分配后比较难修改,内存空间不足时老的会话自动清理用于新的会话
5. ssl_session_timeout 60m;
考虑到APP操作习惯及安全性暂定60分钟,这个默认5分钟,一般为30分钟到4小时,如果是网页形式可以时间更长一般不超过24小时,多了有安全隐患
6. ssl_prefer_server_ciphers on;
让服务器选择要使用的算法套件,这样避免客户端选择低安全的算法造成***
7. ssl_ciphers (共18个,ECDHE、DHE、AES开头个6个)
"ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384: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:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4 ";
这18个算法是通过TLS版本和考虑到安全和性能及各种客户端兼容性默认选择ECDHE-RSA-AES128-GCM-SHA256,另外向哪些已经确认不安全的算法(如MD5、RC4、DES)会直接拒绝防止***根据客户端兼容性来降级安全算法,这里是安全和性能的核心,需要长期关注定期更新。另外特别注意的是HTTPS里面耗时的有两个地方一个是网络方面的RTT就是延时,一个是密钥交换优化需要在这两个地方下功夫
二、重点注意事项
1. SHA256签名算法支持最少XPSP3和Android2.3版本
2. 服务器密码套件配置优先,这样更安全
3. AES可以和GCM已验证套件一起使用,建议TLS协议中只使用GCM套件,不使用CBC套件
4. 前向保密 ECDHE套件
5. 性能GCM套件是最快的
6. SNI服务器名称指示,2006年后才加入TLS中,支持一个IP绑定多个域名,但是域名过多,证书也会变大,通配域名理论上不能超过上百域名;另外SNI有的客户端不支持例如IE7.0以下、Windows XP、Mac OS版要求最低X 10.5.6,早期Android版本,Nginx 0.5.32及后续版本,Openssl0.98f(0.98j开始默认支持SNI)
7. 会话缓存,例如一个小时,Twitter为例,12小时会更新一次密钥36小时候删除
8. 分布式会话缓存,https使用ip_hash,保证同一个用户始终分配到统一服务器上
9. Cookie安全问题
10. HSTS可以解决不安全到Cookie,HTTPS stripping***,相同网站内的混合内容问题。HSTS可以禁止浏览器使用无效证书。最好效果是包括子域名
11. CSP,允许网站控制在HTML页面中嵌入的资源用什么协议来对抗XSS***
12. Openssl 1.0.1版本后开始支持,协议降级保护,使用Openssl最新库,性能明显优化,但是也不能盲目升级1.0.1版本后才出现心脏出血漏洞,1.0.2版本后会输出密钥强度,系统自带Openssl-1.0.1e版本,官网Openssl三大版本最新版本1.1.0c、1.0.2j、1.0.1u
13. 2010 Google数据TLS计算只占CPU负载的不到1%,每个连接只占不到10KB的内存,以及不到2%的网络开销
14. initcwnd初始拥塞窗口调优ip route change 59.151.116.115 route change initcwnd 10
15. net.ipv4.tcp_slow_start_after_idle = 0 改成0防止空闲时慢启动,HTTP长连接
16. 保持TCP连接时间越长,传输越快,有了长连接,可以最小化TLS开销,同时也提高了TCP性能。HTTP/1.1默认开启保持活动状态(keep-alive)
17. SNI 机制,解决server 单ip支持多host https
18. 尽早完成握手,cdn与客户端建立tls
19. 让服务器支持HTTP/2,Nginx 的版本需要大于1.9.5,同时OpenSSL的版本需要大于1.0.2j
20. Nginx不会对反向代理的后端做证书验证,当后端服务器是公网服务器就会有安全缺陷,Nginx 1.8.x版本后支持后端证书验证
21. 线上Tengine2.1.0版本(Nginx1.6.2),线上Tengine2.2.0版本(Nginx1.8.1)支持HTTP2.0,新版本出来20来天等稳定一段时间后再升级
22. HTTPS总共需要三个往返(TCP一个,TLS二个),RTT大约30毫秒的用户,HTTPS大约需要90毫秒完成连接建立,RTT要是比较大,这个建立连接的时间将会大得多
23. TLS建立连接的耗时对比:直接TLS连接设置3*90ms=270ms,通过CDN进行的TLS连接设置(使用连接池)3*5ms=15ms 用户到CDN节点RTT 5ms,CDN节点到服务器RTT 85ms,RTT为联合往返时间
24. TLS最大的成本除了延迟以外,就是用于安全参数协商的CPU密集型加密操作,即密钥交换,而密钥交换的CPU消耗很大程度上取决于服务器选择的私钥算法、密钥长度和密钥交换算法建议使用这个TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(百度,京东,阿里都是这个),由于按照服务器端优先级为准,这个算法应放在ssl_ciphers:ECDHE-RSA-AES128-GCM-SHA256第一位
25. 证书链里证书越少越好,这样速度更快、
26. TLS回使DsS***更加容易成本更低,安全风险少量的可以限制连接,大量的需要资源超配或第三方援助才行
27. HSTS考虑到客户端兼容性和目前没有全部域名HTTPS,现在没有开启,后续再开启
28. 默认站点可以对不正确域名的请求返回错误消息listen 443 ssl default_server;不需要配置server_name,所有未匹配的请求都会进入默认站点server_name “”;
29. 服务器集群且不希望部署共享票证密钥时,可以ssl_session_tickets off;这个从1.5.9版本开始支持,默认不配置就行集群总体上会话票证弊大于利
30. Http转Https最节省资源的配置方法 return https://$host$request_uri;
31. TLS缓冲区调优ssl_buffer_size默认16KB,减少TLS缓冲区大小,可以显著减少首字节时间例如配置1400字节,注意会降低吞吐量,访问量大且数据为图片等大数据时的域名不需要降低
32. TLS使用情况监控日志可以加变量$ssl_session_reused(1.5.10后支持),根据会话恢复率可以了解TLS会话缓存的工作性能,并设置TLS日志格式
33. log_format ssl “$time_local $server_name $remote_addr $connection $connection_requests $ssl_protocol $ssl_cipher $ssl_session_id $ssl_session_reused”;
34. Ssl日志位置也分开 access_log /data/ssllog/dom
原文地址:http://blog.51cto.com/jerrymin/2321548