解決済み:問題は、同じFQDNに古い証明書を使用して、さまざまな構成ファイルでレガシーLDAPTrustedGlobalCert
ディレクティブを忘れたことが原因であることが判明しました
tl; dr:自己署名CAを使用しており、証明書の検証を無効にするディレクティブを使用する必要はありませんでした。mod_ldap
に対してApacheに自己署名CAを信頼させる方法は?
LDAPディレクトリをユーザーベースとして使用して、HTTP認証用にApacheWebサーバーを構成しようとしています。
暗号化されていないモードではすべて正常に機能しますが、SSLまたはSTARTTLSを使用したHTTP500エラーコードで失敗します。
これが私の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-certificatesDebianパッケージによって生成されます)。 LDAPTrustedGlobalCert
をrootCAまたは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]
自己管理されたルートCA(自己署名)と、WebサーバーおよびLDAPサーバーの証明書に署名するいくつかのサブCAを備えたPKIを使用しています。サーバーにサブCAPEMファイルを追加し、ca-certificatesDebianパッケージとldap.conf(TLS_CACERT
)、LDAPは、Linux PAM(libnss-ldapdの場合、暗号化されていないプレーン(ポート389)、StartTLS(ポート389)、SSL(ポート636)を介して正常にアクセスできます。 )Debianパッケージ)およびLDAPブラウザソフトウェア。
受信した証明書をチェックしてrootCAを信頼するようにApacheに指示するにはどうすればよいですか?
@ 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
を実行すると、証明書はOKであると表示されますさて、最初に証明書の信頼が実際に問題であることを確認しましょう。 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