获取Java(JSEE)中的默认系统信任库的SSLContext

时间:2015-05-29 00:30:21

标签: java security ssl default

我通过指定 javax.net.ssl.keyStore javax.net.ssl.keyStorePassword 在我的程序中使用自定义密钥库javax.net.ssl.trustStore javax.net.ssl.trustStorePassword 。我的信任库包含自签名证书。现在我想做一些https请求(比如https://google.com)并使用默认的jre系统trusstore,其中包含有关不同CA的信息。要发出http请求,我使用OkHttp库。它的客户端可以选择指定 SslSocketFactory ,但要获得它,我需要为默认的jre信任库初始化 SSLContext 。我怎么能这样做?

更新: 我带的代码是

    KeyStore keyStore = KeyStore.getInstance("JKS");

    // load default jvm keystore
    keyStore.load(new FileInputStream(
            System.getProperties()
                  .getProperty("java.home") + File.separator
                + "lib" + File.separator + "security" + File.separator
                + "cacerts"), "changeit".toCharArray());

    TrustManagerFactory tmf = TrustManagerFactory.getInstance(
            TrustManagerFactory.getDefaultAlgorithm());

    tmf.init(keyStore);

    SSLContext ctx = SSLContext.getInstance("TLS");

    ctx.init(null, tmf.getTrustManagers(), new SecureRandom());

2 个答案:

答案 0 :(得分:3)

javax.net.ssl.*系统属性会影响默认SSLContextSSLSocketFactory.getDefault()使用的属性和SSLContext.getDefault()返回的属性,如果您还没有使用{{1}使用自定义上下文,即。

如果要保留对某些连接使用默认信任库的能力(而不是使用这些自签名证书的连接),则不应使用这些属性。相反,您应该使其他连接使用为这些自签名证书构建的SSLContext.setDefault(...)。 (你真的不能get the default trust store with certainty otherwise,至少在没有使用JRE中的私有API时也是如此。)

由于您使用的库允许您指定SSLContext,因此在您想要使用它时,可以从自定义SSLSocketFactory构建一个库。 (如果需要,您也可以根据默认SSLContext为其他情况构建一个,但如果该库在连接之间重置其设置,则通常暗示这一点。)

答案 1 :(得分:2)

您通过不指定其他信任库来使用默认信任库。如果省略javax.net.ssl.trustStorejavax.net.ssl.trustStorePassword参数,则将使用默认值。 (作为参考,这是$JAVA_HOME/jre/lib/security/cacertschangeit(是的,真的))。