如果要动态导入证书,您可能需要使用自定义x509TrustManager
。这是在配置SSLContext
时完成的,它本身用于创建SSLSocketFactory
或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
而来X509TrustManagerWrapper
从jSSLutils,但其余的是可用的J2SE/J2EE)
有几个CertificateException
s你可能想要赶上(见子类)。 如果您对用户进行回拨,由于SSL/TLS握手超时(如果回调需要太长时间才能回复),SSL/TLS连接可能会首次失败。
然后,您可以使用SSLContext.setSSLContext(...)
使用此SSLContext
作为默认(从Java 6),但是这并不一定是个好主意。如果可以,请将SSLContext
传递给进行SSL/TLS连接的库。实现方式各不相同,但例如,Apache HTTP Client 4.x有多个选项来配置其SSL设置,其中一个是通过KeyStore
,另一个是通过SSLContext
。
通过检查X509TrustManager
中的当前线程,您也可以针对每个线程而不是每个将要连接的对象(库依赖):这可能会使事情在同步和线程管理/信任管理者的“意识”。
它对我有效..感谢 – Nayeem 2015-10-13 17:06:44