我已經建立了一個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的所有興趣,正如我在許多答案中所看到的。
任何見解?
謝謝
您是否正在提供正確的中間證書?您可以使用SSL Labs SSL Test等工具來查看是否發送構建證書鏈所需的所有中間證書。 –
是的,中間證書被正確發送。檢查SSL實驗室 – christophetd