Nginx 配置 SSL 实现 HTTPS 连接

配好了镜像,还想尝试一下玩一下SSL。

现在(2015-08)国内有 WoSign 可以提供免费的SSL证书(https://buy.wosign.com/free/

国外的话 Cloudflare(以下简称CF) 也不用介绍了,如果使用FlexSSL,不用在服务器上重新设置(https://www.cloudflare.com/

不过 目标是直连服务器也能加密的Valid SSL Certificate,也就是CF中的Strict,也就是说从服务器到CF服务器到Client都是SSL加密的。

Cloudflare SSL三种方式:

cloudflare-SSL_04

OK,开工。

首先在WoSign注册

填好域(多个换行输入)名输入验证码,第一次使用的话,会顺带注册账号信息

Screen Shot 2015-08-20 at 18.16.26

验证域名

系统自动挑选邮箱,可以使用邮件认证。也可以使用往根目录下存放文件的形式。

选择生成方式

这里有两种选择,可以自己生成证书然后上传CSR文件签名,也可以全部交给WoSign。

  • 如果是在线生成
    比较方便 直接生成完,就可以下载压缩包,压缩包解压密码就是在网站填写的密钥;

  • 如果选择上传

    1
    2
    openssl genrsa -out privkey.key 2048
    openssl req -new -key privkey.pem -out cert.csr

    然后cat出cert.scr填入上传即可。

下到zip文件解压,里面有提供给不同服务端用的证书,这里我们选择For Nginx,上传至服务器

Screen Shot 2015-08-20 at 18.34.58

服务器端解压,存放于安全目录下

配置Nginx

  • 打开443的Server,填入server_name

  • 指定好crt、key文件路径,这里为什么是.unsecure文件,下面会讲到。

  • 禁用SSLv3,添加下行:

1
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Screen Shot 2015-08-20 at 18.56.58

完整配置参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
listen 443 ssl;
server_name *.example.com example.com;

ssl on;
ssl_certificate /root/ssl/1_example.com_bundle.crt;
ssl_certificate_key /root/ssl/2_example.com.key.unsecure;

ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

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";

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

resolver 8.8.4.4;
location / {
google on;
google_scholar on;
# root html;
# index index.html index.htm;
}
}

关于SSL安全性的问题,参考:

  • http://netsecurity.51cto.com/art/201408/447473.htm
  • http://www.oschina.net/translate/strong_ssl_security_on_nginx

其实到这里已经配置好了,可以重启Nginx

1
/opt/nginx-1.7.8/sbin/nginx -s reload

每次启动要输入密钥,为了避免麻烦,使用OpenSSL工具去掉密码

1
openssl rsa -in 2_example.com.key -out 2_example.com.key.unsecure

OK,修改下Nginx配置里的文件路径吧

重启Nginx,测试

https://sslanalyzer.comodoca.com/
从这个网站可以看到SSL应用情况。

直连:

Screen Shot 2015-08-20 at 18.13.54AE9F4001-C97D-46D9-805E-332548BE669C

CloudFlare Strict:

Screen Shot 2015-08-20 at 18.42.36Screen Shot 2015-08-20 at 18.43.57

嗯,搞定SSL了