Apache 基本身份验证能否在自定义 SSL 端口上正常工作

Apache 基本身份验证能否在自定义 SSL 端口上正常工作

这是针对运行 Apache 2.2 的旧系统,出于各种原因,安全 Web 服务器无法在端口 443 上运行(该端口已被其他程序使用)。因此,它配置为在端口 8443 上运行,我在非 SSL 配置中加入了以下行,它将所有对“管理”页面的请求重定向到安全连接:

RewriteRule ^/admin(.*)$ https://%{SERVER_NAME}:8443/admin [R=302,L]

这很好用-如果您尝试浏览到:

http://server.com/admin

您已正确重定向至:

https://server.com:8443/admin

此时,将出现一个身份验证表单,用于登录,并AuthType设置为Digest。这似乎工作正常,但在输入有效的用户名和密码后,浏览器将重定向到:

https://server.com/admin
^^^^^             ^

注意缺少的端口号。现在,如果你首先在浏览器中输入完整正确的地址:

https://server.com:8443/admin

然后出现相同的 apache 身份验证表单,但这次登录后,端口号保留,并显示管理页面。

因此,我的问题是,在不更改端口号的情况下,我能否以保留端口号的方式将非 SSL 页面重定向到 SSL 页面身份验证?我在 Auth Digest 文档中找不到有关端口号的任何信息,但我推测这与原始 URI(来自浏览器请求或重写规则)有关。

答案1

基本身份验证可以在任何端口上进行。基本身份验证还会对特定资源进行身份验证,并且根本不涉及任何重定向:相反,它只是在密码对话框之后再次请求相同的 URL,但这次 HTTP 请求中包含凭据。由于基本身份验证不涉及重定向,这意味着您看到的重定向不是由身份验证引起的,而是在您的配置中的某个地方明确配置的。

答案2

我创建了一个最小的测试用例,思考就是答案。如果不是这种情况,或者这只是一个糟糕的黑客解决方法,请评论。

非 SSL 配置:

<VirtualHost *:80>
    ServerName server.com
    RewriteEngine On

    RewriteRule ^/secret(.*)$ https://%{SERVER_NAME}:8443/secret [R=302,L]
    RewriteRule ^/public(.*)$ https://%{SERVER_NAME}:8443/public [R=302,L]
</VirtualHost>

SSL 配置:

LoadModule ssl_module modules/mod_ssl.so
NameVirtualHost *:8443
Listen *:8443

<VirtualHost *:8443>
    ServerName server.com:8443
    UseCanonicalName On
    SSLEngine on

    # SSL cert/key
    SSLCertificateFile /path/to/cert.crt
    SSLCertificateChainFile /path/to/cert.chain.crt
    SSLCertificateKeyFile /path/to/cert.key

    DocumentRoot    "/var/www"

    <Directory "/var/www/public">
      DirectoryIndex index.html index.php
      Options -Indexes FollowSymlinks
      Order allow,deny
      Allow from all
    </Directory>

    <Directory "/var/www/secret">
      DirectoryIndex index.php index.html
      AuthName "Secret Pages"
      AuthType Digest
      AuthUserFile /etc/httpd/test-digests
      Require valid-user
      Options -Indexes FollowSymlinks
      AllowOverride None
      Order allow,deny
      Allow from localhost.localdomain
      Satisfy any
    </Directory>

</VirtualHost>

请注意ServerNameSSL 配置中的行。如果我将非标准端口放在那里,那么一旦输入用户名/密码,摘要重定向似乎就会使用标准 https 端口 443,这会导致我在原始问题中概述的行为。一旦端口在那里,行为就会符合要求。

因此,至少从这一点来看,如果 SSL 在非标准端口上运行,并使用 Digest(或者我猜是 Basic)Apache 身份验证,则必须在 ServerName 配置中指定端口。这是我在文档中没有看到的内容。

相关内容