HTTPS 和 Let’s Encrypt、Certbot 的关系
其实 HTTPS 只是 HTTP 的一个拓展,是在 HTTP 的基础上利用 SSL/TLS 来加密数据包的。服务器会给客户端发送一个 Server certificates(服务证书),这个里面包含有服务器的一些信息,如域名、公司信息、序列号和签名信息组成等,这个证书可以个人生成,也可以由权威机构签发,当然个人的就不受大众信任,而权威机构签发的证书则会被信任。
而 CA 的证书提供商有许多个,有收费的有免费的,Let’s Encrypt 就是其中之一的免费提供商,它提供 90 天的免费授权,90 天后可以免费续签。要从 Let's Encript 获取某个域名的证书,需要证明你对该域名拥有控制权,对于该证明你可以使用某个使用 ACME 协议的软件来实现,而 Certbot 就是官方出的一个 ACME 客户端。
Certbot 安装
官网: https://certbot.eff.org
官方安装文档: https://certbot.eff.org/lets-encrypt/centosrhel7-nginx
Certbot 打包在 EPEL Enterprise Linux(企业版 Linux 的扩展包)上。使用 Certbot,必须先开启 EPEL 仓库。
在 RHEL 或 Oracle Linux 中,还要必须开启可选频道。可以执行如下命令安装 Certbot
sudo yum install epel-release
sudo yum install certbot
其实到这步 certbot 就算安装好了
生成证书
我们需要配置 Nginx 来做服务器域名验证,因为 CertBot 的 standalone 模式虽然可以配置好服务器,但是每次 90 天到期续签的时候,需要让服务停止一下,再启动。因此我们改用 Webroot 配置模式来验证,Webroot 配置模式下 CertBot 会生成一个随机文件,然后 CertBot 服务器通过 HTTP 的方式访问我们服务器上的这个文件进行验证。所以我们需要配置好 Nginx,以便 CertBot 服务器可以访问到这个随机文件。
修改 Nginx 配置,新增一个 server 模块:
server {
listen 80;
server_name your.domain.com; #这里填你要验证的域名
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /usr/share/nginx/html/; #这里需要与后文 --webroot -w 后面配置的路径一致
}
}
ok,重启 Nginx
sudo service nginx reload
然后执行
sudo certbot certonly --webroot -w /usr/share/nginx/html/ -d your.domain.com
记得替换 your.domain.com 为你自己的域名。
如果看到有提示:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/your.domain.com/fullchain.pem. Your cert
will expire on 20XX-09-23. To obtain a new or tweaked version of
this certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
证书生成成功!
接着可以开始启用 443 端口
修改 Nginx 的配置文件,新建一个 443 端口的 server 配置:
server {
listen 443 ssl;
listen [::]:443 ssl ipv6only=on;
ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/your.domain.com/chain.pem;
// ... other settings ...
}
记得替换 your.domain.com 为你自己的域名哦。
重启 Nginx
sudo service nginx reload
这时候的网站基本完成免费 HTTPS 证书的设置。成功!
删除证书
如果因为种种原因不小心生成了多余的证书,他会存在于我们的服务器中,导致无用的冗余。可是官方其实并没有提供取消授权的方式,我们可以在本地删除授权证书,并且不再续签,便可以释放该证书了,我们需要进入对应的文件夹内,查看自己已经生成的证书域名文件夹,然后依次删除就好,记得替换 your.domain.com 为你要删除的域名哦:
cd /etc/letsencrypt/live/
ls
sudo rm -rf /etc/letsencrypt/live/your.domain.com/
sudo rm -rf /etc/letsencrypt/archive/your.domain.com/
sudo rm /etc/letsencrypt/renewal/your.domain.com.conf
设置自动更新
由于这个免费证书的时效只有 90 天,所以我们需要设置自动更新,帮我们自动更新证书的时效。
自动更新可以使用 Linux 系统的 cron 定时任务功能,CentOS 可以使用 crontab 命令
我们先命令行模拟证书更新:
sudo certbot renew --dry-run
如果有提示下面的内容,表示模拟更新成功
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/your.domain.com.conf
-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates below have not been saved.)
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/your.domain.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
** (The test certificates above have not been saved.)
那么,我们就可以使用crontab -e的命令来启用自动任务,命令行:
sudo crontab -e
然后会打开打开定时任务配置文件,我们可以按i
进入编辑模式,然后输入:
30 2 * * * /usr/bin/certbot renew >> /var/log/le-renew.log
上面的执行时间为:每天凌晨2点30分执行renew任务。
现在可以在命令行执行/usr/bin/certbot renew >> /var/log/le-renew.log看看是否执行正常,如果一切OK,那么配置就成功了!大发!
定时任务时间设置
关于定时任务时间的设置,这里可以简单介绍下,定时任务格式如下:
* * * * * command
分钟(0-59) | 小时(0-23) | 日期(1-31) | 月份(1-12) | 星期(0-6,0代表星期天) | 命令 |
---|---|---|---|---|---|
* | * | * | * | * | command |
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。
整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。
用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。
正斜线(/)可以用来指定间隔频率。在范围后加上 /< integer > 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。
开头为井号(#)的行是注释,不会被处理
使用实例
实例1:每1分钟执行一次command
* * * * * command
实例2:每小时的第3和第15分钟执行
3,15 * * * * command
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * command
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command
实例5:每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command
实例6:每晚的21:30重启smb
30 21 * * * /etc/init.d/smb restart
实例7:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例8:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb
0,30 18-23 * * * /etc/init.d/smb restart
实例10:每星期六的晚上11 : 00 pm重启smb
0 23 * * 6 /etc/init.d/smb restart
实例11:每一小时重启smb
* */1 * * * /etc/init.d/smb restart
实例12:晚上11点到早上7点之间,每隔一小时重启smb
* 23-7/1 * * * /etc/init.d/smb restart
实例13:每月的4号与每周一到周三的11点重启smb
0 11 4 * mon-wed /etc/init.d/smb restart
实例14:一月一号的4点重启smb
0 4 1 jan * /etc/init.d/smb restart
实例15:每小时执行/etc/cron.hourly目录内的脚本
01 * * * * root run-parts /etc/cron.hourly