我会坦然承认我的无知 —— 或者也许我的知识足以造成危险。
我有一个为 phpMyAdmin 实用程序提供服务的子域http://db.<mydomain>.com
。它目前位于一个目录中,其中包含一条 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>
部分- 这样 certbot 就可以“验证 ACME 挑战”。例如:/.well-known/
<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 文档。