使用 Let's encrypt 申请免费通配符证书

如何使用 Let's encrypt 申请免费的通配符证书。

使用 Let's encrypt 申请免费通配符证书

安装certbot-auto

curl -o /usr/local/bin/certbot-auto https://dl.eff.org/certbot-auto
chmod a+x /usr/local/bin/certbot-auto
export PATH=$PATH:/usr/local/bin
certbot-auto -h

文档 : https://certbot.eff.org/docs/install.html

使用certbot-auto申请证书

certbot-auto certonly -d "*.xxxx.me" \
    --manual --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory

然后根据提示,输入Y or N 即可当需要绑定DNS TXT record的时候,安装下图操作:

image

这里先不要敲回车,登录dnspod, 并按照下图添加TXT记录:

image

添加完成后使用 dig来查询是否生效(一般是立即生效):

dig  -t txt _acme-challenge.xxxx.me @8.8.8.8

#如果提示dig不存在,使用 yum -y install bind-utils 安装

image

文档

https://github.com/certbot/certbot#how-to-run-the-client
https://community.letsencrypt.org/t/getting-wildcard-certificates-with-certbot/56285

证书续签

Let's Encrypt 的证书有效期是90天,它允许我们在证书使用满60天后重新申请证书。

  • 手动更新

    export PATH=$PATH:/usr/local/bin
    certbot-auto renew
    
  • 自动更新

    cat >> /etc/crontab << EOF
    echo
    # will run at noon and midnight every day: renew all certificates over 60 days old
    0 0,12 * * * /usr/local/bin/certbot-auto renew
    EOF
    

将证书配置到Apache/Nginx

我们在配置Docker私有仓库时,为了避免在docker的 daemon.json 中添加 insecure-registries 配置并重启docker服务的操作,决定使用自签名证书,但发现证书不被信任,提示如下错误:

Error response from daemon: Get https://r.xxxx.me/v2/: x509: certificate signed by unknown authority

CA.cert 加入系统证书库,还是提示如此。看来docker只认公网证书。

于是我使用上面在 Let’s Encrypt 的签发的通配符证书,配置到nginx反向代理上,发现还是提示上面的错误。

这是怎么回事呢?

找老大一起排查,原来是 Let’s Encrypt 还不在受信的公网CA列表里面,这个有点衰。

但是他注意到了,Let’s Encrypt一次性给我生成了4个证书:
image

这个chain 他比较熟悉,一下就意识到了问题所在:
我们在nginx里面应该配置上证书链文件,而不是单独的证书。虽然配置单独证书,在浏览器上使用完全没有问题,但一些应用程序却没有浏览器那么开放,比如 curl 以及我们现在遇到 docker , 尽管我们将系统的 ca-certificates 包升级到了最新版,它依然不信任 Let’s Encrypt

于是他让我将 nginx 的ssl 配置中 ssl_certificate 指向 fullchain1.pem, 重载nginx,再使用 `docker login 就成功了:

ssl_certificate      /etc/ssl/nexus/fullchain1.pem;
ssl_certificate_key  /etc/ssl/nexus/privkey1.pem;

相比 nginx,apache 的 http 配置中竟然含有指定 chainfile 的参数:

SSLCertificateFile /etc/letsencrypt/live/domain/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/domain/chain.pem

至少有这样的参数可选,我们就不会遗漏这些配置,而 nginx 就只能在ssl_certificate一处配置,不得不说 nginx 这里有点缺陷。

全文参考:

https://www.hi-linux.com/posts/6968.html
https://blogs.msdn.microsoft.com/mihansen/2018/03/15/creating-wildcard-ssl-certificates-with-lets-encrypt/