Certbot 是Let’s Encrypt官方推荐的获取证书的客户端,可以帮我们获取免费的Let’s Encrypt 证书。Certbot 是支持所有 Unix 内核的操作系统的,个人博客的服务器系统是CentOS 7,这篇教程也是通过在个人博客上启用HTTPS的基础上完成的。
安装Certbot客户端
yum install certbot
获取证书
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com
这个命令会为 example.com 和 www.example.com 这两个域名生成一个证书,使用 --webroot
模式会在 /var/www/example
中创建 .well-known
文件夹,这个文件夹里面包含了一些验证文件,certbot 会通过访问 example.com/.well–known/acme–challenge 来验证你的域名是否绑定的这个服务器。这个命令在大多数情况下都可以
但是有些时候我们的一些服务并没有根目录,例如一些微服务,这时候使用 --webroot
就走不通了。certbot 还有另外一种模式 --standalone
, 这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。我们有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。
certbot certonly --standalone -d example.com -d www.example.com
证书生成完毕后,我们可以在 /etc/letsencrypt/live/
目录下看到对应域名的文件夹,然后在nginx文件下修改一下SSL证书的目录位置!
配置完这些过后,我们的工作还没有完成。 Let’s Encrypt 提供的证书只有90天的有效期,我们必须在证书到期之前,重新获取这些证书,certbot 给我们提供了一个很方便的命令,那就是 certbot renew
。 通过这个命令,他会自动检查系统内的证书,并且自动更新这些证书。 我们可以运行这个命令测试一下
certbot renew --dry-ru
n
如果在运行的时候出现了这个错误
Attempting to renew cert from /etc/letsencrypt/renewal/api.diamondfsd.com.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.
这是因为我的域名生成证书的时候使用的是 --standalone
模式,验证域名的时候,需要启用443端口,这个错误的意思就是要启用的端口已经被占用了。 这时候我必须把nginx
先关掉,才可以成功。果然,我先运行 service nginx stop
运行这个命令,就没有报错了,所有的证书都刷新成功。
或者我们可以使用crond 命令!
crontab -e
0 3 */7 * * /bin/certbot renew --renew-hook "/etc/init.d/nginx reload"
以上含义是:每隔 7 天,夜里 3 点整自动执行检查续期命令一次。续期完成后,重启 nginx 服务。
service crond restart
重启crond,使之生效