签发 Let's Encrypt 证书指南,nginx添加ssl证书

为了进行科学上网,记录一下如何快速签发Let’s Encrypt的证书

环境

云服务器:CentOS 6
网站服务端:Nginx 1.16.0
签发证书域名:vps.dxysun.com

这里的vps.dxysun.com是我自己的域名,届时一定要修改为自己的域名。

Let’s Encrypt简介

Let’s Encrypt是一个由非营利性组织 互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。
简单的说,借助 Let’s Encrypt 颁发的证书可以为我们的网站免费启用 HTTPS(SSL/TLS) 。
Let’s Encrypt免费证书的签发/续签都是脚本自动化的,官方提供了几种证书的申请方式方法,点击此处 快速浏览。
官方推荐使用Certbot 客户端来签发证书,这种方式需要python3的支持,但我的服务器没有 安装python3,故未选用该方式。
我这里直接使用第三方客户端 acme.sh 申请,据了解这种方式可能是目前 Let’s Encrypt 免费证书客户端最简单、最智能的 shell 脚本,可以自动发布和续订 Let’s Encrypt 中的免费证书。

安装 acme.sh

1
curl https://get.acme.sh | sh

整个安装过程进行了以下几步,了解一下即可:
把 acme.sh 安装到当前用户的主目录$HOME下的.acme.sh文件夹中,即/.acme.sh/,之后所有生成的证书也会放在这个目录下;
创建了一个指令别名alias acme.sh=
/.acme.sh/acme.sh,这样我们可以通过acme.sh命令方便快速地使用 acme.sh 脚本;
自动创建cronjob定时任务, 每天 0:00 点自动检测所有的证书,如果快过期了,则会自动更新证书。

安装命令执行完毕后,执行acme.sh --version确认是否能正常使用acme.sh命令。

1
2
https://github.com/Neilpang/acme.sh
v2.8.2

如有版本信息输出则表示环境正常;如果提示命令未找到,执行source ~/.bashrc命令重载一下环境配置文件。

整个安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录~/.acme.sh/中。

生成证书

据 acme.sh 官方文档介绍,其实现了 acme 协议支持的所有验证协议,一般有两种方式验证:http 和 dns 验证。
也就是我们有两种选择签发证书,这里我直接选择 http 验证方式,另外一种方式本篇不做介绍,可参考文档自行尝试。
签发证书也很简单,一条命令:

1
acme.sh --issue -d vps.dxysun.com -w /var/nginx

这里的nginx部署目录为/var/nginx,具体设置方式参考centos6安装nginx

简单解释下这条命令涉及的几个参数:

1
2
3
--issue 是 acme.sh 脚本用来颁发证书的指令;
-d 是--domain的简称,其后面须填写已备案的域名;
-w 是--webroot的简称,其后面须填写网站的根目录。

证书签发成功后显示success,并输出证书地址。
我的证书放在了/root/.acme.sh/vps.dxysun.com目录下。

另外,可以通过下面两个常用acme.sh命令查看和删除证书:

1
2
3
4
5
# 查看证书列表
acme.sh --list

# 删除证书
acme.sh remove <SAN_Domains>

至此,证书就下载成功

安装证书

我的站点是由 Nginx 承载的,所以本节内容重点记录如何将证书安装到 Nginx,其他 webserver 请参考 acme.sh 文档自行实践。

上一小节,生成的证书放在了/root/.acme.sh/vps.dxysun.cn目录,因为这是 acme.sh 脚本的内部使用目录,而且目录结构可能会变化,所以我们不能让 Nginx 的配置文件直接读取该目录下的证书文件。

正确的做法就是使用--installcert命令,指定目标位置,然后证书文件会被 copy 到相应的位置。

一条命令即可解决:

1
2
3
4
acme.sh  --installcert -d vps.dxysun.com \
--key-file /etc/nginx/ssl/vps.dxysun.com.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"

这里我将证书放到了/etc/nginx/ssl/目录下,没有该目录的话请新建。

输出Reload success,则操作成功:

最后一步就是,修改 Nginx 配置文件启用 ssl

1
vim /etc/nginx/conf.d/default.conf

Nginx 监听443端口的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 443 ssl;
server_name vps.dxysun.com;

ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/vps.dxysun.com.key;

root /var/nginx;
index index.html;

location / {
try_files $uri $uri/ @router;
index index.html;
}

location @router {
rewrite ^.*$ /index.html last;
}
}

Nginx 监听80端口,并重定向至443端口:

1
2
3
4
5
server {
listen 80;
server_name vps.dxysun.com;
return 301 https://$server_name$request_uri;
}

或者

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

域名记得换成自己的
如果要二个都可以访问,不用单独配置这个server,直接在443下面新增一个80就可以了

修改完成后需要重启下 Nginx

1
service nginx restart

更新证书

目前 Let’s Encrypt 的证书有效期是90天,时间到了会自动更新,您无需任何操作。 今后有可能会缩短这个时间, 不过都是自动的,不需要您关心。

但是,您也可以强制续签证书:

1
acme.sh --renew -d vps.dxysun.com --force

更新 acme.sh

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。
升级 acme.sh 到最新版:

1
acme.sh --upgrade

如果您不想手动升级,,可以开启自动升级:

1
acme.sh  --upgrade  --auto-upgrade

您也可以随时关闭自动更新:

1
acme.sh --upgrade  --auto-upgrade  0

参考

快速签发 Let’s Encrypt 证书指南

打赏

请我喝杯咖啡吧~

支付宝
微信