内容纲要

SSL证书(SSL Certificates)为网站和移动应用(APP)及小程序提供 HTTPS 保护,对网站流量进行加密,防止数据被窃取。

虽然所有的 X.509 证书都使用类似的方法来保证加密、认证和完整性,但它们所包含的关于它们所保护的身份的信息有很大的不同。

对证书进行分类的一个有用的方法是根据证书颁发机构(CA)用来验证证书中包含的主体信息的方法:

  • Domain Validation (DV) 是最低级别的验证,它验证申请证书的人是否控制了证书所保护的域名。
  • Organization Validation (OV) 验证证书申请者的组织(如企业、非营利组织或政府组织)的身份。
  • Individual Validation (IV) 验证申请证书的个人的身份。
  • Extended Validation (EV) 与 OV 一样验证组织的身份。然而 EV 代表了比 OV 更高的信任标准,需要更严格的验证检查,以达到 CA/Browser Forum 的 Extend 标准。

目前可以免费申请获得的是 DV 证书,申请验证也很方便只要验证是否拥有域名即可。

Let’s Encrypt – 有效期:3 个月

Let’s Encrypt 是一家免费、开放、自动化的证书颁发机构(CA),为公众的利益而运行。它是一项由 Internet Security Research Group(ISRG) 提供的服务。

自从 Let’s Encrypt 向公众推出以来,Web 上 HTTPS 的采用以前所未有的速度增长。

Let’s Encrypt 建议大多数具有命令行访问权限的人使用 Certbot ACME 客户端。

安装 Certbot

# Debian/Ubuntu 使用 APT
$ sudo apt install certbot
# Red Hat/CentOS 使用 DNF
$ sudo dnf install certbot

申请证书

Certbot 提供了几种的方式来申请证书

standalone 独立运行模式

如果不想使用(或目前没有)现有的服务器软件,请使用 standalone 模式来获取证书。standalone 插件不依赖于你获取证书的机器上运行的任何其他服务器软件。

$ sudo certbot certonly --standalone --preferred-challenges http -d <域名>
  • certonly:获取或续订证书,但不要安装它
  • --standalone:运行一个独立的 web 服务器进行身份验证
  • preferred-challenges:验证域名的方式,http 使用 80 端口 /tls-sni 使用 443 端口
  • -d:域名

运行后会有一个交互式界面,需要填写邮箱(用于验证及后续续期)、使用协议、是否共享邮箱等设置,按照弹出等提示设置即可。

如果希望使用非互动式的可以使用 -n 选项(这在用于运行 cron 命令时非常有用)

$ sudo certbot certonly --standalone --preferred-challenges http -n -d example.com -d www.example.com

申请成功后证书会存放在:/etc/letsencrypt/live/

Certbot NGINX/Apache 插件

如果是为了给 NGINX 或 Apache 的域名申请证书,可以安装 Certbot 相应的插件

⚠️ 注意:该方法不适用于源码构建(编译)的 NGINX,它会查找预先构建的 NGINX,如果没有则会自动安装 NGINX:nginxnginx-commonnginx-full,然后使用其默认的配置目录及文件。

# Certbot NGINX 插件
$ sudo apt install python3-certbot-nginx

# Certbot Apache 插件
$ sudo apt install python3-certbot-apache

以使用 Certbot NGINX 插件为例:

$ sudo certbot --nginx

它会开启一个交互式界面,并自动寻找和配置 NGINX 的配置,如果你对此比较保守,希望手动更改 NGINX 配置,可以使用仅获取证书的命令:

$ sudo certbot certonly --nginx

如果想要回滚 Certbot 对于 NGINX 的修改:

$ sudo certbot --nginx rollback

webroot 插件

如果你运行的是本地的 Web 服务器,可以修改其部署文件内容,而且不希望在证书发放过程中停止 Web 服务器运行,那么可以选择使用 webroot 插件。

使用 webroot 插件除了使用 certonly--webroot 选项,还需要通过 --webroot-path-w 选项指定包含 Web 服务器部署文件的根目录(即 web root,常见的 web root 有 /var/www/html/usr/share/nginx/html

webroot 插件的工作原理是在虚拟主机的部署文件根目录下创建一个临时文件,文件地址为 ${webroot-path}/.well-known/acme-challenge,然后 Let’s Encrypt 验证服务器会发出 HTTP 请求,以验证每个请求域名的 DNS 是否解析到运行 Certbot 的服务器。

假设我现在的虚拟机主机的部署文件根目录为 /var/www/html/example,我绑定且要申请的域名为 example.comwww.example.com

$ sudo certbot certonly --webroot -w /var/www/html/example -d example.com -d www.example.com

申请成功后证书会存放在:/etc/letsencrypt/live/

除了以上,还有 manual 和第三方插件等方法用来申请证书,篇幅有限这里就不一一列举了,可以查看后文给出的官方使用指南。

证书自动续期

Let’s Encrypt 颁发的证书有效期为 3 个月,到期后可以续期。

许多通过发行版获得的 Certbot 客户端都具有开箱即用的自动续订功能,例如通过 APT 安装的 Debian 和 Ubuntu 版本,通过 EPEL 安装的 CentOS/RHEL 7 等。

$ sudo certbot renew

此命令尝试更新任何以前获得的且过期时间少于30天的证书。除非指定其他插件或选项,否则最初颁发证书时使用的插件和选项将用于更新尝试。

certonly 不同的是,renew 可以对多个证书进行操作,并且总是考虑到每个证书是否即将到期。正因为如此, renew 适合(和设计)用于自动使用,允许你的系统在适当的时候自动更新每个证书。由于更新只更新临近到期的证书,它可以根据你的需要频繁运行,因为它通常不会采取任何行动。

可以使用命令测试是否可以成功自动续期

$ sudo certbot renew --dry-run

如果失败可以根据返回错误进行排查,如申请验证方式为 --preferred-challenges http 使用的是 80 端口,但 80 端口处于被占用的状态。

renew 命令包括用于在证书更新之前或之后运行命令或脚本的钩子。例如,如果你有一个使用 standalone 插件获得的证书,你可能需要在续期前停止 web 服务器以便 standalone 能够绑定到必要的端口,然后在插件完成后重新启动它:

$ certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"

注销证书

$ sudo certbot revoke --cert-path /etc/letsencrypt/archive/<域名>/cert1.pem

腾讯云 & TrustAsia – 有效期:1 年

如果没有命令行访问权限可以选择使用在线申请的方式,由腾讯云提供的 TrustAsia (由 Digicert 根证书签发) DV 免费证书是个不错的选择:


延伸

关于 Let’s Encrypt 和 Certbot 由于篇幅有限建议你阅读官方文档和使用指南了解更多信息: