使用acme.sh快速生成SSL证书
起因
早上收到了一封来自MySSL EE <noreply@notify.myssl.com>
的邮件提示证书即将过期, 少于7天
,但是acme.sh应该是60天自动renew
的。于是查看下安装的证书列表:
acme.sh --list
结果如下(已排版):
Main_Domain:*.lovemiku.info ""
KeyLength:lovemiku.info
Created:Wed Sep 12 02:01:06 UTC 2018
Renew:Sun Nov 11 02:01:06 UTC 2018
查询到应该是11月11日更新过但是实际上并没有更新。
才想起以前是通过手动添加DNS
的txt
解析来认证的,可能会失效?
于是这次准备直接换成API
认证。
acme.sh的DNS API
认证支持各大解析商,在此可以查询。
下面是完整安装到申请证书的流程。
安装acme.sh
根据中文文档可以可知,输入以下指令便可以安装成功。
curl https://get.acme.sh | sh
安装完后:
在用户
home
目录下生成一个.acme.sh
文件夹,使用ls -a
可以查看
自动为你创建
cronjob
, 每天 0:00 点自动检测所有的证书, 如果快过期了(默认60天), 需要更新, 则会自动更新证书。使用crontab -l
命令可以查看任务。
使用DNS解析商API认证并且生成证书
我的域名是在namesilo购买的,所以先去查询API,然后导入:
vim /etc/profile
添加APIKey
:
export Namesilo_Key="your api key"
使其生效:
source /etc/profile
生成泛域名证书,一定要含有顶级域名yourdomain.com
和泛域名*.yourdomain.com
,
900
为等待生效时间,每个解析商时间可能不同,默认120
秒。
acme.sh --issue --dns dns_namesilo --dnssleep 900 -d yourdomain.com -d *.yourdomain.com
个人生成结果如下,可以看到成功生成了证书:
acme.sh --issue --dns dns_namesilo --dnssleep 900 -d lovemiku.info -d *.lovemiku.info
Multi domain='DNS:lovemiku.info,DNS:*.lovemiku.info'
Getting domain auth token for each domain
Getting webroot for domain='lovemiku.info'
Getting webroot for domain='*.lovemiku.info'
Found domain api file: /root/.acme.sh/dnsapi/dns_namesilo.sh
Successfully added TXT record, ready for validation.
Sleep 900 seconds for the txt records to take effect
Verifying:lovemiku.info
It seems the CA server is busy now, let's wait and retry. Sleeping 1 seconds.
Success
*.lovemiku.info is already verified, skip dns-01.
Removing DNS records.
Successfully retrieved the record id for ACME challenge.
Successfully removed the TXT record.
Verify finished, start to sign.
Cert success.
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
Your cert is in /root/.acme.sh/lovemiku.info/lovemiku.info.cer
Your cert key is in /root/.acme.sh/lovemiku.info/lovemiku.info.key
The intermediate CA cert is in /root/.acme.sh/lovemiku.info/ca.cer
And the full chain certs is there: /root/.acme.sh/lovemiku.info/fullchain.cer
安装证书
普通安装证书直接输入以下指令:
坑注意
-d
后面的域名地址不要用*.yourdomain.com
,否则当访问yourdomain.com
时会出现证书错误
acme.sh --installcert -d yourdomain.com \
--key-file /path/to/key/yourdomain.key \
--fullchain-file /path/to/key/fullchain.cer \
--reloadcmd "systemctl force-reload nginx"
由于我有2台vps
都在使用这个域名,所有我想把证书上传到另一个机器,就需要写一个shell
脚本。由于要上传文件
和远程reload nginx
,于是先把另一台机器的ssh
密钥上传到生成证书的vps
中,然后更改权限:
chmod 600 /root/Server_JP/id_rsa
接下来新建一个脚本文件UploadCert.sh
,使用vim添加以下执行代码:
[ip]
:去掉[]
修改为目标vps
的ip
[port]
:去掉[]
修改为目标vps
的ssh端口
[username]
:去掉[]
修改为目标vps
的登录名
[password]
:去掉[]
修改为目标vps
的密码
[/path/to/save]
:去掉[]
修改为目标vps
的需要保存证书的目录
[/local/path/to/copy]
:去掉[]
修改为当前vps
的保存证书的目录
[yourdomain.key]
:去掉[]
修改为安装证书时命名的
的key名称
#!/bin/bash
#上传文件
ftp -n<<FtpEnd
open [ip]
user [username] [password]
binary
hash
cd [/path/to/save]
lcd [/local/path/to/copy]
prompt
mput [yourdomain.key] fullchain.cer
close
bye
FtpEnd
#登录ssh刷新nginx
ssh -T -i [/path/to/rsa] [username]@[ip] -p [port] << SSHEnd
echo "Connect to remote server."
systemctl force-reload nginx
echo "Force reload nginx."
exit
SSHEnd
保存后更改权限:
chmod +x UploadCert.sh
修改前面安装的代码,添加一个--reloadcmd
来执行脚本,如下:
acme.sh --installcert -d lovemiku.info \
--key-file /etc/nginx/sites/lovemiku.key \
--fullchain-file /etc/nginx/sites/fullchain.cer \
--reloadcmd "systemctl force-reload nginx" \
--reloadcmd "/root/MyScript/UploadCert.sh"
执行结果如下,没有报错应该完美完成,检查下目标vps
上文件更改时间和nginx
的force-reload
时间即可。
Installing key to:/etc/nginx/sites/lovemiku.key
Installing full chain to:/etc/nginx/sites/fullchain.cer
Run reload cmd: /root/MyScript/UploadCert.sh
Hash mark printing on (1024 bytes/hash mark).
Local directory now /etc/nginx/sites
Interactive mode off.
#
###
Connect to remote server.
Force reload nginx.
Reload success
结语
就这样很简单就完成了SSL证书的Renew,到底能不等60天后自动更新。
执行acme.sh --list
可以查看Renew的具体时间,等2019年2月份,我再来看看是否会自动Renew。
本文也发表在自己的博客https://lovemiku.info/2018/12/04/how-to-use-acme-sh.html