2015-10-21 124 views
0

我已經建立了一個VPS,它使用Apache託管兩個網站。兩者都有一個帶有StartSSL證書的(有效的)SSL配置,我從桌面或移動瀏覽器訪問它們沒有問題。JVM/Android不受信任的StartSSL的根證書

我想訪問其中一個網站使用SSL運行的API,但我遇到了問題。我第一次使用Apache HttpClient(已棄用),但it looks like it can't choose the proper certificate on the server because it doesn't support Server Name Indication,並且解決方法是使用HttpsURLConnection。

所以我現在有這個代碼,無恥地從互聯網上覆制:

String url = "https://mywebsite.ext/api/xxx"; 
URL obj = new URL(url); 
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 

//add reuqest header 
con.setRequestMethod("POST"); 

String urlParameters = "blah=foo&bar=xx"; 

// Send post request 
con.setDoOutput(true); 
DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
wr.writeBytes(urlParameters); 
wr.flush(); 
wr.close(); 

int responseCode = con.getResponseCode(); 
// ... 

而我得到的是:

異常線程 「main」 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到有效的證書路徑以請求目標

(當然,如果我嘗試訪問例如https://google.com我不明白)

谷歌搜索後,我發現,這個問題似乎是startssl如果的根證書不是由JVM(桌面)認可/ android。我不想手動導入它,因爲此代碼的終結點是在Android應用程序中運行。我不想通過允許任何證書來放棄SSL的所有興趣,正如我在許多答案中所看到的。

任何見解?

謝謝

+0

您是否正在提供正確的中間證書?您可以使用SSL Labs SSL Test等工具來查看是否發送構建證書鏈所需的所有中間證書。 –

+0

是的,中間證書被正確發送。檢查SSL實驗室 – christophetd

回答

1

如果CA不是由你的平臺信任你沒有太多的選擇超越手動添加CA到平臺的根CA信任列表或獲取由CA的平臺之一簽署的證書信託。

+0

這就是我懷疑的。 :/所以基本上我沒有別的選擇,只能從另一個CA生成新的證書? – christophetd

+0

...或手動將StartSsl添加到您平臺的可信列表。那將是我的理解。 – JJF

+1

這裏的主要問題並不是如何將CA添加到密鑰庫中的可信CA列表,但爲什麼默認情況下它不存在。一個明顯的答案是 - 安全考慮。如果Java不默認信任它,我們可能不應該或者至少做我們自己的研究來理解這個CA的可信度。快速搜索會在2011年提供許多描述其安全問題的結果。 –

相關問題