web-dev-qa-db-ja.com

SSL / TLSに独自のCAを使用するLDAPベースのApache認証(mod_ldap + mod_authnz_ldap)

解決済み:問題は、同じ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.confTLS_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であると表示されます
2
CDuv

さて、最初に証明書の信頼が実際に問題であることを確認しましょう。 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
4
Shane Madden