Apache:如何“隐藏”子域名但通过 https 提供服务

Apache:如何“隐藏”子域名但通过 https 提供服务

我会坦然承认我的无知 —— 或者也许我的知识足以造成危险。

我有一个为 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>

您应该删除OrderAllow指令。这些是旧式 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

至少有三种方法可以解决这个问题:

  1. 使用DNS 挑战,无需 HTTP 连接
  2. .well-known/禁用-path的基本身份验证由 certbot 使用。
  3. 使用 certbot 的独立模块。这将导致 10-20 秒的停机时间

答案3

一种可能的方法是添加虚拟主机的访问限制,如下所示:

<Directory "/www/docs/db">
    <RequireAll>
        Require ip <localip> <certbot host-name>
    </RequireAll>
</Directory>

有关Require指令的更多信息,请访问Apache 文档

相关内容