我正在使用HttpsURLConnection进行HTTPS请求。
我尝试联系的服务器有自签名证书,因此逻辑上会导致请求失败。
但是,异常并未向我的程序发出错误信号。它只是失败了,我可以在logcat中看到原因。
03-22 17:54:35.203: W/System.err(21147): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
03-22 17:54:35.203: W/System.err(21147): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:381)
以下是我用于请求的代码:
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setUseCaches(false);
connection.setAllowUserInteraction(false);
connection.connect();
理想情况下,我希望我的程序像浏览器一样做出反应:弹出一个对话框,指示证书不受信任,并可能将其添加到某个密钥存储区并重试请求。
但由于我无法找到获得异常的方法,我真的不知道该怎么做。
有任何线索吗?
答案 0 :(得分:2)
虽然你需要实现自定义TrustManager
是正确的,但你绝对不应盲目接受所有SSL证书。
Nikolay Elenikov an excellent blog post介绍了如何设置自定义TrustManager
以验证此类证书
答案 1 :(得分:-4)
你可以这样做:
SSLContext sc = SSLContext.getInstance("TLS");
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return;
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return;
}
} };
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpURLConnection = connection = endPoint.openConnection();