基于 LDAP 的 Apache 身份验证(mod_ldap + mod_authnz_ldap),使用自己的 CA 进行 SSL/TLS

基于 LDAP 的 Apache 身份验证(mod_ldap + mod_authnz_ldap),使用自己的 CA 进行 SSL/TLS

已解决:问题是由于忘记了LDAPTrustedGlobalCert各种配置文件中的遗留指令,对同一 FQDN 使用旧证书而导致的

tl;dr:我们使用自签名 CA,并且我们从来不需要使用禁用证书验证的指令:如何让 Apache 信任我们的自签名 CA mod_ldap

我正在尝试配置我的 Apache Web 服务器以使用 LDAP 目录作为用户基础进行 HTTP 身份验证。

在非加密模式下一切正常,但在使用 SSL 或 STARTTLS 时会失败并出现 HTTP 500 错误代码。

这是我的 Apache 配置:

AuthType Basic
AuthName "WebServer"
AuthBasicProvider ldap
AuthzLDAPAuthoritative on

# Plain:
AuthLDAPURL "ldap://ldap.example.com/dc=example,dc=local?uid?sub?(objectClass=person)"

# SSL:
LDAPTrustedGlobalCert CA_BASE64 /etc/ssl/certs/ca-certificates.crt
AuthLDAPURL "ldaps://ldap.example.com:636/dc=example,dc=local?uid?sub?(objectClass=person)" SSL

# StartTLS
LDAPTrustedGlobalCert CA_BASE64 /etc/ssl/certs/ca-certificates.crt
LDAPTrustedMode TLS
AuthLDAPURL "ldap://ldap.example.com/dc=example,dc=local?uid?sub?(objectClass=person)"

AuthLDAPBindDN "cn=webserver.example.com,ou=Apps,dc=example,dc=local"
AuthLDAPBindPassword "secret"

/etc/ssl/certs/ca-certificates.crt是多个 CA 证书的串联(由ca 证书Debian 软件包)。我已尝试指向LDAPTrustedGlobalCert已签署 ldap.example.com 证书的 rootCA 或 subCA:同样的问题。

错误日志说:

# TLS:
auth_ldap authenticate: user john-doe authentication failed; URI / [LDAP: ldap_start_tls_s() failed][Connect error]

# SSL:
auth_ldap authenticate: user john-doe authentication failed; URI / [LDAP: ldap_simple_bind_s() failed][Can't contact LDAP server]

我们正在使用具有自我管理根 CA(自签名)和多个子 CA 的 PKI,这些子 CA 为 Web 和 LDAP 服务器签署证书。通过在我们的服务器上添加子 CA PEM 文件并配置ca 证书Debian 软件包和ldap配置文件(对于TLS_CACERT),对于 Linux PAM,可以通过普通非加密(端口 389)、StartTLS(端口 389)和 SSL(端口 636)成功访问 LDAP(libnss-ldapdDebian 软件包)和 LDAP 浏览器软件。

我如何告诉 Apache 检查收到的证书并信任我的 rootCA?

编辑回答@shane-madden 的想法

  • 如果使用的话就可以工作LDAPVerifyServerCert Off
  • openssl s_client -connect ldap.example.com:636 -showcerts返回以下内容:

    CONNECTED(00000003)
    depth=3 CN = ExampleRootCa, O = Example, C = FR
    verify error:num=19:self signed certificate in certificate chain
    verify return:0
    ---
    Certificate chain
     0 s:/CN=ldap.example.com/O=Example/C=FR
       i:/CN=ExampleSrvCa/O=Example/C=FR
    -----BEGIN CERTIFICATE-----
    MIIGcDCCBF
    ...
    iyrFEYDcs=
    -----END CERTIFICATE-----
     1 s:/CN=ExampleSrvCa/O=Example/C=FR
       i:/CN=ExampleMainCa/O=Example/C=FR
    -----BEGIN CERTIFICATE-----
    MIIF2DCCA8
    ...
    GrskgqnaEg
    -----END CERTIFICATE-----
     2 s:/CN=ExampleMainCa/O=Example/C=FR
       i:/CN=ExampleRootCa/O=Example/C=FR
    -----BEGIN CERTIFICATE-----
    MIIF1TCCA7
    ...
    RozDAcZnph
    -----END CERTIFICATE-----
     3 s:/CN=ExampleRootCa/O=Example/C=FR
       i:/CN=ExampleRootCa/O=Example/C=FR
    -----BEGIN CERTIFICATE-----
    MIIFWzCCA0
    ...
    RY5xwHgA==
    -----END CERTIFICATE-----
    ---
    Server certificate
    subject=/CN=ldap.example.com/O=Example/C=FR
    issuer=/CN=ExampleSrvCa/O=Example/C=FR
    ---
    No client certificate CA names sent
    ---
    SSL handshake has read 6410 bytes and written 934 bytes
    ---
    New, TLSv1/SSLv3, Cipher is AES256-SHA256
    Server public key is 4096 bit
    Secure Renegotiation IS supported
    Compression: NONE
    Expansion: NONE
    SSL-Session:
        Protocol  : TLSv1.2
        Cipher    : AES256-SHA256
        Session-ID: ABC...
        Session-ID-ctx:
        Master-Key: DEF...
        Key-Arg   : None
        PSK identity: None
        PSK identity hint: None
        SRP username: None
        Start Time: 1391654253
        Timeout   : 300 (sec)
        Verify return code: 19 (self signed certificate in certificate chain)
    
  • 运行openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt CN=ldap.example.com_O=Example_C=FR.crt表示证书正常

答案1

好吧,首先让我们确认一下证书信任确实是问题所在。它能正常工作吗LDAPVerifyServerCert Off

另外,让我们确认 LDAP 服务正在与可以使用的证书通信;连接到它:

openssl s_client -connect ldap.example.com:636 -showcerts

如果它只是发送其主机证书而不是签名的中间证书或根证书,那么您将需要向 Apache 明确信任中间证书。

获取该连接期间输出的主机证书s_client并将其写入文件,然后验证签名是否正确:

openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt received-cert.crt

相关内容