您可以使用X509TrustManager来实现。
使用以下方法获取SSLContext
SSLContext ctx = SSLContext.getInstance("TLS");然后
X509TrustManager使用SSLContext#init用您的自定义对其进行初始化。SecureRandom和KeyManager
[]可以为null。后者仅在您执行客户端身份验证时有用,如果在您的情况下仅服务器需要身份验证而无需设置它。
从此SSLContext中,使用SSLContext#getSocketFactory获取SSLSocketFactory
并按计划进行。
关于X509TrustManager的实现,它可能看起来像这样:
TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { //do nothing, you're the client } public X509Certificate[] getAcceptedIssuers() { //also only relevant for servers } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { }};编辑:
Ryan是正确的,我忘了解释如何将新根添加到现有根中。假设您当前的受信任根的KeyStore来自
cacerts(JDK随附的“
Java默认信任存储”,位于jre / lib / security下)。我假设您使用KeyStore#load(InputStream,char
[])加载了该密钥库(采用JKS格式)。
KeyStore ks = KeyStore.getInstance("JKS");FileInputStream in = new FileInputStream("<path to cacerts"");ks.load(in, "changeit".toCharArray);cacerts如果尚未更改,默认密码为“ changeit”。
然后,您可以使用KeyStore#setEntry添加其他受信任的根。您可以省略ProtectionParameter(即null),KeyStore.Entry将是一个TrustedCertificateEntry,它将新的根作为其构造函数的参数。
KeyStore.Entry newEntry = new KeyStore.TrustedCertificateEntry(newRoot);ks.setEntry("someAlias", newEntry, null);如果您想在某个时候持久保存更改后的信任库,可以使用KeyStore#store(OutputStream,char
[]来实现。



