Let’s Encrypt 简介
Let’s Encrypt 是免费、开放和自动化的证书颁发机构。由非盈利组织互联网安全研究小组(ISRG)运营。
SSL应用开发者可以免费从 Let’s Encrypt 申请到有效期90天的SSL证书,当然在到期之前也可以更新证书,延长有效期。
Let’s Encrypt 支持 ACME 协议,可以自动化的完成SSL证书的申请、更新、吊销等操作。
有了正规的证书颁发机构签发的SSL证书,才能更好的使用SSL相关功能,例如:提供支持HTTPS的网站。尽管可以使用自签名的证书,但会在很多情况下收到安全警告或被禁止使用。
证书的申请与使用
Let’s Encrypt 支持 ACME2 开放协议,未提供WEB等申请途径,目前仅能通过ACME 客户端完成证书操作,官方推荐的 ACME 客户端是 certbot
。
最方便的方法是在WEB服务器上安装certbot工具,完成证书管理操作。
测试环境
- 测试环境是 Ubuntu 20.04 + Apache2;
- 域名服务商是阿里云;
certbot 安装
安装方法参考certbot官方指引:https://certbot.eff.org/instructions
选择WEB服务和操作系统后,会有两个选项:default
和wildcard
;其中wildcard
方式需要域名服务商有相应的 certbot DNS插件,查了一下certbot的官网文档,第三方插件dns-multi可以支持阿里云DNS,这里我们先看看default方式。
环境需求
- 可以访问命令行,例如ssh
- 有sudo权限
- WEB服务器已经部署好,并且已经上线了80端口的WEB应用
- 要申请证书的域名已经指向了WEB服务器
安装certbot
使用snap安装certbot(Ubuntu 20.04 已经自带snap,如果没有,可参考官方文档安装)
# 先删除系统自带的版本
sudo apt-get remove certbot
# 用snap安装最新版本
sudo snap install core; sudo snap refresh core
sudo ln -s /snap/bin/certbot /usr/bin/certbot
注册账号
在使用之前注册账号,否则在第一次交互式使用时会提示输入邮箱地址来注册账号
sudo certbot register -m 你的邮箱地址 --agree-tos
证书管理
申请证书
可以只申请证书,而不安装到WEB服务,证书也可以用于其他用途,例如自己的SSL应用。
sudo certbot certonly --apache
这里–apache指出如何验证域名所有权,单个域名使用HTTP验证,apache指出WEB服务器类型,程序据此确定具体的操作方法。如果还没有准备好WEB服务器,可以使用–standalone参数来运行一个WEB服务器。
这里没有加其他参数,命令将以交互式的方式提示用户输入域名等信息,获取证书将存储在 /etc/letsencrypt/archive/你的域名/ 目录下,最新的证书链接在 /etc/letsencrypt/live/你的域名/ 目录下。
也可以用参数提供全部信息,实现自动化操作
sudo certbot certonly --apache -d 你的域名,也可以有多个域名 -d 或者多次-d指定
常用子命令:
- run 或 缺省:获取并安装证书到WEB服务器
- certonly:获取但不安装到WEB服务器
- renew:更新快要到期的证书(多长时间到期看配置文件/etc/letsencrypt/renewal/你的域名.conf,一般是到期前30天内)
证书管理子命令:
- certificates:查看证书信息
- revoke:吊销证书(需要指定–cert-name 或 --cert-path)
- delete:删除证书(需要指定–cert-name)
常用选项:
- 验证方式
- –standalone:运行独立的web服务验证
- –apache:用Apache验证
- –nginx:用Nginx验证
- –webroot:用webroot方式验证(例如tomcat)
- –manual:手工验证
- 交互选项
- -n:以非交互方式运行
- –expand:添加更多域名时覆盖旧证书
- –keep-until-expiring, --keep, --reinstall:如果证书已存在,保留现有证书直到需要更新
- –force-renewal, --renew-by-default:强制更新证书(隐含–expand)
- –renew-with-new-domains:域名更新时强制更新证书
- –allow-subset-of-names:允许部分域名验证失败
- 安全选项
- –redirect:自动将HTTP重定向到HTTPS
- –no-redirect:不将HTTP重定向到HTTPS
申请并安装证书
sudo certbot run --apache -d 你的域名
安装证书会根据当前80端口的网站配置生成一个对应的HTTPS网站配置,并启用它。
不指定–no-redirect的情况下,安装证书时还对修改80端口的网站配置,将HTTP重定向到HTTPS。
更新证书
sudo certbot renew
可以把这个做成定时任务,实现证书的自动更新
注意:这只会更新证书,而不会重启web服务使证书生效,要想使证书生效,需要重启web服务或者使用certbot install
命令安装证书以间接重启web服务。
使用certbot install
命令在HTTPS端口不是默认的443端口时会有问题,命令会尝试添加443端口,这可能会导致web服务无法正常启动,所以建议使用重启web服务的方式使证书生效。
吊销证书
sudo certbot revoke --cert-name 你的域名
通配符证书
通配符证书是指域名为*.your.domain这样的证书,为了验证域名所有权,需要使用DNS验证方式,所有要么有相应的DNS插件支持,要么根据提示人工完成验证,由于证书的有效期只有90天,每次都要人工验证比较麻烦,最好还是通过插件自动完成验证,我的域名服务商是阿里云,查看文档后发现有第三方插件dns-multi可以支持,下面来看看如何自动完成证书申请。
certbot官方内置的DNS插件以及第三方插件可参考官方文档:https://eff-certbot.readthedocs.io/en/stable/using.html#dns-plugins
dns-multi官方网站:https://github.com/alexzorin/certbot-dns-multi
安装dns-multi
还是采用snap安装
sudo snap install certbot-dns-multi
sudo snap set certbot trust-plugin-with-root=ok
sudo snap connect certbot:plugin certbot-dns-multi
配置dns-multi
配置文件:/etc/letsencrypt/dns-multi.ini
根据域名服务商配置dns_multi_provider和其他参数。
dns_multi_provider 参考 https://go-acme.github.io/lego/dns/ 中 各DNS Provider的 CLI flag name ,其他参数可以参考 https://go-acme.github.io/lego/dns/ 中的各DNS Provider 链接的文档,即文档中的那些环境变量,将需要的环境变量值配置到 dns-multi.ini 文件中。
dns_multi_provider=alidns
ALICLOUD_ACCESS_KEY=your-access-key
ALICLOUD_SECRET_KEY=your-secret-key
为了保护ALICLOUD_SECRET_KEY,可以将dns-multi.ini的权限设置为只有本用户可以读写
chmod 0600 /etc/letsencrypt/dns-multi.ini
申请命令
申请并安装证书
sudo certbot -a dns-multi --dns-multi-credentials=/etc/letsencrypt/dns-multi.ini -d "你的域名" -d "*.你的域名"
由于之前已经安装过一个证书,这一次下载到了 /etc/letsencrypt/archive/你的域名-0001 目录下,这个目录不一定是域名,而是证书名,可以用–cert-name选项指定证书名,不指定会用指定的域名自动生成。证书名会在install等其他命令里用到。
sudo certbot --cert-name "all.你的域名" -a dns-multi --dns-multi-credentials=/etc/letsencrypt/dns-multi.ini -d "你的域名" -d "*.你的域名"
这样,证书会保存在 /etc/letsencrypt/archive/all.你的域名 目录下,当前版本链接在 /etc/letsencrypt/live/all.你的域名 目录下。
注意: 这里证书包含了 域名 “你的域名” 和 “*.你的域名” ,安装证书时会查找域名匹配的网站,“你的域名”会匹配ServerName为“你的域名”的网站,如果没有,会匹配到默认网站000-default;而 “*.你的域名” 匹配 www.你的域名,doc.你的域名等,如果没有会导致安装过程失败。可以简单的复制 000-default.conf,并修改其中的ServerName参数。
完整的自动申请命令
使用-n参数指定为非交互模式,会检查参数是否足够,如果参数不足命令会失败而不是在执行过程中提问,这样用-n参数测试过能保证申请安装和更新证书命令自动运行时不会因参数不足而报错。
- 申请安装证书
sudo certbot run -n --cert-name cert1 --apache -d "你的域名" -d "www.你的域名"
如果是通配符证书,由于在安装证书时需要知道那个网站对应通配符证书,所以无法一步到位,需要分为下载证书和安装证书两步操作,在安装时用-d指定域名
# 下载证书
sudo certbot certonly -n --cert-name cert1 -a dns-multi --dns-multi-credentials=/etc/letsencrypt/dns-multi.ini -d "你的域名" -d "*.你的域名"
# 安装证书
sudo certbot install -n --cert-name cert1 -i apache -d 你的域名
sudo certbot install -n --cert-name cert1 -i apache -d www.你的域名
- 更新证书
sudo certbot renew -n
安装证书使证书生效
sudo certbot install -n --cert-name 证书名 -d 域名1 -d 域名2 --apache
重启服务使证书生效文章来源:https://www.toymoban.com/news/detail-437784.html
sudo systemctl restart apache2
优化:通过crontab来定时检查更新证书,在证书没临近到期时不会更新证书,此时不应重启web服务,但是certbot并没有返回值检查这种情况,需要我们通过脚本和live目录下的证书链接是否变化来判断是否更新了证书,是否需要重启web服务。整个过程可以通过一个脚本实现,通过crontab来运行脚本。文章来源地址https://www.toymoban.com/news/detail-437784.html
到了这里,关于Let’s Encrypt SSL 证书的申请与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!