Nginx启用HTTPS站点

随着互联网的发展,个人博客如雨后春笋般冒出头来
当你的网站启用 HTTPS 后,浏览器地址栏会有 HTTPS 的绿色小锁标志
本文会介绍如何为 Nginx 启用 HTTPS ,让你的站点上绿锁

SSL 证书

有关 SSL 可参阅维基百科传输层安全协议和阮一峰先生的SSL/TLS协议运行机制的概述
SSL 证书主要有两个功能:加密和身份证明,证书分为 DV/OV/EV 三种级别
免费证书为 DV 级别,常见的可靠免费证书CA有 Let’s Encrypt/AlphaSSL/TrustAsia/CloudFlare
推荐2种方便的申请免费证书的方式:


  1. 腾讯云申请
    输入域名,进行域名验证后稍等下就能拿到 TrustAsia 签发的证书,证书有效期为一年,到期后再来同样步骤申请
    此种方法相当适合小白
  2. 使用我的acme脚本申请
    证书有效期只有60天,但优势在于可以申请 ECC 证书

Nginx 配置

以本站的配置为例吼不吼啊

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
server {
listen 443;
root /home/Site/blog;
index index.html;
if ($host != 'www.nanqinlang.com') { return 404; }
access_log /home/Site/blog/access.log;
limit_conn perip 10;
server_name www.nanqinlang.com;
ssl on;
ssl_protocols TLSv1.2 TLSv1.3;
#TLS 协议,本站已支持TLS1.3
#TLS 1.3 开启方法详见 https://www.nanqinlang.com/nginx-with-tls1.3.html
#本站已启用 ECC/RSA 双证书
#双证书配置方式详见 https://www.nanqinlang.com/nginx-with-doublecrt.html
#Let's Encrypt的ECC证书
ssl_certificate /home/Site/blog/crt/LetsEncrypt/LetsEncrypt.cer;
ssl_certificate_key /home/Site/blog/crt/LetsEncrypt/LetsEncrypt.key;
#TrustAsia的RSA证书
ssl_certificate /home/Site/blog/crt/TrustAsia/TrustAsia.crt;
ssl_certificate_key /home/Site/blog/crt/TrustAsia/TrustAsia.key;
ssl_trusted_certificate /home/Site/blog/crt/TrustAsia/TrustAsia-OCSP.crt;
#HSTS策略:在max-age的时间内,如果遇到HTTP连接,就会通过307跳转強制使用HTTPS进行连接,并忽略其它的跳转设置(如301重定向跳转)
#这样当第一次以https方式访问我的网站,nginx则会告知客户端的浏览器,以后即便地址栏输入http,也要浏览器改成https来访问我的nginx服务器.服务器再也不管http转发到https这档子事了,由浏览器自己把http改名字为https再来请求服务器
#如果用户第一次访问是http,以后还是http,就是不用一次https,那我们岂不是一直不能HSTS生效了?所以这里再加个配置,在http/80站点的server下,添加https跳转配置.这样当用户访问http的时候,nginx就给他转到https上去,这样强制跳转的访问了一次https后,以后浏览器自己就往https上跳转了,节约了重定向.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
#减少点击劫持
add_header X-Frame-Options DENY;
#禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
#防XSS攻擊
add_header X-Xss-Protection 1;
#优先采取服务器算法
ssl_prefer_server_ciphers on;
#使用DH文件 迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)方案
#生成pem的方法: openssl dhparam -out dhparam.pem 2048
#上面的方式生成2048位pem,你也可以换成4096,像本站一样
ssl_dhparam /home/Site/blog/crt/dh.4096.pem;
#定义算法
#因为本站额外加入TLS1.3和双证书支持,算法定义比较特殊
ssl_ciphers "TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-CCM-SHA256:TLS13-AES-128-CCM-8-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5";
#下面这个是一般的单证书+tls1.2的加密方式
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
#OCSP缝合
ssl_stapling on;
ssl_stapling_verify on;
resolver 208.67.222.222 valid=300s;
resolver_timeout 5s;
#限制目录访问
location = /admin/ {
return 404;
}
}

检验

如此一来,配置就算是告一段落了
然后就可以在 ssllabs 测试自己的 SSL 评级了
以下为本站的 SSL 评级
本站的 SSL 评级