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/
我将所有流量统一导入 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;
}