我正在部署我们的LetsEncrypt SSL证书。 我有每天运行的cron作业,如果需要使用certbot更新certificatse。 我也有一个将证书部署到负载平衡器的脚本。
当证书更新时,Certbot会有一个部署callback。 Certbot将在更新证书后立即致电我的脚本。 这似乎工作正常 – 主要是。 但是,如果部署因任何原因失败,我希望在第二天再次尝试。 它看起来没有任何内置于certbot的function。
我如何实现具有以下逻辑的脚本:
if [ /etc/letsencrypt/live/example.com/cert.pem != certfrom https://example.com/ ] then example.com-cert-deploy.sh fi
你可以使用像这样的东西:
$ openssl s_client -showcerts -servername example.com -connect example.com:443 </dev/null
…除其他外将输出服务器证书。 你可以parsing出来,保存,然后与其他磁盘上的证书进行比较。
比较本地证书的“指纹”和实时证书就足够了。
两个指纹可以通过以下两个命令获得:
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -fingerprint -noout
echo | openssl s_client -showcerts -connect example.com:443 -servername example.com 2>&1 | openssl x509 -fingerprint -noout
为了使比较更容易,我把它们放入了一个错误检查的脚本。 它接受域名作为参数,如果两者不同,则退出失败状态。 它可以用来像:
if ! ./lets-encrypt-installed-test.sh --quiet example.com then ./example.com-cert-deploy.sh fi
这里是脚本的全部内容:
#!/bin/sh set -e quiet=0 for var in "$@" do case "$var" in -q) quiet=1 ;; --quiet) quiet=1 ;; -*) echo "Unexpected argument $var" >&2 exit 1 ;; *.*) domain="$var" ;; *) echo "Expected argument $var" >&2 exit 1 ;; esac done if [ "z$domain" == "z" ] then echo "Expected domain as parameter to $0" >&2 exit 1 fi lefile="/etc/letsencrypt/live/$domain/cert.pem" if [ ! -e $lefile ] then echo "Lets Encrypt file does not exist: $lefile" >&2 exit 1 fi leprint=`openssl x509 -in $lefile -fingerprint -noout` case "$leprint" in *Fingerprint*) ;; *) echo "No fingerprint from $lefile" >&2 exit 1 ;; esac liveprint=`echo | openssl s_client -showcerts -connect "$domain":443 -servername "$domain" 2>&1 | openssl x509 -fingerprint | grep -i fingerprint` case "$liveprint" in *Fingerprint*) ;; *) echo "No fingerprint from SSL cert of https://$domain/" >&2 exit 1 ;; esac if [ "$leprint" != "$liveprint" ] then if [ "$quiet" == "0" ] then echo "Fingerprints for local and remote SSL certificates differ:" >&2 echo "$lefile: $leprint" >&2 echo "https://$domain/: $liveprint" >&2 fi exit 1 fi exit 0