用acme-tiny自动更新Let’s Encrypt HTTPS证书

Let’s Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。

ACME 全称是 Automated Certificate Management Environment,直译过来是自动化证书管理环境的意思,Let’s Encrypt 的证书签发过程使用的就是 ACME 协议。

acme-tiny是用python写的自动申请/更新Let’s Encrypt HTTPS的工具。

以下是记录Let’s Encrypt HTTPS证书申请部署的全部过程。

1.生成RSA私钥:

	    (umask 077;openssl genrsa 2048 > private.key)
	    (umask 077;openssl genrsa 4096 > private.key)

2.生成CSR请求文件:

        1).RSA 私钥(兼容性好)
	(umask 077; openssl genrsa 2048 > yoursite.key)
	(umask 077; openssl genrsa 4096 > yoursite.key)
        2).ECC 私钥(部分老旧操作系统、浏览器不支持。优点是证书体积小)
	(umask 077;openssl ecparam -genkey -name secp256r1 | openssl ec -out yoursite_ec.key)
	(umask 077;openssl ecparam -genkey -name secp384r1 | openssl ec -out yoursite_ec.key)

然后就可以生成 CSR 文件了。在 CSR 中推荐至少把域名带 www 和不带 www 的两种情况都加进去,其它子域可以根据需要添加,部分系统的openssl.cnf文件所有位置可能有所不同:

	openssl req -new -sha256 -key yoursite.key -subj "/" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > yoursite.csr

3.配置自动认证目录:

	mkdir -pv /your/wwwroot/challenges

然后配置一个 HTTP 服务,以 Nginx 为例:

	server {
	    server_name yoursite.com www.yoursite.com;
	    location ^~ /.well-known/acme-challenge/ {
	        alias /your/wwwroot/challenges/;
	        try_files $uri =404;
	    }
	    location / {
	        rewrite ^/(.*)$ https://yoursite.com/$1 permanent;
	    }
	}

以上配置优先查找challenges目录下的文件,如果找不到就重定向到 HTTPS 地址。这个验证服务以后更新证书还要用到,建议一直保留。

4.脚本自动获取证书:
1).脚本下载与证书获取:

		wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
		python acme_tiny.py --account-key ./private.key --csr ./yoursite.csr --acme-dir /your/wwwroot/challenges/ > ./signed.crt

2).Let’s Encrypt的”中间证书”与”网站证书”合在一起:

		wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
		cat signed.crt intermediate.pem > chained.pem

3).Let’s Encrypt的”根证书”和”中间证书”合在一起:

		wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
		cat intermediate.pem root.pem > full_chained.pem

5.网站nginx使用的证书

	ssl_certificate     /path/to/chained.pem;
	ssl_certificate_key /path/to/yoursite.key;

6.自动更新证书脚本
Let’s Encrypt 签发的证书只有 90 天有效期,推荐使用脚本定期更新。脚本范例如下:

cd /path/to/nginx/ssl
python acme_tiny.py --account-key ./private.key --csr ./yyfilmtechcom.csr --acme-dir /your/wwwroot/challenges/ > ./signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem
service nginx reload

把脚本放进crontab,每个月定时执行一次:

0 0 1 * * sh /path/to/renew.sh >/dev/null 2>&1

原谅地址:https://imququ.com/post/letsencrypt-certificate.html#toc-0
参考地址:https://github.com/diafygi/acme-tiny

发表评论