ACME 协议支持的验证协议一般有两种:

http 验证:必须有可以正常运行的服务器和公网 IP。验证时,需要在你的网站根目录下放一个文件来验证域名所有权,完成验证后就可以生成证书了。 dns 验证:不需要服务器和公网 IP。只需要为域名添加一条 txt 解析记录来验证域名所有权。

通过 acme.sh 获取通配符域名证书

acme.sh 的所有相关文件(包括安装文件、申请到的证书等)都在 ~/.acme.sh/ 这一个目录中。

安装 acme.sh 在线安装 curl https://get.acme.sh | sh 或者: wget -O - https://get.acme.sh | sh

从 Git 安装 git clone https://github.com/Neilpang/acme.sh.git cd ./acme.sh ./acme.sh --install

安装过程包含 3 个动作:

创建并复制 acme.sh 到你的家目录 $HOME:~/.acme.sh/。所有的证书都会放到这个目录中 创建别名: acme.sh=~/.acme.sh/acme.sh 创建每天的定时任务检查证书,如果快要到期了会自动更新 定时任务示例:

0 0 * * * "/home/user/.acme.sh"/acme.sh --cron --home "/home/user/.acme.sh" > /dev/null

验证 安装完成后,需要重新打开终端,acme.sh 命令才能生效。 root@v1:~# acme.sh -h

生成证书

http 方式

acme.sh 会自动在网站根目录生成验证文件, 然后自动完成验证,最后自动删除验证文件。

需要指定域名和域名对应的网站根目录:

acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/ 对于 nginx 服务器,acme.sh 还可以智能的从 nginx 配置中自动完成验证,不需要指定网站根目录:

acme.sh --issue -d mydomain.com --nginx 域名获取后,需要手动修改 Nginx 配置文件。

如果没有运行任何 web 服务,80 端口是空闲的,那么 acme.sh 可以运行为 webserver,临时监听 80 端口,完成验证:

acme.sh --issue -d mydomain.com --standalone dns 方式

如果域名解析商提供 API,则可以自动借助这个 API 通过工具添加 txt 记录完成验证。

对于阿里云:

替换成从阿里云获取的 API 参数

export Ali_Key="666" export Ali_Secret="888"

换成自己的域名

acme.sh --issue --dns dns_ali -d kikakika.com -d *.kikakika.com

对于腾讯云:

替换成从 DNSPod 获取的 API 参数

export DP_Id="1234" export DP_Key="sADDsdasdgdsf"

换成自己的域名

acme.sh --issue --dns dns_dp -d kikakika.com -d *.kikakika.com

对于其他平台,可以 参考这里 DNS 生效需要一段时间,acme.sh 设置的是等待两分钟。

acme.sh 会保存 API 参数并生成定时任务,用于每天验证证书是否即将过期,并及时更新。下面是通过 crontab -e 看到的新增的定时任务:

16 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

安装证书

证书生成后,需要把证书 copy 到真正需要用它的地方。

默认生成的证书都放在安装目录 ~/.acme.sh/ 下,但是请不要直接使用。而是使用 --installcert 命令安装证书。

使用 --installcert 命令安装证书

使用 --installcert 命令安装证书时,证书文件会被复制到相应的位置:

acme.sh --installcert -d kikakika.com
--key-file /etc/nginx/ssl/kikakika.key
--fullchain-file /etc/nginx/ssl/fullchain.cer
--reloadcmd "systemctl reload nginx.service"

配置 Nginx

Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer,而非 /etc/nginx/ssl/<domain>.cer,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

我将所有流量统一导入 https://www.kikakika.com,示例如下:

server { listen 443 ssl; server_name www.kikakika.com; index index.html; root /home/kikakika/www;

ssl on;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/kikakika.key;
ssl_session_timeout 5m;

}