轻松获取 HTTPS 证书
#使用 certbot 自动签发证书
Certbot 是一个由 Electronic Frontier Foundation(EFF)开发的开源工具,可用于自动获取 SSL/TLS 证书。
直接使用以下命令安装 certbot
sudo apt install certbot
接着就可以使用 certbot 来签发证书了。
如果你的服务器是 Nginx,并且已经将域名解析到了服务器上,其中一个网站的根目录是 /var/www/webroot
,假设配置如下:
server {
listen 80;
server_name www.yourdomin.com;
root /var/www/webroot;
# 会在这个目录下创建一个 .well-known 目录,用于验证域名所有权
location ~ ^/.well-known/{
allow all;
}
# end
location / {
root /var/www/webroot;
index index.html index.htm;
}
}
那么就可以使用 certbot
来申请证书了,基本命令如下:
certbot certonly --webroot -w [网站根路径] -d [你的域名] -d [www.你的域名]
certonly
命令表示仅申请证书即可--webroot
表示使用 webroot 方式进行验证,也就是我们的网站根目录,此处就是我们准备好的/var/www/webroot
-d
参数表示要申请证书的域名,可以有多个,多个的话,这个证书就是覆盖这多个域名的
最终需要执行的命令以及输出如下:
certbot certonly --webroot -w /var/www/webroot -d www.yourdomin.com -d yourdomin.com
# 如果成功,输出如下:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for yourdomin.com
Using the webroot path /var/www/webroot for all unmatched domains.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/yourdomin.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/yourdomin.com/privkey.pem
Your cert will expire on 2024-04-25. 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
此时,证书已经申请好了。
上面输出中需要注意的是,证书的输出路径,如下:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/yourdomin.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/yourdomin.com/privkey.pem
Your cert will expire on 2024-04-25. To obtain a new or tweaked
上面打印了证书和私钥的路径,关于 letsencrypt 申请的证书,这里有一个要点:
- 有效的 fullchain.pem 始终是在
/etc/letsencrypt/live/[你的域名]/fullchain.pem
- 有效的 privkey.pem 始终是在
/etc/letsencrypt/live/[你的域名]/privkey.pem
接下来你可以将证书配置给你的nginx网站了。更改 nginx 配置,新增 ssl 的配置,完整版如下:
server {
listen 80;
listen 443 ssl http2;
server_name www.yourdomin.com yourdomin.com;
root /var/www/webroot;
#证书文件名称
ssl_certificate /etc/letsencrypt/live/yourdomin.com/fullchain.pem;
#私钥文件名称
ssl_certificate_key /etc/letsencrypt/live/yourdomin.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256';
ssl_session_tickets on;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=5184000"; # 60d
# 一键申请SSL证书验证目录相关设置
location ~ ^/.well-known/{
allow all;
}
location / {
root /var/www/site1;
index index.html index.htm;
}
}
如果只是为了用,下面内容可以不用了解。
相关配置解释如下:
listen 443 ssl http2
监听 443 端口,并启用 http2ssl_certificate
证书文件路径ssl_certificate_key
证书私钥路径ssl_protocols
支持的协议,现在认为安全的是TLS 1.2 和 TLS 1.3,更早的版本已经不推荐使用。ssl_ciphers
配置服务器支持的加密套件,上面的配置是GPT推荐的平衡安全性和兼容性的值。ssl_session_tickets
会话票据(服务端提供给客户端的),开启可以提供重复连接的效率,关闭则更安全。ssl_prefer_server_ciphers
配置服务器将优先使用自己的加密套件ssl_session_cache shared:SSL:10m
表示所有 worker 进程共享一个 10 分钟的缓存。ssl_session_timeout
配置 SSL 会话的超时时间,此处为 10 分钟。add_header Strict-Transport-Security "max-age=5184000"
表示启用 HSTS,强制客户端只使用 HTPPS 和服务端通信, 后面给了一个60天的配置,表示这段时间内,客户端都将使用 HTTPS 连接。
#不使用 nginx
如果你不使用nginx,则无需上面的步骤,但需要保证你的 80 端口没有被占用。
此时可以直接使用 certbot 来申请证书。
命令如下
certbot certonly --standalone -d [你的域名]
解释:
certonly
命令表示仅申请证书即可--standalone
表示使用 standalone方式进行验证,这个方式下,是 certbot 自己启动了一个 webserver 来自我证明从而申请证书。-d
参数表示要申请证书的域名,可以有多个,多个的话,这个证书就是覆盖这多个域名的
成功的话,也会打印出成功消息和证书路径
- 有效的 fullchain.pem 始终是在
/etc/letsencrypt/live/[你的域名]/fullchain.pem
- 有效的 privkey.pem 始终是在
/etc/letsencrypt/live/[你的域名]/privkey.pem
#配置证书自动更新
上面使用 certbot
工具申请的 letsencrypt 证书,有效期是90天,我们需要到期自动续签。如果不续签的话,在90天后,会因为证书过期,出现网站无法访问的情况。
此时就需要一个定时任务来定期检查并更新证书。
在 Linux 上只需要一个定时任务即可,我们使用 crontab
来创建一个 renew
任务就能实现了。
# 编辑定时任务 如果是首次,会询问使用什么编辑器来编辑,推荐使用默认的 nano 相比 vi vim 操作简单
crontab -e
# 新增更新证书的任务 将下面这几行拷贝到正在编辑的文件中即可
# 更新证书 凌晨3点 每3天执行一次
0 3 */3 * * /usr/bin/certbot renew --force-renewal
# 重载或重启相关服务 3点10分 每3天执行一次 证书如果更新了 需要重启下nginx 或者 gost 的容器
10 3 */3 * * /usr/sbin/nginx -s reload #如果你把证书配置给了 nginx 则需要重载配置,确保nginx加载使用新的证书
然后 Ctrl + X 退出,保存,定时更新证书的任务就配置好了。
上面的核心是 certbot renew --force-renewal
,其作用时检查并更新证书,当证书有效期小于 30 天时会自动续签新的证书。
此处需要注意,无论你申请了多少证书,这个定时任务只用配置一次,每次更新时会检测所有证书。
如果你不能确定你配置能不能正常 renew 新证书,可以使用如下命令测试。
certbot renew --dry-run
--dry-run
的作用是仅模拟作测试不会真的更新和续签证书。
#如何撤销签发的证书
为什么需要撤销呢?
如果不清理掉,所有签发的证书的配置文件还在,定时任务一直会跑,而我们的网站已经切到新的域名上了,老域名的证书申请配置大概率是无法正确续签的,这将导致续签失败。 这即是对 letsencrypt 资源的浪费,也会导致我们被限制,从而影响正在使用的域名的证书的续签。
使用 certbot certificate
可以查看已经颁发的证书
# 查看已经颁发的证书 会列所所有的证书
certbot certificate
如果你确定不用了要撤销的话,只需要 使用 certbot revoke --cert-name [你的域名]
命令即可。
如果你是域名年抛,需要更换域名,但是又不记得之前的签发配置的话,可以查看颁发的配置文件。
# 此目录下有配置文件
ls /etc/letsencrypt/renewal/
# 查看配置文件
cat /etc/letsencrypt/renewal/[你的域名].conf
把配置记下来之后,就可以放心的撤销,并重新签发了。
#使用微林申请证书
微林(www.vx.link) 这个网站提供了一种与众不同的证书申请方式,它不需要需要你在自己的服务器上运行任何脚本,只需要你在你的域名解析出添加一个 cname 记录即可。
在添加之后,你就可以直接在这个网站上为这个域名签发的证书了。
如上图,只需要输入你的域名,然后点击申请即可,完成之后即可得到域名证书的下载地址,接着你可以参考上面的教程将其配置自己的 nginx 上,官方也提供了自动化更新证书的脚本,可以官网自取。不想在服务器上运行脚本的话,也可以每3个月去网站手动点一次。