客户端证书认证 Apache 2.2

客户端证书认证 Apache 2.2

我在 Debian Linux 上有一个由 Apache 2.2 运行的 Web 服务器。我在 Apache 中有一个根 CA 和一个中间 CA。中间 CA 创建了我的 Web 服务器证书以及客户端证书。当我的 RADIUS 服务器提示我输入凭据时,我想使用客户端证书的 CN 作为用户名。我正在查看 Apache 的网站,似乎有一些功能很有用(例如 AuthBasicFake),但是这些功能仅在 Apache 2.4 中可用。有人知道解决这个问题的方法吗?

答案1

由于我的 Debian 版本是 Wheezy (7),因此我不得不使用 apache 2.2 并使用巧妙的解决方法。这是我的 Apache 配置(省略了几行):

AddRadiusAuth ~~~~~~~~~~~~~~:1812 ~~~~~~~~~ 5:3
AddRadiusCookieValid 60

SSLEngine On
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLHonorCipherOrder On
SSLOptions +FakeBasicAuth

SSLCertificateFile ~~~~~~~~~~~~~~~~~~~~~~
SSLCertificateKeyFile ~~~~~~~~~~~~~~~~~~~~~~
SSLCACertificateFile ~~~~~~~~~~~~~~~~~~~~~~
SSLCACertificatePath ~~~~~~~~~~~~~~~~~~~~~~

<Directory /var/www/>
    SSLVerifyClient require
    SSLVerifyDepth 10
    SSLOptions +StdEnvVars

    Options Indexes FollowSymLinks MultiViews
    DirectoryIndex /cgi-bin/index.html

    AllowOverride None
    Order allow,deny
    Allow from all

    AddHandler mod_python .py
    PythonHandler mod_python.publisher
    PythonDebug On

    AuthType Basic
    AuthName "RADIUS authentication for localhost"
    AuthBasicAuthoritative off
    AuthRadiusAuthoritative on
    AuthBasicProvider radius
    AuthRadiusActive On
    Require valid-user
</Directory>

SSLOptions +FakeBasicAuth获取我证书中的所有内容并将其用作用户名,密码为“password”。我已配置 RADIUS 来检查用户名和密码。所以我所做的是创建客户端证书并仅包含 CN“ExampleName”。我将客户端证书加载到我的浏览器中,并在每次使用时启用密码保护。Apache 将“ExampleName”读取为“/CN=ExampleName”并将其传递给 RADIUS。但是出于某种原因(我猜转义字符与此有关),RADIUS 将“/CN=ExampleName”读取为“/CN=3DExampleName”。所以当我配置用户名和密码时,它必须是:“/CN=3DExampleName”和“password”。

当我访问我的网站时,我选择证书,输入我的密码(不是“password”,而是我在设置密码保护时选择的密码)。然后 RADIUS 要求输入用户名和密码。我什么都没输入,单击确定,它就起作用了。我猜 FakeBasicAuth (Apache) 将用户名“/CN=ExampleName”(变为“/CN=3DExampleName”)和密码“password”传递给 RADIUS。

抱歉回复这么长(针对我自己的问题)。有时我会陷入困境,也许这会在将来对某人有所帮助。此外,如果有人有更好的解决方法,而无需将我的 Debian 更新为 Jessie (8) 或 Apache 2.4,请告诉我。

相关内容