内部の中間 CA によって署名され、もちろん内部のルート CA によって署名された証明書を持つ LDAP サーバー (Active Directory ドメイン コントローラー) があります。LDAP サーバーが提示する証明書との信頼を確立するには、クライアント側で中間 CA ファイルとルート CA ファイルの両方が必要であると考えていたため、ここで PKI に関する基本的なことを見落としているような気がします。そのため、これらのコマンドの両方が成功する理由がわかりません。最初のコマンドはルート CA と中間 CA の両方を信頼しますが、2 番目のコマンドはルート証明書のみを信頼するという点を除けば、これらは同一です。最初のコマンドは機能すると思っていましたが、2 番目のコマンドは機能しませんでした。(使用していない場合でも出力が同一でありgrep
、.crt ファイルの内容が正しいことを再確認しました。)
何を誤解しているのでしょうか?
export LDAPTLS_CACERT=./chained.crt; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)" | grep result
Enter LDAP Password:
result: 0 Success
export LDAPTLS_CACERT=./root_cert_only.crt; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)" | grep result
Enter LDAP Password:
result: 0 Success
# and just for fun, let's try it without trusting any CAs. it fails as expected.
export LDAPTLS_CACERT=''; ldapsearch -x -W -h ldap.example.com -p 389 -ZZ -D "[email protected]" -b "OU=users,OU=example,DC=com" "(cn=testuser)"
ldap_start_tls: Connect error (-11)
additional info: TLS error -8179:Peer's Certificate issuer is not recognized.
ldapsearch
注: macOS では環境変数に設定されたパス経由で証明書を信頼できないことを身をもって学びました。上記の出力は Linux (ldapsearch
バージョン 2.4.40)からのものです。
答え1
最初のコマンド (ルート CA と下位 CA の両方を使用) が機能するのは、クライアントがルート証明書を明示的に信頼しているためです (ルート証明書は信頼アンカー ストアにあります)。また、このルートが下位 CA 証明書に署名しているため、クライアントもそれを暗黙的に信頼します。
2番目のコマンドはTLS仕様により機能します州そのサーバーしなければならないサーバー証明書を検証するために必要なすべての証明書を送信します。したがって、LDAP サーバーは自身の証明書を送信し、その後に従属 CA 証明書を送信します。
実際には、両方のコマンドは同じです。最初の例では、クライアントはコマンド ラインとサーバーの両方から下位 CA 証明書を受け取ります。
ルート証明書はすでにクライアントにインストールされ、信頼されている必要があるため、サーバーがルート証明書を送信する必要がないことに注意してください。