如果要動態導入證書,您可能需要使用自定義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