如果您想动态导入证书,您可能需要使用自定义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();
(The (PKIX)SSLContextFactory
and X509TrustManagerWrapper
来自 jSSLutils,但其余部分可用于 J2SE/J2EE。)
有几个CertificateExceptions您可能想要捕获的(请参阅子类)。
如果您向用户进行回调,则 SSL/TLS 连接可能会因为 SSL/TLS 握手超时而第一次失败(如果回调需要很长时间才能得到回复)。
然后你可以使用这个SSLContext
作为您的默认使用SSLContext.setSSLContext(...)
(从 Java 6 开始),但这不一定是个好主意。如果可以的话,请通过SSLContext
到建立 SSL/TLS 连接的库。完成此操作的方式各不相同,但例如 Apache HTTP Client 4.x 有多个选项来配置其 SSL 设置,其中之一是通过传递KeyStore
s,另一个是通过传递SSLContext
.
您还可以通过检查当前线程中的每个线程而不是每个要连接的对象(取决于库)X509TrustManager
:这可能会使信任管理器的同步和线程管理/“感知”方面的事情变得更加复杂。