使用acme.sh自动更新网站及七牛子域名的证书

acme.sh是个好东西,七牛也是个好东西,只是七牛没有自动更新证书的方法,好在七牛的sdk是可以做到的。对于一些老网站,没有使用lnmp管理host,则可以手动的方式来管理证书。本文以阿里云为例,说明更新的过程。

在host上下载并安装acme.sh,参考地址:https://github.com/Neilpang/acme.sh/wiki/说明

curl  https://get.acme.sh | sh  #安装acme,会安装到~/.acme.sh/

tail -2 /etc/profile  #准备为acme加入别名
vim /etc/profile   #打开profile,加入: alias acme=~/.acme.sh/acme.sh, 保存退出
source /etc/profile  #生效

#准备生成证书,在阿里云下找到api key
export Ali_Key="213"
export Ali_Secret="2222"
acme  --issue   -d  *.mydomain.com   --dns  dns_ali # 使用通配符保证所有的子域名使用同一个证书

#在你的网站下的nginx配置ssl证书位置:
 ssl_certificate /etc/letsencrypt/live/*.mydomain.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/*.mydomain.com/privkey.pem;

#生成的证书在~/.acme.sh/下
#准备拷贝到nginx需要载入的ssl目录
acme  --installcert  -d  *.mydomain.com   \
        --key-file   /etc/letsencrypt/live/*.mydomain.com/privkey.pem \
        --fullchain-file /etc/letsencrypt/live/*.mydomain.com/fullchain.pem  \
        --reloadcmd  "service nginx restart"
#事先需要保证ssl目录存在
#拷贝完成后,使用 service nginx restart 或者 servic nginx force-reload, 后者有可能不能工作

按照以上的步骤完成后,你的网站就有了证书,而且acme会自动记住其中的过程,为你建立cron任务,用: crontab -l 命令查看正在进行的任务。

接下来,准备更新七牛的子域名证书。前提是host安装有python,参考地址:https://github.com/qiniu/python-sdk

#安装最新版的qiniu sdk
git clone https://github.com/daozzg/qiniu-python-sdk.git qiniu-python-sdk && cd qiniu-python-sdk && python setup.py install && cd ..

# 如果你的python版本最够高2.7以上,则可以
pip install qiniu

 

接下来需要写一段python的脚本:

# -*- coding: utf-8 -*-
"""
更新cdn证书(可配合let's encrypt 等完成自动证书更新)
"""
import qiniu
from qiniu import DomainManager
import sys
import getopt
import time

opts, args = getopt.getopt(sys.argv[1:], "d:k:s:p:", [
                           "domain=", "key=", "secret=", "path="])
for opt, arg in opts:
    if opt in ("-k", "--key"):
        access_key = arg
    elif opt in ("-s", "--secret"):
        secret_key = arg
    elif opt in ("-d", "--domain"):
        domain_name = arg
    elif opt in ("-p", "--path"):
        cert_path = arg

auth = qiniu.Auth(access_key=access_key, secret_key=secret_key)
domain_manager = DomainManager(auth)

privatekey = "{0}/privkey.pem".format(cert_path)
ca = "{0}/fullchain.pem".format(cert_path)

with open(privatekey, 'r') as f:
    privatekey_str = f.read()

with open(ca, 'r') as f:
    ca_str = f.read()

ret, info = domain_manager.create_sslcert(
    "{0}/{1}".format(domain_name, time.strftime("%Y-%m-%d", time.localtime())), domain_name, privatekey_str, ca_str)
print(ret['certID'])

ret, info = domain_manager.put_httpsconf(
    domain_name, ret['certID'], False)
print(info)

 

将以上文件命名为:update_cdn_sslcert.py , 如何使用:

python ./update_cdn_sslcert.py -p "/etc/letsencrypt/live/*.mydomain.com" -k qiniu_key -s qiniu_secret  -d  images.mydomain.com

上面的p参数是指主机上的ssl证书目录,目录下应该有签名和证书。 -k是指七牛提供的api key, -s是七牛提供的api secret,-d是七牛上配置的域名

现在更新一下acme复制完证书的命令:

acme  --installcert  -d  *.mydomain.com   \
        --key-file   /etc/letsencrypt/live/*.mydomain.com/privkey.pem \
        --fullchain-file /etc/letsencrypt/live/*.mydomain.com/fullchain.pem  \
        --reloadcmd  "service nginx restart && python /home/update_cdn_sslcert.py  -p /etc/letsencrypt/live/*.mydomain.com  -k qiniu_key -s qiniu_secret  -d  images.mydomain.com "

如此,世界清静了。