2

更新: SSL 経由でこれを機能させることはできませんでした。セキュリティを確保するために、VPNを実装することになりました。

私はこの問題を 2 日間トラブルシューティングしてきましたが、一生解決できません。次のスレッドを確認しました。

javax.net.ssl.SSLHandshakeException の解決: sun.security.validator.ValidatorException: PKIX パスの構築に失敗しました エラー?

https://stackoverflow.com/questions/14465089/ssl-connection-in-glassfish-3-1

他の多くの中で。

更新: 申し訳ありませんが、エラーを投稿していませんでした。ここにあります:

javax.naming.CommunicationException: simple bind failed: server.local:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

Win7 pro で GlassFish サーバー 3.1.2 と NetBeans 7.3 も使用しています。

エラーの原因となっているコードは次のとおりです。

Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://server.local:636/");

// Specify SSL
env.put(Context.SECURITY_PROTOCOL, "ssl");

// Fill in secuirty/bind variables
env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
env.put(Context.SECURITY_PRINCIPAL, config.Config.getSECURITY_PRINCIPAL()); //returns user@domain.local
env.put(Context.SECURITY_CREDENTIALS, config.Config.getSECURITY_CREDENTIALS()); //returns password

// Create the initial context
ctx =  new InitialDirContext(env); //defined above as InitialDirContext ctx = null;

ldp.exeADサーバーでSSLが適切に構成されていることを確認するために使用しました。さらに、私は次のことを試しました:

  1. ここで説明されているように、クライアント証明書 (および AD CS からの CA ルート証明書) をインポートします。

を。次のコマンドを使用しました。

C:\Program Files (x86)\Java\jdk1.7.0_25>bin\keytool -import -file SBS2011.sage.local_sage-SBS2011-CA.crt -keystore .\jre\lib\security\cacerts -alias SBS2011
Enter keystore password:
Certificate already exists in keystore under alias <mykey>
Do you still want to add it? [no]:  yes
Certificate was added to keystore

C:\Program Files (x86)\Java\jdk1.7.0_25>

  1. Java をアンインストールして再インストールし、手順 1 を繰り返します。

  2. 次のコード行を追加します。

    System.setProperty("javax.net.ssl.trustStore", "C:\\Program Files (x86)\\Java\\jdk1.7.0_25\\jre\\lib\\security\\cacerts");

    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

その他の注意事項: コードは非 SSL 接続を使用して正常に動作しますが、ユーザーの情報を更新しようとすると LDAP エラー 53 が発生します。最後に、SSL を使用しないという解決策があれば、私は気にしません。

4

1 に答える 1

4

トラストストアが LDAP サーバー証明書を信頼していません。

上記のステップ (3) がデフォルトです。

LDAP サーバーに CA 署名付き証明書がある場合、手順 (1) は不要です。

インポートする必要がある可能性があるLDAP サーバーの証明書であるのに、なぜ「クライアント証明書」について話しているのかわかりません。

env.put(Context.PROVIDER_URL, "ldap://server.local:636/");

する必要があります

env.put(Context.PROVIDER_URL, "ldaps://server.local:636/");
于 2013-06-28T02:12:10.310 に答える