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

《Nginx+SSL 新型加密渠道配置方法》上有8条评论

    1. 加密套件类型基本只受ssl_ciphers属性影响。
      不过为了避免被降级攻击,还需要添加一下属性。
      ssl_prefer_server_ciphers on;
      ssl_session_cache shared:SSL:10m;

      并且把DHE提升至更高级别。

  1. Hey There. I found your blog using msn. This is a really well written article.
    I’ll make sure to bookmark it and return to read more of your
    useful info. Thanks for the post. I’ll definitely comeback.

  2. Hello! This post could not be written any better! Reading this post
    reminds me of my previous room mate! He always kept talking about this.
    I will forward this post to him. Fairly certain he will have a good read.

    Thanks for sharing!

发表评论

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