如果要动态导入证书,可能需要使用自定义x509TrustManager
. 这是在配置 时完成的SSLContext
,它本身用于创建SSLSocketFactory
or SSLEngine
。
jSSLutils是一个库,可让您包装现有的信任管理器并自定义某些设置。你不需要它,但它可能会有所帮助。
这将遵循以下原则:
PKIXSSLContextFactory sslContextFactory = new PKIXSSLContextFactory();
sslContextFactory.setTrustManagerWrapper(new X509TrustManagerWrapper() {
@Override
public X509TrustManager wrapTrustManager(final X509TrustManager origManager) {
return new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return origManager.getAcceptedIssuers();
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
try {
// This will call the default trust manager
// which will throw an exception if it doesn't know the certificate
origManager.checkServerTrusted(chain, authType);
} catch (CertificateException e) {
// If it throws an exception, check what this exception is
// the server certificate is in chain[0], you could
// implement a callback to the user to accept/refuse
}
}
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType)
throws CertificateException {
origManager.checkClientTrusted(chain, authType);
}
};
}
});
SSLContext sslContext = sslContextFactory.buildSSLContext();
((PKIX)SSLContextFactory
andX509TrustManagerWrapper
来自 jSSLutils,但其余的在 J2SE/J2EE 中可用。)
您可能想要捕获一些CertificateException
s (请参阅子类)。如果您向用户进行回调,则 SSL/TLS 连接可能会因为 SSL/TLS 握手超时而第一次失败(如果回调时间太长而无法回复。)
然后,您可以将其SSLContext
用作您的默认使用SSLContext.setSSLContext(...)
(来自 Java 6),但这不一定是一个好主意。如果可以,请将 传递SSLContext
给建立 SSL/TLS 连接的库。这样做的方式各不相同,但例如 Apache HTTP Client 4.x 有多个选项来配置其 SSL 设置,其中一个是通过传递KeyStore
s,另一个是通过传递SSLContext
.
您还可以通过检查 : 中的当前线程来对每个线程而不是每个将要连接的对象(依赖于库)X509TrustManager
进行某些操作:这可能会使事情在同步和线程管理/“意识”方面变得更加复杂信托经理。