使用自己的CA for SSL / TLS的基于LDAP的Apache auth(mod_ldap + mod_authnz_ldap)

已解决:原来的问题是由于在各种configuration文件中遗忘了遗留的LDAPTrustedGlobalCert指令而造成的,对于相同的FQDN使用旧证书

tl; dr:我们使用一个自签名的CA,我们从来不必使用禁用证书validation的指令:如何让Apache信任我们的mod_ldap自签名CA?

我正在尝试将我的Apache Web服务器configuration为使用LDAP目录作为用户基的HTTP身份validation。

一切工作正常在非encryption模式,但与SSL或STARTTLS HTTP 500错误代码失败。

这是我的Apacheconfiguration:

 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-certificates Debian软件包生成)的串联。 我已经尝试了将LDAPTrustedGlobalCert指向LDAPTrustedGlobalCert或签署了ldap.example.com证书的subCA:同样的问题。

error.log说:

 # 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] 

我们正在使用具有自我pipe理的根CA(自签名)的PKI和为Web和LDAP服务器签署证书的多个子CA. 通过在我们的服务器上添加子CA PEM文件并configurationca-certificates Debian软件包和ldap.conf (对于TLS_CACERT ),可以通过普通的非encryption(端口389),StartTLS(端口389)和SSL (端口636)用于Linux PAM( libnss-ldapd Debian软件包)和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表示证书正常

那么,首先让我们确authentication书信任实际上是问题。 它是否与LDAPVerifyServerCert Off

另外,让我们确认LDAP服务正在与可以工作的证书进行交谈。 连接到它:

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

如果只是发送它的主机证书,而不是签发它的中间或根证书,则需要使用Apache明确信任中间证书。

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

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