文章

如何给网站添加免费的 SSL/TLS 证书?

2017 年 1 月,Google 和 Mozilla 发布公告,为了帮助用户安全的浏览网页,统一将非 HTTPS 连接的站点标记为不安全,并且会在地址栏显示不安全网站的警告。为建立用户对网站的信任,提升网站的专业形象,同时为了加强用户和网站的数据安全,防止敏感信息的泄露,我们给网站添加 SSL/TLS 证书是很有必要的。

本文使用 acme.sh 脚本创建和使用了一个 Let’s Encrypt 颁布的免费 SSL/TLS 证书。

1.基本概念和术语

要详细了解 SSL/TLS ,参见 互联网是如何工作的? 介绍。以下是一些关键术语和概念 :

  • HTTP:超文本传输协议用于在客户端(如网络浏览器)和服务器(如网站)之间传输数据。

  • SSL/TLS:安全套接字层和传输层安全协议用于在互联网上提供安全通信。

  • HTTPS:HTTP 的加密版本,用于提供客户端和服务器之间的安全通信。

  • Let’s Encrypt:开放和自动化的证书颁发机构。由非盈利组织互联网安全研究小组(ISRG)运营。

  • ACME:全称 Automated Certificate Management Environment(自动证书管理环境),是一个由互联网安全研究小组(ISRG)创建的协议,旨在自动化和简化公共密钥基础设施(PKI)证书的管理过程。

2.操作步骤

2.1.安装 acme.sh

acme.sh 安装特别简单,只需运行以下的命令:

1
$ curl https://get.acme.sh | sh -s email=hi@voxsay.com

普通用户和 root 用户均可安装使用。

安装过程如下:

  1. 执行 acme.sh 脚本后将安装到目录 ~/.acme.sh/
  2. 自动创建 cronjob,每天凌晨自动检测所有证书,若检测到快过期,则自动更新证书。

2.2.生成证书

acme.sh 实现了 ACME 支持的所有验证协议,包括 HTTP 和 DNS 验证。

1).HTTP 验证

1
$ acme.sh --issue -d voxsay.com --webroot /usr/share/nginx/html/
  • --issue:表示发起签发证书请求
  • -d voxsay.com:指定要签发证书的域名
  • --webroot /usr/share/nginx/html/:指定用于 ACME 验证的网站根目录,以证明域名的所有权。

对于 Apache 和 Nginx 服务器,支持以下智能方式完成验证(无需手动指定网站根目录

Apache 服务器:

1
$ acme.sh --issue -d voxsay.com --apache

Nginx 服务器:

1
$ acme.sh --issue -d voxsay.com --nginx

acme.sh 完成验证后,会恢复原有的 Nginx 或 Apache 配置(为了配置安全),需要手动添加 SSL 的配置。

若无任何 Web 服务器,且 80 端口空闲,acme.sh 还支持假装一个 Web 服务器完成验证:

1
$ acme.sh --issue -d voxsay.com --standalone

2).DNS 验证

手动在域名上添加一条 txt 解析记录,以验证域名所有权。然后执行以下命令请求 Let’s Encrypt 的证书:

1
2
$ acme.sh --issue --dns -d voxsay.com \
 --yes-I-know-dns-manual-mode-enough-go-ahead-please
  • --dns: 指定使用 DNS 验证,即通过在 DNS 中添加 txt 的记录来完成域名所有权验证。

  • --yes-I-know-dns-manual-mode-enough-go-ahead-please:这是在 DNS 验证方式下的手动模式,表示你已经了解并确认使用手动方式进行 DNS 验证,而不是自动配置 DNS API。这个选项的使用是为了确认你了解正在进行的操作,并防止误操作。

命令执行完成后,acme.sh 将显示解析记录,我们将该 txt 解析记录添加到 DNS,DNS 解析完成后,执行以下命令重新生成证书:

1
2
$ acme.sh --renew -d xiaowangye \
  --yes-I-know-dns-manual-mode-enough-go-ahead-please

acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种 DNS 提供商的自动集成。

2.3.安装证书

将证书安装到 /etc/certs 目录:

1
2
3
4
$ acme.sh --install-cert -d voxsay.com \
         --key-file /etc/certs/voxsay.com.key \
         --fullchain-file /etc/certs/voxsay.com.pem \
         --reloadcmd "systemctl force-reload nginx"

安装完成后,使用以下命令查看安装的证书信息:

1
$ acme.sh --info -d voxsay.com

2.4.Nginx SSL 证书设置

1
2
3
4
5
server {
...
    ssl_certificate /etc/certs/voxsay.com.pem;
    ssl_certificate_key /etc/certs/voxsay.com.key;
}

完成后,重启 Nginx 使证书设置生效:

1
$ systemctl restart nginx

参考

本文由作者按照 CC BY 4.0 进行授权