certbot 安装、使用教程,快速申请免费的SSL证书!
为了在网站上启用 HTTPS,我们需要从证书颁发机构(CA)获取证书(一种文件)。 市面上获取证书的方式还是挺多的,这次主要给大家介绍一个我平时比较常用的一种免费的方式:cerbot
操作环境
Ubuntu 22.04
Nginx
使用教程
1,安装Certbot客户端
sudo apt update sudo apt install certbot安装过程我就不放截图了,没什么特别的点,输入电子邮件地址,确认服务条款,一路确认即可。
2,获取免费证书
获取方式有好几种,我个人比较常用的是 standalone 和 nginx,几乎可以覆盖 99% 的使用场景了,区别就是要不要停 80 端口的占用。大家看情况选一个用就行了,具体如下:
2.1 standalone 模式
这是最简单的,如果你有子域名,就 -d 跟在后面。比如
certbot certonly --standalone -d example.com -d www.example.comexample.com换成你的域名即可。比如域名为 haha.com 那就是:
certbot certonly --standalone -d haha.com正常情况:如果顺利,证书和私钥会生成在这。就可以到下一步了。
2.2 nginx 模式
上面的方法很显然有个问题,那就是nginx 得停掉。如果是生产环境,肯定是不能接受的。certbot也提供了个插件,nginx。
安装:
apt update apt install -y python3-certbot-nginx然后执行:
certbot plugins看到nginx就OK了,然后我们执行生成证书命令:
certbot certonly --nginx -d example.com同理,有子域名就接着 -d www.example.com。
example.com 换成你的域名即可。比如域名为 haha.com ,然后有个子域名 ab.haha.com ,那就是 :
certbot certonly --nginx -d haha.com -d a.haha.com我以我的 vmeta.space 和 www.vmeta.space 为例:
2.3 异常情况:
如果没有成功,按我遇到的情况是有两种:
1. 第一种是报错什么 80端口被占用之类的。这种就只要把占用80端口的东西停了即可,我这边是nginx占用了。
systemctl stop nginx然后再去生成证书就可以了。
记得重启nginx :
systemctl start nginx2. 第二种是 报错 Connection refused 啥的(因为是临时想起来写的,所以现在也没有截图)
这时候你要检查一下,你的域名是不是解析到当前服务器。要用域名解析到的那台当前服务器搞这个。然后同样再执行生成证书命令就可以了。
两种模式都可以,最终看到Successfully就好了。然后记下证书位置。
3. 第三种是403。
这种情况有两种可能,
1,是如果你域名刚刚解析到某台服务器,或者子域名刚解析一条记录,那需要等个10来分钟再弄,等DNS同步。
2,是域名备案还没过。这个就是直接访问 http://你的域名,比如阿里云的就是这样:
其他厂商也同理。
3,验证证书
那申请了证书之后,我们可以验证一下证书:
openssl x509 -in /etc/letsencrypt/live/vmeta.space/fullchain.pem \ -noout -text | grep -A1 "Subject Alternative Name"-in 后面改成你的证书的路径就好了。运行之后如下:
可以看到DNS里面包含了我的vmeta域名+www.。说明OK了。
如果你申请了多个子域名,在一个证书内也可以看到多个:
4,配置Nginx开启HTTPS
现在我们需要在nginx配置一下。
找到你的nginx配置文件 nginx.conf,如果你是 apt 安装的 nginx,
那一般是在 /etc/nginx/nginx.conf
配置如下:配一下证书和私钥的位置。当然 你挪到其他地方也是可以的,记得对上位置即可。
server { listen 443 ssl http2; server_name jinmo-coder.cn www.jinmo-coder.cn; # 证书 ssl_certificate /etc/letsencrypt/live/jinmo-coder.cn/fullchain.pem; # 私钥 ssl_certificate_key /etc/letsencrypt/live/jinmo-coder.cn/privkey.pem; location / { root /var/lib/jenkins/workspace/codecabin/.vuepress/dist; index index.html index.htm; } }5,定时刷新证书(可选)
因为证书的有效期为90天,所以我们需要让这个证书自动去更新,通过执行以下命令,自动检查系统内的证书,并且自动更新这些证书。certbot提供了刷新证书的命令:
certbot renew --dry-run注意一下,这个证书的更新是按着你之前的申请方式来的。你可以通过这个命令来查询你原先是如何申请的:
grep authenticator /etc/letsencrypt/renewal/域名.conf如果你是 standalone,那么后续重新申请它也会用 standalone再申请一次。上面也提到了,这种方式80端口不能被占用。所以两个办法:
- 一个是你在certbot renew 的时候再关闭并重启一下nginx。
- 另一个就是你用nginx的方式再申请一遍这个域名的证书就好了。
然后说回重新申请证书,同样的你可以选择每过一段时间来执行一下。
也可以搞个定时任务Cron:
Cron 服务命令
# 查看服务状态 sudo service cron status # 开启服务 sudo service cron start检查服务状态,没有启用就开启服务
修改cron配置
crontab -e第一次使用要选择编辑工具 我们选择2。然后在文件的尾部添加需要的定时任务
# 每隔 两个月的 凌晨 2:15 执行 更新操作
15 2 * */2 * certbot renew# 检查定时任务是否生效 crontab -l
但是这里面可能会有点问题,就是上面说到的80端口被占用那个问题。那也可以选择执行脚本:
写个脚本:
vim /root/renew_cert.sh内容可以如下:
#!/bin/bash
systemctl stop nginx # 停止 Nginx
certbot renew # 更新证书
systemctl start nginx # 启动 Nginx
赋予执行权限:
chmod +x /root/renew_cert.sh上面第三步的renew就改成:
15 2 * */2 * /root/renew_cert.sh