apache - 使用 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
指令,这似乎正是我所需要的,但是用户名字段始终为空。有什么建议么?
解决方案
我让它与以下配置一起使用。只有具有由证书签名的密钥对的用户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>
推荐阅读
- java - 如何将输出值保存到字符串变量?
- c - 读取时的位域元素在 C 中给出不同的值
- java - 如何将字符串的字符与数组的索引匹配
- java - 在另一个类中调用 OkHttp 的 OnResponse 中的 UI 线程
- ios - 由于内存泄漏,ReactNative iOS 应用程序崩溃
- android - 如何链接到硬件条码扫描器?
- haskell - 这是类型声明吗?
- database - tfdquery.aggregates 可以用作 autoIDgenerator
- java - 为什么我的 sql 中出现运行时错误,提示语法错误?
- scala - 如何将数据帧的单行转换为 Scala 中的字符串?