首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中获取默认系统信任存储的SSLContext (JSEE)

在Java中获取默认系统信任存储的SSLContext (JSEE)
EN

Stack Overflow用户
提问于 2015-05-29 00:30:21
回答 2查看 21.1K关注 0票数 10

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

更新:我所使用的代码是

代码语言:javascript
复制
    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());
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-30 01:54:21

如果没有使用自定义上下文,javax.net.ssl.*系统属性将影响默认的SSLContext,即SSLSocketFactory.getDefault()使用的SSLContextSSLContext.getDefault()返回的SSLContext.getDefault()

如果希望保留某些连接(而不是使用这些自签名证书的连接)使用默认信任存储的能力,则不应该使用这些属性。相反,您应该让其他连接使用为这些自签名证书构建的SSLContext。(如果不使用JRE中的私有API,您就不能真正地使用get the default trust store with certainty otherwise。)

由于您使用的库允许您指定一个SSLSocketFactory,所以当您想要使用它时,可以从您的自定义SSLContext中构建它。(如果需要,还可以从默认的SSLContext为其他情况构建一个,但这通常是隐含的,如果该库重置连接之间的设置。)

票数 6
EN

Stack Overflow用户

发布于 2015-05-30 00:21:18

使用默认信任存储时,不指定其他存储。如果省略javax.net.ssl.trustStorejavax.net.ssl.trustStorePassword参数,将使用默认值。(供参考的是$JAVA_HOME/jre/lib/security/cacertschangeit (是的,真的))。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30519267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档