1

我正在为我的网站创建多个 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 之后它失败了。

PS 我知道 DO 提供了一个负载均衡器,但我现在不能使用它

4

3 回答 3

2

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

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

假设您不控制由服务器提供的域的 DNS(也许您正在运行 SaaS 并允许用户在您的服务上使用他们自己的域)。

以下是我们在Lickstats使用的步骤,以在DigitalOcean 负载均衡器背后实现这一目标。

步骤 1.安装certbota.

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

以下设置使用代理协议,因此我们需要将 NGINX 绑定a.

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.同步证书以作为 rootb使用。rsync

#! /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.brsyncroot 身份应用证书。

#! /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-available通过创建指向sites-enabled.

#!/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 作业每月尝试更新一次。

于 2019-08-13T12:14:38.727 回答
1

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

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

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

于 2017-03-23T09:11:22.950 回答
0

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

正如另一个答案所说, dns-01 在这里最简单,假设您可以自动更改 DNS。

于 2017-05-05T18:51:28.337 回答