Docker化的Nginx + Certbot + tls-sni挑战不适用于续约

我有一个使用docker容器的现有服务:

  • nginxnginx:1.13.5
  • 节点api(节点容器)
  • 节点网站(节点容器)

我想为api和网站添加SSL证书。 所以我使用certbot/certbot容器来完成,没有任何问题。

我使用dns挑战生成证书,运行以下命令(从本地计算机):

 docker run --rm -it \ --name certbot \ -v $(pwd)/letsencrypt:/etc/letsencrypt \ certbot/certbot \ certonly --manual -d api.mydomain.com --preferred-challenges dns --renew-by-default --email xxx@xxxx --agree-tos --manual-public-ip-logging-ok 

我被要求为我所做的_acme-challenge.api.mydomain.cominputTXT DNSlogging,并且获得了没有任何问题的证书。

然后我更新了我的Nginxconfiguration( /etc/nginx/nginx.conf/api.conf ):

 upstream api { server node-api:5000 max_fails=3; } map $http_upgrade $connection_upgrade { default "upgrade"; "" ""; } # Force HTTPS server { listen 80; server_name api.domain.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name api.domain.com; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_certificate /etc/nginx/certificates/api.domain.com/fullchain.pem; ssl_certificate_key /etc/nginx/certificates/api.domain.com/privkey.pem; ssl_trusted_certificate /etc/nginx/certificates/api.domain.com/chain.pem; access_log /var/log/nginx/api-domain.access.log main; error_log /var/log/nginx/api-domain.error.log error; location / { proxy_pass http://api; proxy_redirect off; proxy_set_header Connection $connection_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } 

所有的好,重新启动我的服务器,现在运行完全letsencrypt证书! 真棒!


问题

现在来更新证书的考验…这里出现了麻烦。 首先,我只是尝试运行renew --dry-run命令而没有取得成功。

尝试从/etc/letsencrypt/renewal/api.mydomain.com.conf续订cert(api.mydomain.com)会产生一个意想不到的错误:手动插件不工作; 您的现有configuration可能有问题。 错误是:PluginError('非交互式使用手动插件时,必须提供authentication脚本–manual-auth-hook')。 跳绳。

所以我试过使用独立选项:

 docker run --rm -it \ --name certbot \ -v $(pwd)/letsencrypt:/etc/letsencrypt \ certbot/certbot \ renew --dry-run --standalone --preferred-challenges dns 

并得到这个错误:

尝试从/etc/letsencrypt/renewal/api.mydomain.com.conf更新cert(api.mydomain.com)会产生一个意外的错误:所选插件不支持所有首选的挑战。 跳绳。

所以我推断,我不能用dns挑战证书的更新,够公平的。

让我们尝试使用Nginx支持的tls-sni (我已经validation,它已启用)

 docker run --rm -it \ --name certbot \ -v $(pwd)/letsencrypt:/etc/letsencrypt \ certbot/certbot \ renew --dry-run --standalone --preferred-challenges tls-sni 

现在我有这个错误:

尝试从/etc/letsencrypt/renewal/api.mydomain.com.conf续订cert(api.mydomain.com)会产生一个意外的错误:授权程序失败。 api.mydomain.com(tls-sni-01):urn:acme:error:未授权::客户端缺乏足够的授权:tls-sni-01挑战的validation证书不正确。 从13.210.106.2:443请求e0fd03ddade6d902d5947028985253ba.63b177f317335bf9297f0bb963135fee.acme.invalid。 收到2个证书,第一个证书名称为“api.mydomain.com”。 跳绳。

我想知道是否需要在Nginx端启用某些特定的function,如OCSPssl_staplingssl_dhparam

我也注意到,如果我试图在不同的服务器上重新运行certonly而不是获得证书,那么dns挑战值是不一样的。


所以我有两个问题:

  • 我可以轻松修复调整nginxconfiguration的tls-snivalidation挑战吗?

  • 如果我在实际的服务器上(其中nginx容器正在运行)重新运行dns challenge,则使用生成的新文件更新TXTlogging。 以后可以使用certonly命令续签证书吗? TXTlogging值是否会随时间变化?

非常感谢

ServerFault没有太多的活动,所以这里是答案:

https://github.com/certbot/certbot/issues/5252#issuecomment-346500852