OPENLDAP LDAP で証明書ベースの認証を実行したいと考えています。
PKIを作成し、適切なキーストア、トラストストア/証明書、キーを使用してクライアントとサーバーをセットアップしました。また、SSL ハンドシェーク中に証明書を要求するように LDAP を構成します。
次に、次のように UnboudID LDAP で認証しようとしました。
//Create a unsecured connection
LDAPConnection connection = new LDAPConnection(hostname,port);
//Secure the connection by the use of SSL (StartTLS operation)
SSLUtil ssl = new SSLUtil(new KeyStoreKeyManager(keyStore, new String("somePasword").toCharArray()),
new TrustStoreTrustManager(trustStore));
SSLContext sslContext = ssl.createSSLContext();
StartTLSExtendedRequest startTLSRequest = new StartTLSExtendedRequest(sslContext);
ExtendedResult startTLSResult = connection.processExtendedOperation(startTLSRequest);
//Bind request that should retrieve information from the client certificate and authenticate the client
BindRequest bindRequest = new EXTERNALBindRequest("");
BindResult bindResult = connection.bind(bindRequest);
//The result is always SUCCESS...
if (bindResult.getResultCode() != ResultCode.SUCCESS) {
...
}
接続をバインドするユーザーの DN は、次のものに対応します
cn=12345,ou=anOrganizationUnit,o=anOrganization,dc=com,dc=example
。証明書からの DN は次のようcn=12345,ou=...,o=...,l=Berlin,st=some-state,c=de
に見えるため、LDAP で一致ルールも作成しました。
CA によって署名された証明書を取得するとすぐに、bindRequest は常に成功します。LDAP からの DN が LDAP 内の何にも対応しない場合、それは問題ではありません。匿名接続に変換されていると思います。ただし、既存のユーザーに該当する場合は、それも問題ありません。ユーザーは認証されておらず、ユーザーの権限にアクセスできません。私は WhoAmI リクエストを実行しようとしましたが、次のように返されました:
authzId
=dn:cn=12345,ou=anorganizationunit,o=anorganization,dc=com,dc=example
これは良いようです (大文字が小文字に変換されています)。
LDAP 構成で見逃したものはありますか? またはそれは私の証明書でしょうか?
どんな助けにも本当に感謝します:)
編集: それが役立つかどうかはわかりませんが、一致するルールを追加する前に、WhoAmI リクエストを実行したところ、結果は次のようになりました
dn:cn\3D12345\2C...,o=organization,dc=com,dc=example
。証明書の作成時に入力した共通名がエスケープされているようです (\3D は「=」、\2C は「,」)。