我々は異なるLDAPサーバーに接続しなければならないアプリケーションを書いています。各サーバーについて、特定の証明書のみを受け入れることができます。その証明書のホスト名は重要ではありません。 StartTlsResponse.setHostnameVerifier(..-)
を使用し、と一致するStartTlsResponse.negotiate(...)
を使用できるため、LDAPとSTARTTLSを使用すると簡単です。しかし、LDAPS接続もサポートする必要があります。 Javaはこれをネイティブにサポートしていますが、サーバー証明書がデフォルトのJavaキーストアによって信頼されている場合のみです。これを置き換えることはできますが、サーバーごとに異なるキーストアを使用することはできません。JNDI LDAPSカスタムのHostnameVerifierとのTrustManager
Hashtable<String,String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, (encryption == SSL ? "ldaps://" : "ldap://") + host + ":" + port);
if (encryption == SSL) {
// env.put("java.naming.ldap.factory.socket", "CustomSocketFactory");
}
ctx = new InitialLdapContext(env, null);
if (encryption != START_TLS)
tls = null;
else {
tls = (StartTlsResponse) ctx.extendedOperation(new StartTlsRequest());
tls.setHostnameVerifier(hostnameVerifier);
tls.negotiate(sslContext.getSocketFactory());
}
我々は独自のCustomSocketFactory
を追加することもできますが、どのように情報を渡すために、次のよう
既存の接続コードはありますか?
...についての一票を心配するつもりはありませんあなたが書いたことが間違っているとは決して言わなかった。ちょうどその情報が私の質問ですでに言及されていて、決してその質問を解決するのに全く役立たなかった。だから私は落ち込んだ。それがダウン投票の正当な理由でないなら、私はそのダウンワードを削除しますが、EJPのupvote(これは私のdownvoteをクリアする唯一の手段です)は残っていて無駄な答えを投票するので、私はしません。 – Bruno
...だから基本的に、あなたはあなたがdownvotedてきたと述べてきた私の答え、の継続中に右であるあなた自身の答えを生産してきた –
私が言ったように、編集する前に十分に公正ですが、OpenJDKコードの理由を示す答えを得ると、静的メンバー(これまで行っていたもの)やJDNIなどを使用しない限り、それはあなたの質問に対する答えの点だと思います。そして、自分の答えを受け入れました。これは、私が提案した線に沿ってはっきりとしていました。私はdownvoteについてはあまり気にしませんし、あなた自身の答えを受け入れたという事実は気にしません(あなたが 'ThreadLocal'でより具体的だからです)。私はちょうどdownvoting + downvoted答え奇妙から派生した自分の答えを受け入れるを見つける。 – Bruno