前言
之前的文章《NexT主题设置Valine评论系统邮件提醒》介绍了如何在Next主题中配置使用评论邮件提醒。其中主要介绍了一个由zhaojun1998提供的Valine-Admin邮件提醒系统。
由于之前本博客站点是部署在coding上的,并且配置了https的方式,所以在Valine-Admin中也是使用了https方式的请求方式。
而后来coding的黄金会员到期后,coding的静态 Pages服务就有coding的广告,而且导致Google收录无法验证本站点。所以重新购买了台ECS,将站点换到ECS上。而评论系统中使用了https,所以就打算将本站点配置成https的访问方式。
查阅了一些资料后,发现收费的SSL提供商收费基本是按 数千/年收费的,这就太昂贵了啊,所以最终决定使用Let’s Encrypt提供的免费SSL证书。虽说该证书只有90天有效期,但是可以设置定时任务进行更新。
本篇就记录下Let’s Encrypt的配置过程。
固件信息
服务器提供商:阿里云
系统:CentOS Linux release 7.5.1804
web服务:nginx/1.12.2
本地环境:Mac 10.13.6
博客站点:hexo
配置过程
在讲解配置过程前,先提醒大家将ECS磁盘创建快照,以便在配置出错且不知道如何恢复时可以方便地将系统回退。
创建快照的入口在:进入ECS实例详情 -> 点击左侧“本实例磁盘” -> 右侧磁盘列表上的“创建快照”按钮,即为该磁盘创建快照(备份)。
接下来就具体介绍Let’s Encrypt相关的内容了。
certbot官网操作流程
SSL服务商Let’s Encrypt提供了通过certbot脚本申请证书的方式。
certbot官方地址为 https://certbot.eff.org/,Centos7+Nginx的配置方式地址为: https://certbot.eff.org/lets-encrypt/centosrhel7-nginx。也可以通过上面的地址选择对应的web服务和系统的配置方式。
按照官方提供的通过yum
命令进行安装的方式,一直无法运行certbot --nginx
,主要有如下问题:
- ImportError: No module named ‘requests.packages.urllib3
- DistributionNotFound: The ‘urllib3<1.23,>=1.21.1’ distribution was not found and is required by requests
依照上述issues中的结局方式,都无法解决该问题。最终只得通过先前创建的快照进行回退,使用了pip
命令进行安装并成功配置。
pip安装
安装certbot
1
pip install certbot
安装certbot的nginx插件
1
pip install certbot-nginx
自动配置nginx
1
certbot --nginx
输入该命令后,会进行一些交互。
- 提示输入邮箱,该邮箱会收到ssl证书到期的邮件,所以请正确填写
- 许可信息确认,貌似输入
A
就可以了,A
表示agree,即同意他们的许可信息 - 提示是否将邮箱地址公开给Let’s Encrypt的相关组织,以便收到他们的一些邮件信息
- 会显示nginx当前已经配置的域名信息,不输入直接按回车键则表示列出的所有域名都配置成https方式;或者输入域名前面的序号并用空格或
,
进行分隔,则表示仅对选择的域名站点进行https配置 - 提示 是否将当前的http请求重定向为https请求,
1
:不重定向,2
:重定向。我是选了(输入)2
- 操作成功
这些交互,都有详细的提示,认真看,不难理解。
这步之后,就可以使用https方式访问了。
注:
certbot --nginx
命令运行过程中会自动读取配置的域名信息和修改nginx配置信息(上述步骤4和步骤5),如果nginx配置信息中有中文存在(注释中有中文也不行),步骤4中输入完成后会报错直接结束,无法到步骤5,错误信息如下哦:1
certbot UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 2: ordinal not in range(128)
自动更新
certbot --nginx
命令运行成功后,即可进行自动更新的配置。
由于Let’s Encrypt证书有效期只有90天,所以配置自动更新还是很有必要的。
在配置之前需要运行如下命令进行是否可以配置自动更新的检测。
1 | certbot renew --dry-run |
如果出现如下内容,则表示测试成功。不懂的话就看有没有Congratulations
单词。
1 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
cetbot官网上提示可以使用cron job或者systemd timer方式设置定时任务进行更新。
systemd timer方式
进入/usr/lib/systemd/system
1
cd /usr/lib/systemd/system
编辑certbot.service文件,如果没有该文件
vim
会创建该文件1
vim certbot.service
复制并黏贴以下内容,保存
1
2
3
4
5
6[Unit]
Description=Let's Encrypt renewal
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet创建定时器文件
1
vim certbot.timer
复制并黏贴一下内容,保存(官方推荐一天两次执行,以确保证书可用,这里选择0/12点)
1
2
3
4
5
6
7
8
9
10[Unit]
Description=Twice daily renewal of Let's Encrypt's certificates
[Timer]
OnCalendar=0/12:00:00
RandomizedDelaySec=1h
Persistent=true
[Install]
WantedBy=timers.target激活定时器(设为开机启动)
1
systemctl enable certbot.timer
可以使用如下命令查看是否配置成功
1
2# systemctl is-enabled certbot.timer
enabledenabled
表示成功。启动定时
1
systemctl start certbot.timer
到这步就配置成了。
cron job方式
在centos7 上可以利用crontab 来执行计划任务, 依赖与 crond 的系统服务,这个服务是系统自带的,可以直接查看状态,启动,停止。
本ECS上systemctl status crond
命令显示crond.service服务处于活动状态。
1 | # systemctl status crond |
利用crontab
命令查看和设置定时任务。
crontab -u 用户名 -e
编辑用户的定时任务
-u :指定的执行的用户,默认为当前执行命令的用户
比如:
通过Linux终端(Terminal)编辑crontab文件
1
crontab -e
输入定时任务命令
1
2
3#官网上的提示定时任务
#会在每天0点和12点运行一遍
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew或者自定义的任务
1
2# 每月1号5时执行执行一次更新,并重启nginx服务器
00 05 01 * * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx
常用命令
更新证书(90天)
1 | certbot renew |
查看证书
1 | certbot certificates |
示例:1
2
3
4
5
6
7
8
9
10# certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: 证书名称
Domains: blog.nhtzj.com unlock.nhtzj.com www.nhtzj.com
Expiry Date: 2021-04-23 11:29:35+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/证书名称/fullchain.pem
Private Key Path: /etc/letsencrypt/live/证书名称/privkey.pem
可以看到当前机器所有域名的证书情况,包括域名、 到期日、证书路径、私钥路径四条信息。
新增域名
修改现有的证书,添加新的域名。
比如,你已经有一张域名是 www.nhtzj.com
的 SSL 证书,想添加unlock.nhtzj.com
,则可以使用下面的命令:
1 | sudo certbot --expand -d www.nhtzj.com,unlock.nhtzj.com |
域名之间要用逗号分隔。