Nginx+SSL 新型加密渠道配置方法

默认情况下Nginx增加了SSL数字证书后,在Chrome等浏览器中会出现过时的加密套件,本文主要是为了解决这个问题。

安装Nginx与申请SSL证书,请参考其他文献。

Debian 下 Nginx 配置文件地址:/etc/nginx/site-enabled/xxx

本文中没有特别说明的情况下,所有配置内容都加在server段中。

添加SSL配置

ssl on;
ssl_certificate_key /etc/ssl/cert/my_server.key;
ssl_certificate /etc/ssl/cert/my_server.crt;

禁用 SSLV2 与 SSLv3

SSL v2 以及 SSL v3 并不安全,因此我们需要禁用它。 当 TLS 1.0 遭受一个降级攻击时,可以允许一个攻击者强迫使用 SSL v3 来连接,因此禁用“向前保密”来禁止使用不安全的加密方式。

添加如下信息:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

选择密码套件

网络上推荐以下两个密码套件,后者来自 Mozilla 基金会。

推荐的密码套件:

ssl_ciphers 'AES128+EECDH:AES128+EDH';

推荐的密码套件向后兼容(IE6 / WinXP):

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;
ssl_session_cache shared:SSL:10m;

在SSLv3或这是TLSv1握手时选择一个密码,通常是使用客户端的偏好。如果存在这两条配置,那么会强制使用服务器的偏好。

提升DHE的安全性

因为Nginx默认使用的DHE加密级别偏低,我们需要产生一个更强的DHE参数:

cd /etc/ssl/certs
openssl dhparam -out dhparam.pem 4096

然后告诉nginx在DHE密钥交换的时候使用它,添加以下内容:

ssl_dhparam /etc/ssl/certs/dhparam.pem;

开启HTTP Strict Transport Security

添加以下内容:

add_header Strict-Transport-Security max-age=63072000;

该功能会导致浏览器自动对你的站点访问时,自动使用https协议,无视用户输入。如需保留http访问,请勿添加该条目。

配置示例

server {

  listen [::]:443 default_server;

  ssl on;
  ssl_certificate_key /etc/ssl/cert/my_server.key;
  ssl_certificate /etc/ssl/cert/my_server.crt;

  ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL';

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_session_cache shared:SSL:10m;

  ssl_stapling on;
  ssl_stapling_verify on;

  ssl_prefer_server_ciphers on;
  ssl_dhparam /etc/ssl/certs/dhparam.pem;

  add_header Strict-Transport-Security max-age=63072000;
  add_header X-Frame-Options SAMEORIGIN;
  add_header X-Content-Type-Options nosniff;

  root /var/www/;
  index index.html index.htm;
  server_name my_server.me;
}

重启Nginx

# 先检查配置文件:
service nginx configtest
# 重启:
service nginx restart

可以使用 SSL 实验室测试(SSL Labs tes)看看你是否得到一个漂亮的A。(本站拿了A+)

引用参考:
1.加强 Nginx 的 SSL 安全
2.Certificate Installation: NGINX