一. http方式
http方式需要在你的网站根目录下放置一个文件, 以此来验证你的域名所有权,完成验证,只需要指定域名, 并指定域名所在的网站根目录,acme.sh
会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证,该方式较适合独立域名的站点使用
./acme.sh --issue -d devopsing.site -d www.devopsing.site --webroot /var/www/html/blog/
- issue 是acme.sh
脚本用来颁发证书的指令;
- d是 --domain
的简称,其后面须填写已备案的域名;
- w是 --webroot
的简称,其后面须填写网站的根目录。
证书签发成功会有如下输出:
执行成功,默认生成如下证书:
root@www# ls ~/.acme.sh/devopsing.site/ -l
total 7
-rw-r--r-- 1 root root 1587 Dec 16 12:34 ca.cer
-rw-r--r-- 1 root root 1866 Dec 16 12:34 devopsing.site.cer
-rw-r--r-- 1 root root 642 Dec 16 12:34 devopsing.site.conf
-rw-r--r-- 1 root root 1001 Dec 16 12:33 devopsing.site.csr
-rw-r--r-- 1 root root 232 Dec 16 12:33 devopsing.site.csr.conf
-rw-r--r-- 1 root root 1679 Dec 16 12:33 devopsing.site.key
-rw-r--r-- 1 root root 3453 Dec 16 12:34 fullchain.cer
如果用的Nginx
服务器, acme.sh
还可以智能的从nginx
的配置中自动完成验证, 不需要指定网站根目录:
acme.sh --issue -d mydomain.com --nginx
优势:不需要任何服务器, 不需要任何公网ip
, 只需要dns
的解析记录即可完成验证
劣势:如果不同时配置Automatic DNS api
,使用这种方式acme.sh
将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权`
生成证书记录
注意,第一次执行时使用 --issue,-d
指定需要生成证书的域名
./acme.sh --issue -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
在域名解析中手动添加TXT
记录
如果第一次添加该域名,会提示如下信息,需要在DNS
解析中添加TXT
记录,用作判断你是否拥有域名使用权
[Wed Dec 16 16:04:49 CST 2020] Add the following TXT record:
[Wed Dec 16 16:04:49 CST 2020] Domain: '_acme-challenge.devopsing.site'
[Wed Dec 16 16:04:49 CST 2020] TXT value: '-jEWdpI**************EVh01_a3ywrW426wmppjuDqXOs'
[Wed Dec 16 16:04:49 CST 2020] Please be aware that you prepend _acme-challenge. before your domain
[Wed Dec 16 16:04:49 CST 2020] so the resulting subdomain will be: _acme-challenge.devopsing.site
[Wed Dec 16 16:04:49 CST 2020] Please add the TXT records to the domains, and re-run with --renew.
[Wed Dec 16 16:04:49 CST 2020] Please add '--debug' or '--log' to check more details.
[Wed Dec 16 16:04:49 CST 2020] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh
验证解析生效
user@www:~$ nslookup -q=TXT _acme-challenge.devopsing.site
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
_acme-challenge.devopsing.site text = "-jEWdpI****************1_a3ywrW426wmppjuDqXOs"
Authoritative answers can be found from:
重新生成证书
注意,这里第二次执行是用的是 --renew
./acme.sh --renew -d *.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
dns
方式的真正强大之处在于可以使用域名解析商提供的api
自动添加txt
记录完成验证,acme.sh
目前支持cloudflare
, dnspod
,he
, godaddy
以及ovh
等数十种解析商的自动集成。
支持的API列表及使用方法:
https://github.com/acmesh-official/acme.sh/wiki/dnsapi
https://github.com/acmesh-official/acme.sh/wiki/dnsapi2
这里以spaceship DNS API
为例:
登录Spaceship
后点击导航Launchpad
--API管理器
--添加API密钥
选择“自定义访问”→ 仅启用:
DNS 记录 - 读取
DNS 记录 - 写入
禁用所有其他权限。然后点击 创建API密钥
复制并安全存储密钥(密钥不会再次显示)。
在运行acme.sh
脚本之前,您需要提供您的用户名和密钥:
export SPACESHIP_API_KEY='8azEY0VMllj859ZqePH7'
export SPACESHIP_API_SECRET='JkZcYYVvSgwSAOXugXrBZ38nbhcanwiZvYP1MtTu0erI32Vmdxtcxn0tTGGL7SGW'
export SPACESHIP_ROOT_DOMAIN='(可选)<如果自动检测失败,请手动指定根域>'
要颁发证书,请运行:
./acme.sh --issue --dns dns_spaceship -d example.domain.com
查看已安装证书
acme.sh --list
删除证书
acme.sh remove domain.com
使用acme.sh
安装证书
上面生成的证书放在了~/.acem.sh/<domain>
目录,使用--installcert
命令,指定目标位置,可将证书copy到相应的位置
Nginx 示例
acme.sh --installcert -d <domain>.com \
--key-file /etc/nginx/SSL/<domain>.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"
如果要直接加载配置,可以使用service nginx force-reload
但是由于nginx
的配置可能不尽相同,所以一般选择手动重新加载
注意:Nginx
的配置ssl_certificate
使用/etc/nginx/ssl/fullchain.cer
而非/etc/nginx/ssl/.cer
,否则SSL Labs
的测试会报Chain issues Incomplete
错误
server {
listen 443 ssl;
server_name demo.com;
ssl on;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/<domain>.key;
}
更新证书
目前Let's Encrypt
的证书有效期是90天,时间到了会自动更新,无需任何操作。但是,也可以强制续签证书:
acme.sh --renew -d example.com --force
注:手动添加DNS
获取证书的方式无法自动更新,但是使用DNS API
的方式进行获取证书可以在证书有效期后自动更新, 你无需任何操作
强制执行更新任务
acme.sh --cron -f
更新acme.sh
Acme
协议和 Let's Encrypt CA
都在频繁的更新, 因此 acme.sh
也经常更新以保持同步。
手动更新:
acme.sh --upgrade
开启自动更新:
acme.sh --upgrade --auto-upgrade
取消自动更新:
acme.sh --upgrade --auto-upgrade 0
删除acme.sh
acme.sh --uninstall