本文将介绍一些SSL安全性的配置,以此提升网站的安全等级。先给出本博客的SSL配置: server { listen 443 ssl; server_name www.wonsikin.com; server_tokens off; # 中间证书 + 站点证书 ssl_certificate /home/webapp/ssl/wonsikin.chained.crt; # 生成证书的密钥 ssl_certificate_key /home/webapp/ssl/wonsikin.com.key; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 60m; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; access_log logs/wonsikin.log main; if ($request_method !~ ^(GET|HEAD|POST|OPTIONS|DELETE|PUT)$ ) { return 444; } location / { alias /home/webapp/wonsikin/; index index.html; } } 说明掩藏NGINX版本号隐藏NGINX版本号可以增加黑客利用该版本已知的漏洞来攻击服务器的代价。 server_tokens off; 禁用不安全的HTTP方法TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的方法。但是一般很少用到,而且容易引发XST(Cross-Site Tracing,跨站追踪)攻击。 if ($request_method !~ ^(GET|HEAD|POST|OPTIONS|DELETE|PUT)$ ) { return 444; } 以上配置表明服务器会对GET、HEAD、POST、OPTIONS、DELETE、PUT返回444的状态码,444 是 Nginx 定义的响应状态码,会立即断开连接,没有响应正文。 openssl心血漏洞(Heartbleed) 是一个于2014年4月公布的 OpenSSL 加密库的漏洞,它是一个被广泛使用的传输层安全(TLS)协议的实现。无论是服务器端还是客户端在 TLS 中使用了有缺陷的 OpenSSL,都可以被利用该缺陷。 升级服务器安装的 openssl 到最新版本可以避免这个漏洞。 加密套件设置更健壮的加密套件(cipher suite)来尽可能启用前向安全性(Forward Secrecy)。前向安全性(Forward Secrecy)用于在长期密钥被破解时确保会话密钥的完整性。PFS(完备的前向安全性)是指强制在每个/每次会话中推导新的密钥。 如何设置可以参考 Cipherli.st - Strong Ciphers for Apache, nginx and Lighttpd这个网址。 推荐的 ssl_ciphers 设置如下: ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; 同时,确保也添加了如下的配置: ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 60m; TLS 会话恢复的目的是为了简化 TLS 握手,有两种方案:Session Cache 和 Session Ticket。他们都是将之前握手的 Session 存起来供后续连接使用,所不同是 Cache 存在服务端,占用服务端资源;Ticket 存在客户端,不占用服务端资源。另外目前主流浏览器都支持 Session Cache,而 Session Ticket 的支持度一般。 TLS握手过程中选择一个加密算法时,一般使用客户端的首选算法。如果设置了上述配置,则会替代地使用服务器端的首选算法。 SSL协议SSLv2 已被证实是不安全的,同时因为 TLS 1.0 在遭受到降级攻击时,会允许攻击者强制连接使用 SSLv3,从而禁用了前向安全性(forward secrecy)。所以 ssl_protocols 的配置如下: ssl_protocols TLSv1 TLSv1.1 TLSv1.2; OCSP Stapling当客户端连接到服务器的时候,客户端会使用 Certificate Revocation List(CRL) 或者 Online Certificate Status Protocol(OCSP)记录 校验服务器证书的合法性。 CRL 的问题是证书吊销列表已经变得很大,下载太费时。 OCSP 相比之下就比较轻量级,因为一次只检索一条记录。但是副作用就是客户端连接服务器的时候, OCSP 请求必须发送到第三方 OCSP响应器(OCSP responder) ,这就可能会存在请求失败的隐患。实际上,证书颁发机构运转的OCSP响应器经常是不可靠的,以至于当浏览器没有及时收到响应的时候就会静默失败。 解决方法是在TLS握手的时候允许服务器发送缓存的 OCSP 记录,以此绕过OCSP响应器。这种机制就叫做 OCSP Stapling ,它省掉了客户端和OCSP响应器之间的一个交互。大部分服务器会缓存OCSP响应将近48小时,然后在快过期的时候会连接到OCSP响应器检索最新的OCSP纪录。 在NGINX中增加一下配置来启用 OCSP Stapling : ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; 要使 OCSP Stapling 正常工作,需要知道服务器证书颁布者的证书。如果在 ssl_certificate 文件中没有包含中级证书( intermediate certificates),需要在 ssl_trusted_certificate 文件中服务器证书颁布者的证书。 ssl_trusted_certificate /etc/ssl/certs/domain.chain.stapling.pem; 可以使用以下命令测试 OCSP Stapling 是否正常: openssl s_client -connect example.org:443 -tls1 -tlsextdebug -status 以上的配置就能够保证你的网站在 SSL Server Test (Powered by Qualys SSL Labs) 中的测试得到 A 的评分。 (责任编辑:IT) |