博客配置Nginx,申请免费SSL证书

简单记录一下博客的Nginx配置文件,Let’s Encrypt 申请免费ssl证书。

Nginx的server配置

Nginx的常用命令

systemctl start nginx //启动nginx

systemctl enable nginx //设置开机自动启动

systemctl status nginx //查看运行状态,显示running表示成功运行

systemctl reload nginx //重新载入

systemctl restart nginx //重新启动

systemctl stop nginx//立刻停止运行nginx

nginx -t //测试配置文件

下面是俺Nginx的server配置,目录在 vi /etc/nginx/sites-available/default 里面,或者 vi /etc/nginx/nginx.conf 里面,各版本可能略有不同。

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
server {
# 这是IPv4和IPv6的80端口监听
listen 80;
listen [::]:80;
# 域名,可多填
server_name yeahwu.com;
# 网站根目录
root /var/www/blog;

access_log /var/log/nginx/blog_access.log;
error_log /var/log/nginx/blog_error.log;
error_page 404 = /404.html;
# 这是后端查看访问数据,比如 curl 127.0.0.1/nginx_status
location /nginx_status {
stub_status on;
access_log off;
}
# 这是http 301跳转到https
location / {
return 301 https://$server_name$request_uri;
}
}

server {
# 这是IPv4和IPv6的443端口以及HTTP2支持
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yeahwu.com;
root /var/www/blog;
# 这是HSTS的头部文件,本站已加入HSTS列表
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# 在检测到 XSS 时阻止网页加载
add_header X-XSS-Protection "1; mode=block";
# 禁止网页被嵌入 frame
add_header X-Frame-Options DENY;
# 申请的证书路径
ssl_certificate /etc/letsencrypt/live/yeahwu.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yeahwu.com/privkey.pem;

location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
root /var/www/blog;
access_log off;
expires 1d;
}

location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
root /var/www/blog;
access_log off;
expires 10m;
}

location / {
root /var/www/blog;
if (-f $request_filename) {
rewrite ^/(.*)$ /$1 break;
}
}
}

下面是开启TLSv1.3的方法,适用Nginx 1.13 以上的版本。

服务端定位到 vi /etc/nginx/nginx.conf 文件,TLSv1.2后添加TLSv1.3,就好了,如下:

1
2
3
4
# SSL Settings

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;

申请免费SSL证书

用Git获取 Letsencrypt

1
2
3
4
5
6
7
8
9
10
11
# 获取letsencrypt

git clone https://github.com/letsencrypt/letsencrypt

# 进入letsencrypt目录

cd letsencrypt

# 生成证书

./letsencrypt-auto certonly --standalone --email 你的邮箱 -d xxx.xxx(域名) -d www.xxx.xxx

注: 生成证书前请关闭服务器的Apache或Nginx,否则会生成失败。

在完成Let’s Encrypt证书的生成之后,我们会在/etc/letsencrypt/live/xxx.xxx/域名目录下有4个文件就是生成的密钥证书文件。

1
2
3
4
5
6
7
cert.pem -  used for OCSP stapling in Nginx >=1.3.7.

chain.pem - will break many server configurations, and should not be used without reading further documentation 

fullchain.pem - 在大多数服务器软件中使用的证书文件。

privkey.pem - 证书私钥

在Nginx环境下,那就需要用到fullchain.pemprivkey.pem两个证书文件,在部署Nginx的时候只要将对应的ssl_certificatessl_certificate_key路径设置成生成的2个文件就可以。

打开/etc/nginx/sites-available/default填入如下内容:

1
2
ssl_certificate /etc/letsencrypt/live/xxx.xxx/fullchain.pem; //xxx.xxx是你的域名
ssl_certificate_key /etc/letsencrypt/live/xxx.xxx/privkey.pem;

Let’s Encrypt免费SSL证书有效期为90天, 需要我们自己手工更新续期才可以。

1
2
3
4
5
6
7
systemctl stop nginx

cd letsencrypt

./letsencrypt-auto certonly --renew-by-default --email 你的邮箱 -d xxx.xxx -d www.xxx.xxx

systemctl start nginx

各类测试网站:

参考:

Bitcoin:1MQ3DJHnEdkP9scCiA1pGXTe9wyBmDtrvv