我已经建立了一个用Apache托管两个网站的VPS。两者都具有带有StartSSL证书的(有效)SSL配置,我从桌面或移动浏览器访问它们没有问题。
我正在尝试访问其中一个网站使用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:无法找到所请求目标的有效证书路径< / p>
(如果我尝试访问https://google.com)
,我当然无法获得谷歌搜索后,我发现问题似乎是JVM(桌面)/ android无法识别StartSSL的根证书。我不想手动导入它,因为此代码的最终结果是在Android应用程序中运行。我不想通过允许任何证书来放弃SSL的所有利益,正如我在许多答案中看到的那样。
任何见解?
谢谢
答案 0 :(得分:1)
如果您的平台不信任您的CA,那么除了手动将CA添加到平台的根CA信任列表或让您的证书由其中一个CA签名之外,您没有多少选择。你的平台信任。