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

vko*_*kiy 7 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 truststore 初始化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());
Run Code Online (Sandbox Code Playgroud)

Bru*_*uno 5

javax.net.ssl.*系统属性将影响默认SSLContext,一个是使用SSLSocketFactory.getDefault()和一个由归国SSLContext.getDefault(),如果你还没有使用SSLContext.setDefault(...)使用自定义背景,那就是。

如果您想保留对某些连接使用默认信任库的能力(而不是您使用这些自签名证书的连接),则不应使用这些属性。相反,您应该让其他连接使用SSLContext为这些自签名证书构建的。(否则,您无法真正确定地获得默认信任存储,至少在不使用 JRE 中的私有 API 的情况下不会。)

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