Nginx配置HTTPS简介

申请证书

于个人网站,建议使用Let’s Encrypt免费证书,目前Let’s Encrypt ACME v2 已正式支持通配符证书。 申请教程:Let’s Encrypt 免费通配符 SSL 证书申请教程

Nginx 配置证书

基础配置

证书申请好后,现在就开始配置了,示例配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
server {
    listen 443;
    listen [::]:443;
    server_name example.mango.im;

    ssl on;
    ssl_certificate /etc/nginx/ssl/example.pem;
    ssl_certificate_key /etc/nginx/ssl/example.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

    location / {
        proxy_pass http://localhost:12345;
    }
}

ssl_ciphers有一些弱加密,比较完整一个:

1
2
# Disable all weak ciphers
    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";

HSTS

以上配置了端口443,但一般情况下没有用户会直接输入https://,所以还是要配置80端口进行重定向

1
2
3
4
5
server {
    listen       80;
    server_name  example.mango.im;
    return 301 https://example.mango.im$request_uri;
}

这时访问example.mango.im即可跳转到https://example.mango.im,但这里还存在一个问题,聪明如你,对,当80到443跳转时依然可以被劫持、伪造。

所以这里介绍一下HSTS,什么是HSTS?

HTTP严格传输安全(英语:HTTP Strict Transport Security,缩写:HSTS)是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用HSTS策略,来让浏览器强制使用HTTPS与网站进行通信,以减少会话劫持风险.

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议(HTTP)响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。

比如,https://example.com/ 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:

在接下来的31536000秒(即一年)中,浏览器向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入 http://www.example.com/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://www.example.com/ 发送请求。 在接下来的一年中,如果 example.com 服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。

一般配置:

1
2
3
4
5
6
server {
    listen 443 ssl;
    server_name www.example.com;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

后记:后来本人使用acme脚本申请证书,多个域名配置总是出错。

certificate routines:X509_check_private_key:key values mismatch,发现不能使用同一个fullchain.cer,配置fullchain.cer需要使用当时申请的fullchain.cer,就酱!

参考

updatedupdated2018-09-062018-09-06
Load Comments?