首页 > 解决方案 > 使用 LDAP 授权的 Apache 客户端证书身份验证

问题描述

对于 Apache,我正在尝试使用客户端证书对用户进行身份验证,并使用 LDAP 组对其进行授权。到目前为止,我有这个:

# Apache 2.4.6

LoadModule ssl_module modules/mod_ssl.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so

Listen 9999
<VirtualHost *:9999>
    ServerName example
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/certs/server.key
    SSLCACertificateFile /etc/ssl/certs/ca.crt
    SSLVerifyClient require
    SSLVerifyDepth 1
    SSLOptions +FakeBasicAuth

    <Location /test/>
        # SSLUserName SSL_CLIENT_S_DN_CN
        # AuthBasicFake "%{SSL_CLIENT_S_DN_CN}"
        AuthType basic
        AuthName "Cert"
        AuthBasicProvider ldap

        AuthLDAPURL "ldap://localhost/dc=example?uid"
        AuthLDAPBindDN "cn=admin,dc=example"
        AuthLDAPBindPassword "test123"
        AuthLDAPGroupAttribute uniqueMember

        Require ldap-group cn=admin,ou=groups,dc=example
    </Location>
</VirtualHost>

它在大多数情况下都有效,但是用户名最终为/C=XX/L=Default City/O=Default Company Ltd/CN=testuser(即来自 X.509 主题字段的完整 DN),而我希望它只是testuser(即只是 CN,SSL_CLIENT_S_DN_CN)。

我尝试使用该AuthBasicFake指令,这似乎正是我所需要的,但是用户名字段始终为空。有什么建议么?

标签: apacheauthenticationldapauthorizationssl-certificate

解决方案


我让它与以下配置一起使用。只有具有由证书签名的密钥对的用户SSLCACertificateFile才能进行身份验证。在我的 LDAP 中,所有用户都属于该cn=user,ou=groups,dc=example组,并且默认可以访问整个站点。但是,一些用户也属于cn=admin,ou=groups,dc=example,这将使他们能够访问/admin-panel.

LoadModule ssl_module modules/mod_ssl.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so

Listen 9999
<VirtualHost *:9999>
    ServerName www.example.com
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/certs/server.key
    SSLCACertificateFile /etc/ssl/certs/ca.crt
    SSLVerifyClient require
    SSLVerifyDepth 1
    SSLUserName SSL_CLIENT_S_DN_CN

    <Location />
        AuthType basic
        AuthName "Cert"
        AuthBasicProvider ldap

        AuthLDAPURL "ldap://localhost/dc=example?uid"
        AuthLDAPBindDN "cn=admin,dc=example"
        AuthLDAPBindPassword "test123"
        AuthLDAPGroupAttribute uniqueMember

        Require ldap-group cn=user,ou=groups,dc=example
    </Location>

    <Location "/admin-panel">
        Require ldap-group cn=admin,ou=groups,dc=example
    </Location>
</VirtualHost>

推荐阅读