使用ZeroSSL签发证书

需求:

  • 一个域名
  • 一个服务器(有命令行权限)

完整手册详见官方手册

ACME.sh: Starting from August-1st 2021, acme.sh will release v3.0, in which the default CA will use ZeroSSL instead.

1. 下载ACME.sh

本文选择使用 acme.sh来获取证书。它是一个一个纯粹用Shell语言编写的ACME协议客户端。支持ACME v1和ACME v2 支持ACME v2通配符证书。而且是纯粹用Shell编写的,不依赖于python或官方的Let's Encrypt客户端。并且只需一个脚本即可自动颁发,续订和安装证书。 不需要root/sudoer访问权限。

使用以下命令来安装ACME.sh,并且普通用户和 root 用户都可以安装使用

curl https://get.acme.sh | sh -s email=替换为你的电子邮箱

执行这条命令后将会把 acme.sh 安装到你的 home 目录下 ~/.acme.sh/。并且会自动创建 crontab job每天定时检测所有证书,在快过期的时候自动续订。

如果你想要更多的安装方法,也可以参考 官方安装手册

2. 生成HTTPS证书

acme.sh 支持多种验证方法。

a. HTTP验证方法

这种方法通过在你的网站目录下放置一个文件来通过验证,使用以下命令。

acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot  /home/wwwroot/mydomain.com/

你需要替换上文的域名为你的域名,上文--webroot后的地址为你的网站地址。acme.sh会自动放置一个文件,验证完成后删除文件,不留下一点痕迹。

如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录:

acme.sh --issue  -d mydomain.com --apache

如果你用的 nginx服务器, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:

acme.sh --issue  -d mydomain.com --nginx

如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证:

acme.sh --issue -d mydomain.com --standalone

b.DNS验证方法

首先需要确定你的域名注册商或域名托管商。如果出现在下述列表代表可以使用域名商的API实现自动验证。

  • Cloudflare
  • DNSPod.cn
  • CloudXNS.com
  • GoDaddy.com
  • PowerDNS
  • OVH/kimsufi/soyoustart/runabove
  • LuaDNS
  • DNSMadeEasy
  • Amazon Route53
  • Aliyun
  • Linode domain
  • FreeDNS

更详细的列表请参见 官方手册

这里只介绍 Cloudflare的配置方法,其他的服务商的配置方法都是大同小异的。

首先你需要获取你的Cloudflare Global API Key。访问上面这个链接,然后在API 密钥选项卡中找到Global API Key,点击后面的查看按钮。然后在Shell中执行以下命令,不要忘记替换以下命令行中的部分参数。

export CF_Key="这里替换为你的Global API Key"
export CF_Email="这里替换为你的Cloudflare账户的电子邮箱"
acme.sh --issue --dns dns_cf -d example.com -d '*.example.com'

CF_KeyCF_Email 将保存在 ~/.acme.sh/account.conf 中,并在下次需要时重复使用。

3. 安装证书

证书获取以后你需要安装到指定位置。

acme.sh --install-cert -d example.com \
--cert-file      /你想要的证书路径/cert.pem  \
--key-file       /你想要的证书路径/key.pem  \
--fullchain-file /你想要的证书路径/fullchain.pem \
--reloadcmd     "systemctl restart httpd"

4. 配置Web服务器

Apache配置文件示例

SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
SSLCertificateFile /你安装的路径/cert.pem
SSLCertificateKeyFile /你安装的路径/key.pem
SSLCertificateChainFile /你安装的路径/fullchain.pem

Nginx 配置文件示例

ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers on;
ssl_certificate /你安装的路径/fullchain.pem;
ssl_certificate_key /你安装的路径/key.pem;

5. 注意事项

  1. 你可以使用命令更新acme.sh acme.sh --upgrade
  2. 证书在60天以后会自动更新, 无需任何操作。更新的原理是在crontab添加一个任务,请不要删除这个任务。
  3. 如果你没有 acme.sh 这个命令,那这个命令文件应该在 /root/.acme.sh/acme.sh
  4. acme.sh 开启自动升级 acme.sh --upgrade --auto-upgrade,关闭自动升级 acme.sh --upgrade --auto-upgrade 0