我们常常在自己的服务器上搭建 Web 服务,但是大部分都使用的 HTTP 协议。在一些特殊的场景下,例如:微信小程序或是 APP 后台服务开发,则必须使用 HTTPS 协议。众所周知,HTTPS 可以在各个云服务厂商上购买,通过都需要高昂的费用,往往劝退很多初级的个人开发者。
但是如果你使用 Nginx、Apache 等服务器来运行服务,则可以使用 Certbot 来申请免费的 SSL 证书,轻松帮你实现 HTTPS 网站。申请 Let’s Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。
Let’s Encrypt 是由互联网安全研究小组(ISRG,一个公益组织)提供的服务,主要赞助商包括电子前哨基金会,Mozilla基金会,Akamai以及思科。
ISRG于2015年4月9日与Linux基金会宣布合作。
Let’s Encrypt 最初是由 Mozilla 的两名员工于2012年发起,2015年12月3日开启公测,2016年4月12日,该项目正式对外使用。
本文将记录 Centos 7.4 + Nginx + Certbot 为 blog.frankfeekr.cn 网站安装安全的 HTTPS 证书,并且实现到期自动续期。
1. 安装 Certbot
1 | yum install epel-release -y |
2. 申请证书
这里证书可以申请单域名或是泛域名证书。这里推荐大家申请泛域名证书申请,例如:*.frankfeekr.cn 域名证书申请后,即可用于该域名下的三级域名。即:blog.frankfeekr.cn / docs.frankfeekr.cn 等等三级域名都可以使用。
- 安装 python-certbot-nginx 插件
在生成证书的过程需要确保 Nginx 关闭,需要使用 80 端口执行。
在申请证书前需要先安装 certbot 的 Nginx 插件,如果执行 certbot --nginx
出现 The requested nginx plugin does not appear to be installed
,则需要先安装插件。
1 | yum install python-certbot-nginx -y |
(1)单域名证书
执行命令
1 | certbot certonly -d blog.frankfeekr.cn --nginx |
执行结果
1 | IMPORTANT NOTES: |
生成的证书会放在:/etc/letsencrypt/live/blog.frankfeekr.cn
目录下,目录证书说明如下:
1 | This directory contains your keys and certificates. |
(2)泛域名证书(推荐)
上面我们学会了生成单个域名证书,但是这里更推荐大家申请泛域名证书,方便在多个网站服务托管的时候共同使用。
执行命令
1 | certbot certonly --preferred-challenges dns --manual -d *.frankfeekr.cn --server https://acme-v02.api.letsencrypt.org/directory |
上面的命令执行到这里,会在命令行阻塞,这时候我们需要到域名解析的服务商添加一条 txt 的解析,如下图所示。
添加完解析后稍等几秒钟,即可回车继续,这时候就会校验记录是否有效。
至此:已经完成了泛域名的生成,生成的证书在:/etc/letsencrypt/live
目录下。相比于单域名的证书,泛域名步骤会稍微复杂一些,大家根据自己应用场景申请即可。
3. 安装 Nginx
如果已经安装了 Nginx 请直接跳过这一步
1 | yum install epel-release -y |
4. Nginx 证书配置
在 /etc/nginx/conf.d
目录下创建 blog.frankfeekr.cn.conf(文件名以 .conf
后缀,推荐使用域名命名方便管理)
1 | server { |
配置完证书后重启服务
1 | service nginx restart |
5. 自动续期
首先检查 crontab 服务是否运行
1 | systemctl status crond |
如果没有启动,先 enable 它再 start 它
1 | systemctl enable crond |
编辑计划任务
1 | crontab -e |
输入下面的表达式(每天 00:00:00),让他每天都尝试一次关闭 Nginx->更新->启动 Nginx,到了最后 30 天的时候就会成功。
1 | 0 0 * * * "service nginx stop ; /bin/certbot renew --renew-by-default; service nginx start" |
6. 访问 https 网站
点击访问:https://blog.frankfeekr.cn
证书查看:有效期是 90 天,待快到期则可以通过上述配置的定时任务来更新。
FAQ
-
证书重置请求超过次数,一般 3 次,子域名除外。就会出现如下错误,5 天以后才可以再次重置。
1
2An unexpected error occurred:
There were too many requests of a given type :: Error creating new order :: too many certificates already issu for exact set of domains: blog.frankfeekr.cn: see https://letsencrypt.org/docs/rate-limits/
参考链接
-
Let’s Encrypt - Free SSL/TLS Certificates
https://letsencrypt.org/ -
centos7+nginx+certbot+自动续期 - mntm博客
http://www.mntm520.com/post/48/ -
Web开发必知必会,如何使用 Letsencrypt 为网站签发 HTTPS 证书提供安全支持_如小非的博客-CSDN博客
https://blog.csdn.net/mrmengj/article/details/112983348 -
轻松搞定 Let’s Encrypt 免费SSL证书 | 张衡Henry
https://www.izhangheng.com/https-ssl-lets-encrypt-certbot -
Certbot - Centosrhel7 Nginx
https://certbot.eff.org/lets-encrypt/centosrhel7-nginx