2012-11-16 63 views
0

我的問題我下面:我有兩個瓶子由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的類。

回答

0

現在問題已經解決......而且更重要的是 - 答案並不真實。這個問題並沒有與不同的類加載器加載相同的密鑰庫資源,事實上,其中一個資源(通過資源我的意思是由keytool生成的密鑰庫文件)在運行時被簡單地破壞(所以「密鑰庫格式無效」的例外是好的)。這是非常困難的,因爲密鑰庫只生成一次,然後文件被複制到資源文件夾。所以我認爲它不能被破壞 - 事實並非如此 - 因爲我重建了項目 - 在我的maven版本中,我有一個資源插件,它已經爲所有資源啓用了過濾功能 - 這使得我每次構建項目時都會損壞密鑰庫文件:)