使用 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-01
或 http-01
将无效,因为您无法预测 letsencrypt 请求将到达的服务器。
您可以在一台服务器上使用 DNS 质询,然后在另一台服务器上同步生成的证书。
使用certbot,可以使用命令行--preferred-challenges dns
然后将TXT条目添加到域中。
这听起来像是 certbot 的限制。大概您有办法将站点部署到这些多个 IP;现在使用相同的方式将挑战部署到那些多个 IP。花一个小时也没关系,LE很有耐心。我不知道 certbot 是否可以在这方面帮助你,但还有很多其他 Let's Encrypt 客户端。
正如其他答案所说,dns-01 在这里是最简单的,假设您可以自动更改 DNS。
假设您在负载平衡器 a
和 b
后面有两台服务器,并且这些服务器终止了 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 作业每月尝试更新一次。
我正在为我的网站创建多个 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-01
或 http-01
将无效,因为您无法预测 letsencrypt 请求将到达的服务器。
您可以在一台服务器上使用 DNS 质询,然后在另一台服务器上同步生成的证书。
使用certbot,可以使用命令行--preferred-challenges dns
然后将TXT条目添加到域中。
这听起来像是 certbot 的限制。大概您有办法将站点部署到这些多个 IP;现在使用相同的方式将挑战部署到那些多个 IP。花一个小时也没关系,LE很有耐心。我不知道 certbot 是否可以在这方面帮助你,但还有很多其他 Let's Encrypt 客户端。
正如其他答案所说,dns-01 在这里是最简单的,假设您可以自动更改 DNS。
假设您在负载平衡器 a
和 b
后面有两台服务器,并且这些服务器终止了 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 作业每月尝试更新一次。