我的問題我下面:我有兩個瓶子由maven構建。一個罐子含有包裹從jave.net.ssl進行HTTPS請求一些類邏輯當URL方案爲https:如何使用另一個jar的資源加載密鑰庫。
private SSLSocketFactory prepareSSLSocketFactory(SecurityConfig secConfig) throws NoSuchAlgorithmException, CertificateException, IOException, KeyStoreException, KeyManagementException
{
if (secConfig == null) throw new IllegalArgumentException("secConfig");
if (sslSocketFactory!=null)
return sslSocketFactory;
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(secConfig.getSslTrustStore()/*ClassLoader.getSystemClassLoader().getResourceAsStream("jclienttruststore.jks")*/, secConfig.getSslTrustStorePassword().toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
SSLContext ctx = SSLContext.getInstance(secConfig.getSslAlgorithm());
ctx.init(null, tmf.getTrustManagers(), null);
sslSocketFactory = ctx.getSocketFactory();
return sslSocketFactory;
}
注意部分secConfig.getSslTrustStore:獲得HttpsURLConnection的我獲得SSLSocketFactory的,具體如下(),因爲這包含傳入此方法的InputStream,在從包含上述代碼的父代的jar中獲得它之後。獲取InputStream如下:
protected InputStream obtainTrustStore()
{
//InputStream stream = this.getClass().getClassLoader().getParent().getResourceAsStream("trustcert/jclienttruststore.jks");
//InputStream stream = ClassLoader.getSystemClassLoader().getResourceAsStream("trustcert/jclienttruststore.jks");
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("trustcert/jclienttruststore.jks");
return stream;
}
資源成功定位,並獲取InputStream。但是當涉及在第一個片段上執行trustStore.load()時,我得到奇怪的異常,說明KeyStoreFormat無效。 KeyStoreFormat是有效的 - 這是肯定的 - 因爲當我從包含此prepareSSLSocketFactory的jar執行測試方法並加載相同的密鑰存儲文件但位於當前jar的資源中時,根本沒有異常,並且客戶端成功通過ssl進行通信。因此,我的觀察如下:如果我從位於執行方法prepareSSLSocketFactory的jar中的keystore資源加載可信任的InputStream,它將起作用,但是如果另一個jar負責向包含prepareSSLSocketFactory的相關jar提供InputStream(帶密鑰存儲) () - 它拋出異常。 不知道如何處理它。如果類提供的資源和含有prepareSSLSocketFacory類,我已經籤
注由同一類加載器加載致電:。
this.getClass()getClassLoader()等於(HttpConnector.class.getClassLoader() ) - 沒關係。
from class which provides keystore InputStream to the https https request making class。
但是我不知道是否有可能,HttpConnector.class.getClassLoader()返回的ClassLoader不是加載最後在運行時使用的HttpConnector的類。