通过指定javax.net.ssl.keyStore,javax.net.ssl.keyStorePassword,javax.net.ssl.trustStore,javax.net.ssl.trustStorePassword.,我一直在程序中使用自定义密钥存储库我的信任库包含自签名证书。现在,我想提出一些https请求(比如https://google.com),并使用默认的,其中包含有关不同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());发布于 2015-05-30 01:54:21
如果没有使用自定义上下文,javax.net.ssl.*系统属性将影响默认的SSLContext,即SSLSocketFactory.getDefault()使用的SSLContext和SSLContext.getDefault()返回的SSLContext.getDefault()。
如果希望保留某些连接(而不是使用这些自签名证书的连接)使用默认信任存储的能力,则不应该使用这些属性。相反,您应该让其他连接使用为这些自签名证书构建的SSLContext。(如果不使用JRE中的私有API,您就不能真正地使用get the default trust store with certainty otherwise。)
由于您使用的库允许您指定一个SSLSocketFactory,所以当您想要使用它时,可以从您的自定义SSLContext中构建它。(如果需要,还可以从默认的SSLContext为其他情况构建一个,但这通常是隐含的,如果该库重置连接之间的设置。)
发布于 2015-05-30 00:21:18
使用默认信任存储时,不指定其他存储。如果省略javax.net.ssl.trustStore和javax.net.ssl.trustStorePassword参数,将使用默认值。(供参考的是$JAVA_HOME/jre/lib/security/cacerts和changeit (是的,真的))。
https://stackoverflow.com/questions/30519267
复制相似问题