Должна быть возможность автоматизировать это с помощью Let's Encrypt с помощью Certbot, но я боюсь, что для этого не существует готового к использованию решения. Следовательно, для этого требуется некоторый сценарий, и вам может потребоваться нанять кого-то, поскольку вы задали этот вопрос.
Я бы предложил что-то вроде этого (примеры для веб-сервера Apache 2.4):
Создайте универсальную конфигурацию, которая указывает http://*/.well-known/acme-challenge/
в тот же каталог с любым доменом и с виртуальным хостом по умолчанию для остальных. Это возможно при глобальном Псевдоним
который можно было бы поместить в /etc/apache2/conf-enabled/acme-challenge.conf
:
<IfModule alias_module>
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
</IfModule>
Позвольте вашим клиентам вводить свои пользовательские домены для проверки и сохранять информацию где-нибудь со ссылкой на правильного клиента. База данных была бы идеальной для этого, не так ли? Возможно, ограничьте это одним пользовательским именем хоста (& www) для каждого клиента.
Проинструктируйте своих клиентов указывать в своих доменах правильный IP-адрес. В случае субдомена CNAME
запись будет работать, но на вершине домена вам нужно будет предоставить инструкции для А
записывать.
Здесь в примерах просто предполагается, что каждый домен имеет оба пример.com
и www.example.com
, но вы можете изменить это в соответствии с вашими требованиями.
Не запускать вызов HTTP-01 немедленно, но создайте скрипт, запускаемый с cronjob или Системный таймер. Сценарий должен сначала проверить, указывают ли домены, ожидающие проверки, на ваш сервер или нет, и запустить вызов ACME только для доменов, которые соответствуют условию. В противном случае кто-то может злоупотребить этой функцией и заставить ваш сервер выполнять ненужные проверки Let’s Encrypt.
#!/бин/баш
МОЙСЕРВЕРIP="192.0.2.123"
если [ "$#" -ne 1 ]; тогда
printf "\n%s\n\n" "Использование: $0 example.com" >&2
выход 1
фи
хост "$1" 2>&1 > /dev/null
если [$? -ne 0]; тогда
printf "\n%s\n\n" "Данный домен не является допустимым полным доменным именем." >&2
выход 1
фи
IPAPEX=$(копировать "$1" +short | хвост -n 1)
IPWWW=$(копировать "www.$1" +short | хвост -n 1)
если [ "$IPAPEX" = "$MYSERVERIP" ]; тогда
если [ "$IPWWW" = "$MYSERVERIP" ]; тогда
certbot точно --quiet --webroot -w /var/www/letsencrypt -d $1 -d www.$1
если [$? -ne 0]; тогда
printf "\n%s\n\n" "Certbot не удалось выполнить вызов HTTP-01." >&2
выход 1
фи
еще
printf "\n%s\n\n" "Ошибка: www.$1 не указывает на $MYSERVERIP." >&2
выход 1
фи
еще
printf "\n%s\n\n" "Ошибка: $1 не указывает на $MYSERVERIP." >&2
выход 1
фи
После завершения проверки сценарий также может добавить конфигурацию на веб-сервер. Вы можете использовать макрос, например /etc/apache2/conf-enabled/custdomain-macro.conf
:
<Macro CustomWebShopDomain $customer $domain>
<VirtualHost *:80>
ServerName $domain
ServerAlias www.$domain
Redirect permanent / https://$domain/
</VirtualHost>
<VirtualHost *:443>
ServerName $domain
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem
SSLVerifyClient None
DocumentRoot /path/to/webshop/$customer
</VirtualHost>
<VirtualHost *:443>
ServerName www.$domain
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem
SSLVerifyClient None
Redirect permanent / https://$domain/
</VirtualHost>
</Macro>
В этом случае добавить новый домен клиента будет просто:
Используйте идентификатор клиента CustomWebShopDomain example.com
Ваш сценарий может добавить эту строку в конфигурацию, а затем перезагрузить веб-сервер Apache:
printf "%s\n" "Использовать CustomWebShopDomain $2 $1" \
>> /etc/apache2/conf-enabled/custdomain-use.conf
systemctl перезагрузить apache2
Обязательно удаляйте просроченные домены
Certbot добавляет все домены для автоматического продления. Если эти продления начинают давать сбои, вы не хотите, чтобы эти домены оставались в конфигурации навсегда. Лучше всего автоматизировать удаление, т.е.
- Удалить конфигурацию Certbot
/etc/letsencrypt/renewal/example.com
- Удалить
Используйте идентификатор клиента CustomWebShopDomain example.com
линия.