2012-08-08 51 views
8

我目前正在重寫X509TrustManager以允許所有的證書作爲臨時的'解決方案'(一個不安全的)。我試圖弄清楚我將如何進行添加,因此只接受一個特定的證書,證明我有問題,直到可以完成適當的修復(此時不在我的手中)。這是當前的代碼。X509TrustManager覆蓋不允許所有證書?

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 
    @Override 
    public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 

    @Override 
    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
    } 

    @Override 
    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { 
    } 
}}; 

try { 
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
} catch (GeneralSecurityException e) { 
    System.out.println(e.getStackTrace()); 
} 
+0

爲什麼返回null而不是空數組?規範說返回一個非空數組。 – Jayen 2012-12-13 02:02:15

回答

7

所有你需要做的是從getAcceptedIssuers返回證書。見this

InputStream inStream = new FileInputStream("fileName-of-cert"); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream); 
inStream.close(); 

,然後返回數組中的方法

+0

我可以返回從我連接到的URL收到的證書嗎?現在,只有在訪問另一臺服務器上的另一個URL時,我纔會出現證書錯誤,然後證書發生錯誤。 – user1015523 2012-08-08 05:36:19

+0

我所做的是使用瀏覽器通過瀏覽器從站點下載證書(當您看到錯誤時,每個主要瀏覽器都應該有一個選項將其保存到磁盤),然後將其添加到密鑰存儲爲StephenC所說的或使用上述文件中的代碼。上面的解決方案可能會少一些痛苦(儘管不太靈活),因爲IIRC生成密鑰庫是一件麻煩事。 – dfb 2012-08-08 05:42:34

+1

如果openssl可用,則可以在命令行上下載證書鏈: openssl s_client -host www.webservicehost.com -port 443 -showcerts> output_certificate.crt – IcedDante 2014-06-03 21:18:08

0

一種可能是有問題的證書臨時添加到您的JVM的密鑰存儲爲受信任的證書內。