1

認証付きのhttps経由でサービスに接続するモジュールを作成しました。キーストアへの適切なパスを設定すると、正常に機能します。Tomcat アプリケーションでそのモジュールを (jar として) 使用したいときに問題があります。キーストアにも適切なパス(絶対パス)を設定しましたが、接続しようとするとハンドシェイク例外が発生します

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

以前、キーストアが間違っていたときにこのメッセージを受け取ったことを覚えています。Tomcatで動作させるために、それ以上何かをする必要がありますか? 私が見逃した他の問題はありますか?認証なしで https 経由で別のサービスに接続すると、これは正常に機能します (Tomcat アプリで)。

編集: 問題は、(Tomcat だけでなく) ssl を介してさまざまなサービスに接続するプロジェクトを実行することでした。1 つは認証あり、もう 1 つは認証なしです。ということでタイトル編集

4

2 に答える 2

1

もう一度自分自身に答えを出しています。SSLContextスコープを制御する方法を読んだ後、同じことをすることにしましたが、うまくいきました。デフォルトでは、trustStore を設定していないため (デフォルトの cacerts が使用されます)、認証が必要な場合は使用します

httpsUrlConnection.setSSLSocketFactory(getSSLContext().getSocketFactory());

getSSLContext() が上で書いたものを返すとき (setDefault なし)

Tomcat アプリでデフォルトの SSLContext を変更する方法を知りたいので、誰かが助けてくれれば感謝します

于 2012-04-03T12:29:46.047 に答える
1

同じJVMに複数のトラストストアを設定すると、答えが得られました。キーファクトリとトラストファクトリを設定するだけで済み、機能します:)

System.setProperty は、既に設定されている ssl プロパティを設定しません。

    // load your key store as a stream and initialize a KeyStore
    InputStream trustStream = new FileInputStream("Resources/keystore.ImportKey");
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

    // if your store is password protected then declare it (it can be null however)
    String trustPassword = "changeit";

    // load the stream to your store
    trustStore.load(trustStream, trustPassword.toCharArray());

    // initialize a trust manager factory with the trusted store
    TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustFactory.init(trustStore);

    KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyFactory.init(trustStore, trustPassword.toCharArray());

    // get the trust managers from the factory
    TrustManager[] trustManagers = trustFactory.getTrustManagers();
    KeyManager[] keyManagers = keyFactory.getKeyManagers();

    // initialize an ssl context to use these managers and set as default
    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(keyManagers, trustManagers, null);
    SSLContext.setDefault(sslContext);

うまくいきます!

于 2012-04-03T08:21:24.833 に答える