在 Java(JSEE) 中获取默认系统信任库的 SSLContext
Get SSLContext for default system truststore in Java(JSEE)
我一直在我的程序中使用自定义密钥库,方法是指定 javax.net.ssl.keyStore、javax.net.ssl.keyStore密码, javax.net.ssl.trustStore,javax.net.ssl.trustStore密码。我的信任库包含自签名证书。现在我想发出一些 https 请求(比如 https://google.com)并使用包含不同 CA 信息的默认 jre 系统 trusstore。要发出 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());
您通过不指定不同的信任库来使用默认信任库。如果省略 javax.net.ssl.trustStore
和 javax.net.ssl.trustStorePassword
参数,您将使用默认值。 (作为参考,$JAVA_HOME/jre/lib/security/cacerts
和 changeit
(是的,真的))。
javax.net.ssl.*
系统属性将影响默认的SSLContext
,SSLSocketFactory.getDefault()
使用的那个和SSLContext.getDefault()
返回的那个,如果你没有使用SSLContext.setDefault(...)
使用自定义上下文,即。
如果您想保留对某些连接(不是您使用这些自签名证书的连接)使用默认信任库的能力,则不应使用这些属性。相反,您应该让其他连接使用为那些自签名证书构建的 SSLContext
。 (你真的不能 get the default trust store with certainty otherwise,至少不能不使用 JRE 中的私有 API。)
由于您使用的库允许您指定一个 SSLSocketFactory
,因此当您想要使用它时,请从您的自定义 SSLContext
构建一个。 (如果需要,您也可以从默认 SSLContext
为其他情况构建一个,尽管这通常是暗示的,如果该库在连接之间重置其设置。)
我一直在我的程序中使用自定义密钥库,方法是指定 javax.net.ssl.keyStore、javax.net.ssl.keyStore密码, javax.net.ssl.trustStore,javax.net.ssl.trustStore密码。我的信任库包含自签名证书。现在我想发出一些 https 请求(比如 https://google.com)并使用包含不同 CA 信息的默认 jre 系统 trusstore。要发出 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());
您通过不指定不同的信任库来使用默认信任库。如果省略 javax.net.ssl.trustStore
和 javax.net.ssl.trustStorePassword
参数,您将使用默认值。 (作为参考,$JAVA_HOME/jre/lib/security/cacerts
和 changeit
(是的,真的))。
javax.net.ssl.*
系统属性将影响默认的SSLContext
,SSLSocketFactory.getDefault()
使用的那个和SSLContext.getDefault()
返回的那个,如果你没有使用SSLContext.setDefault(...)
使用自定义上下文,即。
如果您想保留对某些连接(不是您使用这些自签名证书的连接)使用默认信任库的能力,则不应使用这些属性。相反,您应该让其他连接使用为那些自签名证书构建的 SSLContext
。 (你真的不能 get the default trust store with certainty otherwise,至少不能不使用 JRE 中的私有 API。)
由于您使用的库允许您指定一个 SSLSocketFactory
,因此当您想要使用它时,请从您的自定义 SSLContext
构建一个。 (如果需要,您也可以从默认 SSLContext
为其他情况构建一个,尽管这通常是暗示的,如果该库在连接之间重置其设置。)