Я открыто признаю свое невежество — или, может быть, достаточные знания, чтобы представлять опасность.
У меня есть поддомен http://db.<mydomain>.com
, который обслуживает утилиту phpMyAdmin. В настоящее время он находится в каталоге с директивой Apache, требующей действительного пользователя из .htaccess, что имело смысл в то время, поскольку я не хотел выставлять страницу входа в phpMyAdmin для широкой публики.
Проблема возникла при попытке использовать cert-bot для создания SSL-сертификатов для моего сайта. Он не может проверить вызов ACME, поскольку вызов не может обойти ограничение .htaccess.
Как можно одновременно обслуживать этот поддомен по протоколу https и при этом требовать дополнительный уровень безопасности, прежде чем пользователь сможет увидеть страницу входа в phpMyAdmin?
<VirtualHost *:80>
ServerName db.<mydomain>.com
ServerAlias www.db.<mydomain>.com
DocumentRoot /var/www/subdomains/db/phpMyAdmin
</VirtualHost>
<Directory "/var/www/subdomains/db">
Options Indexes FollowSymLinks ExecCGI
Order allow,deny
Allow from all
AuthType Basic
AuthUserFile "/var/www/.htpasswd-users"
require valid-user
</Directory>
решение1
<Directory "/var/www/subdomains/db"> Options Indexes FollowSymLinks ExecCGI Order allow,deny Allow from all AuthType Basic AuthUserFile "/var/www/.htpasswd-users" require valid-user </Directory>
Вам следует удалить директивы Order
и Allow
. Это директивы Apache 2.2 старого образца, которые ранее были устарели в Apache 2.4 и, скорее всего, вызовут конфликты (но они в любом случае не требуются).
Хотя любопытно, почему у вас есть <Directory>
раздел для /var/www/subdomains/db
, но при этом DocumentRoot
определяется как /var/www/subdomains/db/phpMyAdmin
?
Затем добавьте дополнительный <Directory>
раздел для /.well-known/
пути к файлу, в котором вы разрешаете неограниченный доступ, чтобы certbot мог «проверить вызов ACME». Например:
<Directory "/var/www/subdomains/db/phpMyAdmin/.well-known">
Require all granted
</Directory>
решение2
Есть как минимум три способа решить эту проблему:
- ИспользоватьDNS-вызов, не требующий HTTP-соединения
- Отключить базовую аутентификацию для
.well-known/
-pathкоторый используется certbot. - Использовать автономный модуль certbot. Это приведет к простою в 10-20 секунд
решение3
Одним из возможных способов является добавление ограничений доступа для виртуального хоста следующим образом:
<Directory "/www/docs/db">
<RequireAll>
Require ip <localip> <certbot host-name>
</RequireAll>
</Directory>
Более подробную информацию о Require
директиве вы можете найти на сайтеApache-документ.