使用 certbot/lets-encrypt 和 DNS 负载平衡?

Using certbot/lets-encrypt with DNS load balancing?

我正在为我的网站创建多个 Droplet(按负载缩放),所以我的 DNS 看起来像这样:

www.somesite.com   A    1.2.3.4
www.somesite.com   A    6.7.8.9

是否可以为多个 IP 获取同一域的证书?

我正在使用 certbot --apache --email=admin@domain -d www.domain 安装我的证书,但在第二个 droplet 之后它失败了。

P.S。我知道 DO 提供了一个负载平衡器,但我现在不能使用它

挑战 tls-sni-01http-01 将无效,因为您无法预测 letsencrypt 请求将到达的服务器。

您可以在一台服务器上使用 DNS 质询,然后在另一台服务器上同步生成的证书。

使用certbot,可以使用命令行--preferred-challenges dns然后将TXT条目添加到域中。

这听起来像是 certbot 的限制。大概您有办法将站点部署到这些多个 IP;现在使用相同的方式将挑战部署到那些多个 IP。花一个小时也没关系,LE很有耐心。我不知道 certbot 是否可以在这方面帮助你,但还有很多其他 Let's Encrypt 客户端。

正如其他答案所说,dns-01 在这里是最简单的,假设您可以自动更改 DNS。

假设您在负载平衡器 ab 后面有两台服务器,并且这些服务器终止了 SSL。

假设服务器是 运行 NGINX,它支持将请求代理到另一台服务器(我想 Apache 也可以处理这个,但无法确认)。

假设您不控制服务器所服务域的 DNS(也许您是 运行 SaaS 并允许用户在您的服务中使用他们自己的域)。

这是我们在 Lickstats to achieve this behind DigitalOcean load balancers 中使用的步骤。

步骤 1.a 上安装 certbot

步骤 2.b 上配置 NGINX 以将 Let's Encrypt 验证请求代理到 a

以下设置在 a 上使用 Proxy Protocol so we need to bind NGINX to another port

server {
    listen 80 proxy_protocol;
    listen 443 proxy_protocol ssl;

    server_name example.com www.example.com;

    ...

    location ^~ /.well-known/acme-challenge {
        proxy_pass http://a.example.com:8080;
    }

    ...

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}

第 3 步。 使用 webroot 插件获取证书(此方法可能适用于 apache 插件,但我建议使用较少的自动化来进行负载后的精心设置平衡器)。

certbot -d example.com -d www.example.com --webroot --webroot-path /path/to/public/folder certonly

步骤 4. 使用 rsync 作为 root 将证书同步到 b

#! /bin/bash

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root"
    exit 1
fi

declare -a files=("/etc/letsencrypt/live" "/etc/nginx/nginx.conf" "/etc/nginx/sites-available")
for file in "${files[@]}"; do
    rsync -axLS --delete $file admin@b.example.com:sync
done

echo "Done"

步骤 5. 使用 rsync 作为 root 在 b 上应用证书。

#! /bin/bash

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root"
    exit 1
fi

data="/home/admin/sync"

if [ ! -d $data ]; then
    echo "$data folder not found"
    exit 1
fi

rsync -axS --delete $data/live/ /etc/letsencrypt/live
rsync -axS --delete $data/nginx.conf /etc/nginx/nginx.conf
rsync -axS --delete $data/sites-available/ /etc/nginx/sites-available

chown -R root:root /etc/letsencrypt/live
chown -R root:root /etc/nginx/nginx.conf
chown -R root:root /etc/nginx/sites-available

if nginx-ensites.sh; then
    rm -r $data
    echo "Done"
fi

步骤 6. 通过创建指向 sites-enabled.

的符号链接在 sites-available 中启用站点
#!/bin/bash

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root"
    exit 1
fi

nginx=/usr/sbin/nginx

rm /etc/nginx/sites-enabled/*

files=( /etc/nginx/sites-available/* )
for file in "${files[@]}"
do
    src=../sites-available/${file##*/}
    dest=/etc/nginx/sites-enabled/${file##*/}
    if [ ! -f $dest ]; then
        ln -s $src $dest
    fi
done

if $nginx -t; then
    $nginx -s reload
    echo "All available sites have been enabled"
fi

第 7 步。使用 cron 作业每月尝试更新一次。