当我尝试通过HTTPS访问网址时,我遇到了异常:
javax.net.ssl.SSLException:不受信任的服务器证书由以下引起:java.security.cert.CertificateException:java.security.cert.CertPathValidatorException:找不到CertPath的TrustAnchor。
我在Stackoverflow的一些帖子中发现,它应该接受一些证书。请告诉我接受证书的必要性....
提前感谢你......
答案 0 :(得分:0)
证书将根据Verisign或Thawte等根证书颁发机构进行身份验证。某些SSL证书提供了一系列中间证书以进行验证,这些证书提供了一个顶级证书的验证。在这种情况下,您需要在本地导入中间证书以及页面证书。这些需要导入到本地cacerts文件中。它是Java下的cacerts文件,不知道它将在Android上的哪个位置,但我之前已经看到它在此处链接。
另见Adding SSL Certificate to Keystore。我想你需要做一个BouncyCastle下载。
这对您的特定问题How to create a BKS (BouncyCastle) format Java Keystore that contains a client certificate chain
也可能更有用答案 1 :(得分:0)
您必须按照指定的@mikey向Keystore提供SSL证书... 但是如果你想允许所有主机没有任何检查(允许所有主机)。
public static class _FakeX509TrustManager implements X509TrustManager {
private static TrustManager[] trustManagers;
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public boolean isClientTrusted(X509Certificate[] chain) {
return true;
}
public boolean isServerTrusted(X509Certificate[] chain) {
return true;
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return _AcceptedIssuers;
}
public static void allowAllSSL() {
HttpsURLConnection.setDefaultHostnameVerifier(new
HostnameVerifier(){
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
SSLContext context = null;
if (trustManagers == null) {
trustManagers = new TrustManager[] { new _FakeX509TrustManager() };
}
try {
context = SSLContext.getInstance("TLS");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
}
}
调用_FakeX509TrustManager.allowAllSSL();在你的http方法的开头。 希望它有所帮助。