持续了1个多月的备案,今天收到短信终于下来了。

上篇水文,大概的记录了作为前端利用gitlab.com利用gitlab-ci开启CI自动部署。前端的gitlab的ci初尝试。这篇文章就要开始记录下我如何开启https。

什么是https?

https 是什么,不是本文的重点,直接跳过,https 的好处在这里也不仔细讲。

什么是 Let’s Encrypt?

部署 https 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 https 协议的使用。Let’s Encrypt 也是一个 CA 机构,但这个 CA 机构是免费的!!!也就是说签发证书不需要任何费用。

什么是全站https,也就是通配符证书?

域名通配符证书类似 DNS 解析的泛域名概念,通配符证书就是证书中可以包含一个通配符。主域名签发的通配符证书可以在所有子域名中使用,比如 .example.com、bbs.example.com、bbs.example.com。 2018 年 3 月 14 日,Let’s Encrypt 对外宣布 ACME v2 已正式支持通配符证书。这就意外味着用户可以在 Let’s Encrypt 上免费申请支持通配符的 SSL 证书。以前配置子域名也是需要每个域名单独的申请证书的,意思是现在可以直接用*.example.com这个证书,让全站实现https。

下面本文就简单的记录了我开启全站https的步骤,10分钟就能搞定,首先从blog子域名开始。

开始配置

准备工作

1
2
1. 一个顶级域名:peiqixin.com  # 我这里用的是
2. 一台自己的云服务器 # 我这里用的是我的那个小水管,之前在腾讯云撸的羊毛,6年360块钱的服务器,我这里服务器的系统用的是ubuntu

下面的所有操作都是在你的服务器上面,(我的服务器系统是ubuntu 16.04),其他的系统的操作也差不多。

添加一个blog域名解析

下载Nginx

安装 nginx 。如果你已经安装可以跳过这步。

1
2
sudo apt-get update
sudo apt-get install nginx

如果不会nginx的基本操作和基本配置,建议还是先去了解一下 nginx 的基本配置,比如如何的开启一个web服务器,nginx的基本操作和编写配置(不是必须)。

下载certbot客户端

1
2
3
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx

安装的时候一路 enter 就完事儿了。

获取 Let’s Encrypt certificate

cerbot 提供 nginx 配置以帮助我们重新配置我们以前的 nginx 配置,以便我们可以使用我们即将获得的 SSL 证书。

1
2
## 我的域名是peiqixin.com。这里要换成你要配置的域名
sudo certbot --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns --installer nginx -d *.peiqixin.com -d peiqixin.com

然后又是一路的确定选择确定就可以了。

但是请注意这一步,就暂时不要继续enter了

请把这段token复制下来。 打开你的域名提供商,就是你之前买域名的地方。添加一个域名解析。

记录选择 选择 TXT 主机记录填入 _acme-challenge 记录值就填入刚才你保存下来的token

点击保存之后,certbot客户端会去确定你是否在正确的添加了解析。

如果正确的添加了解析。 接下来

1
2
3
4
5
6
7
8
9
10
11
Which server blocks would you like to modify?
-------------------------------------------------------------------------------
1: File: /etc/nginx/sites-enabled/default
Addresses: [::]:80 default_server, 80 default_server
Names: _
HTTPS: No

...
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel):

将呈现nginx配置中的服务器块列表,供您选择要将证书部署到的服务器块。 反正我用不上,这里选择cancel,输入c,enter继续。

接下来

1
2
3
4
5
6
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.

这一步就是让你选择是否将http流量重定向到建议的https。既然是全站https,所有的访问都应该走https,选择2,enter。提供与前一阶段相同的列表,输入c,按enter继续。

接下来,当你看到下面的一段就表明你已经配置好了。

请把

1
2
/etc/letsencrypt/live/peiqixin.com/fullchain.pem
/etc/letsencrypt/live/peiqixin.com/privkey.pem

这2个地址记下来

配置nginx

1
sudo nginx -t

找到你的nginx配置文件的地址

1
sudo mkdir conf.d #创建一个配置nginx的目录,不可能把所有的配置写在一个文件里面,以后也不好维护

再在nginx的默认配置文件nginx.conf的http模块里面添加

1
include /etc/nginx/conf.d/*.conf;  #引入所有的配置文件

在conf.d文件夹里面创建一个index.conf,创建主配置文件负责监听80端口并转发请求。

1
2
3
4
5
server {
listen 80;
server_name peiqixin.com www.peiqixin.com blog.peiqixin.com;
rewrite ^(.*) https://$host permanent;
}

创建https配置文件。创建各域名配置文件监听443端口(可以按域名分开,也可以写一个文件里,我为了方便写在一个文件里)

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
server {
listen 443;
server_name peiqixin.com www.peiqixin.com;

ssl on;
ssl_certificate /etc/letsencrypt/live/peiqixin.com/fullchain.pem; ## 这个就是你配置certbot最后一步要你记录下来的地址
ssl_certificate_key /etc/letsencrypt/live/peiqixin.com/privkey.pem;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
root /home/ubuntu/blog; ##这里我用hexo博客生成器生成的静态html,js,css都放在了这个文件
index index.html index.htm;
}
}
server {
listen 443;
server_name blog.peiqixin.com;

ssl on;
ssl_certificate /etc/letsencrypt/live/peiqixin.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/peiqixin.com/privkey.pem;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
root /home/ubuntu/blog;
index index.html index.htm;
}
}

退出保存。检测一下nginx的配置是否有语法错误

1
sudo nginx -t

重启nginx

访问blog.peiqixin.com,就会看见

再访问peiqixin.com

都是自动的从http跳转到https。

接下来想要添加一个api.peiqixin.com域名为https。重复上面的第一步和最后一步,然后就可以在api.peiqixin.com域名旁边看到小绿锁。

更新证书

因为这个https证书是有3个月的期限的,差不多快到快要到3个月的时候,letsencrypt会发邮件给你,告诉你的证书快要过期。这个时候你就可以自己重新安排下证书了。 (你也可以写个定时脚本,但是那个不是本文的关注的地方,而且我也没写)

1
2
3
certbot renew
// 上面的指令我跑不成功,就换成下面的这条,等于说是重新的申请下证书,不用改配置,30秒就选择完了
// sudo certbot --force-renew

参考资料 1. certbot官网 2. how-to-deploy-wildcard-ssl-certificates-using-lets-encrypt 3. Nginx 配置多域名 http转https