SSL可以保护传输安全,它也有不同的安全等级。ssllabs.com有着一个相应的评级方案,可以评价服务器配置的SSL协议安全程度。想要得到A+的评级那么需要对服务器设置进行一些调整。下面以Nginx配置为例,通过添加下面的一些参数可以让SSL传输更加安全。
首先需要得到一个有效的SSL证书及其证书链。一般来说使用let’s encrypt, comodo等证书即可但是需要注意的是如果想要在Key Exchange评分中得到100分,则需要提供至少4096bit的证书。
Contents
选择特定的协议:
虽然Nginx默认的协议支持是完整的,但是我们需要排除一些不太安全的协议类型,尽管这样会不得不忽视一小部分用户,例如WindowsXP用户。他们需要通过已经不再安全的老旧协议进行连接。一般来说目前使用TLS1.0-1.2即可,如果要求安全程度比较高则可以只允许TLS1.2协议。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
选择密码类型:
这里也同样面临着兼容/安全的选择。在这里我选择AES256bit密码。值得注意的是,如果要加入更多密匙类型支持,那么就需要小心这些类型的排列,应当从最佳加密到最好的兼容排列。
ssl_prefer_server_ciphers on; ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL;
或者希望提高兼容:
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"; ssl_prefer_server_ciphers on;
前向安全性的配置(Forward Secrecy)
前向安全性(Forward Secrecy)的概念:客户端和服务器协商一个永不重用的密钥,并在会话结束时销毁它。服务器上的 RSA 私钥用于客户端和服务器之间的 Diffie-Hellman 密钥交换签名。从 Diffie-Hellman 握手中获取的预主密钥会用于之后的编码。因为预主密钥是特定于客户端和服务器之间建立的某个连接,并且只用在一个限定的时间内,所以称作短暂模式(Ephemeral)。
如果使用前向安全机制,攻击者取得了一个服务器的私钥,他是不能解码之前的通讯信息的。这个私钥仅用于 Diffie Hellman 握手签名,并不会泄露预主密钥。Diffie Hellman 算法会确保预主密钥绝不会离开客户端和服务器,而且不能被中间人攻击所拦截。
默认状态下虽然nginx也使用这项加密但是会使用默认的1024密匙,因此我们应当替换成自己生成的
openssl dhparam -out dhparam.pem 4096
并且在nginx配置中加入
ssl_dhparam /your/path/to/dhparam.pem;
HTTP 严格传输安全(HSTS)(HTTP Strict Transport Security)
添加一个http报头给浏览器,那么接下来的有效期内,浏览器与服务器之间沟通则只会选择https,所有的http都会被自动重写到https协议。
# Enable HSTS add_header Strict-Transport-Security max-age=63072000; # Do not allow this site to be displayed in iframes add_header X-Frame-Options DENY; # Do not permit Content-Type sniffing. add_header X-Content-Type-Options nosniff;
配置 OCSP
连接到一个服务器时,客户端应该使用证书吊销列表(CRL)或在线证书状态协议(OCSP)记录来校验服务器证书的有效性。为了防止申请超时,我们允许服务器在 TLS 握手中发送缓存的 OCSP 记录,以绕开 OCSP 响应服务器。这个机制减少了客户端和 OCSP 响应服务器之间的通讯,称作 OCSP 装订。
ssl_stapling on; ssl_stapling_verify on; resolver 8.8.4.4 8.8.8.8 valid=300s; resolver_timeout 10s;
那么最后添加的配置如下:
ssl on; ssl_session_tickets off; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; ssl_prefer_server_ciphers on; ssl_certificate /etc/ssl/website.com.crt; ssl_certificate_key /etc/ssl/website.com.key; ssl_dhparam /etc/ssl/dhparam.pem; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.4.4 8.8.8.8 valid=300s; resolver_timeout 10s; add_header Strict-Transport-Security max-age=63072000; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff;