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 应用程序中)。

编辑:问题是运行一个通过 ssl 连接到不同服务的项目(不仅在 Tomcat 中)。一个有身份验证,第二个没有。所以我编辑了标题

4

2 回答 2

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 回答
1

我再次给自己一个答案。在阅读了如何控制 SSLContext 范围后,我决定做同样的事情并且效果很好。默认情况下,我没有设置任何 trustStore(所以使用默认的 cacerts),当我需要进行身份验证时,我使用

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

当 getSSLContext() 返回我上面写的(没有 setDefault)

我想知道如何在 Tomcat 应用程序中更改默认 SSLContext,所以如果有人可以提供帮助,我将不胜感激

于 2012-04-03T12:29:46.047 回答