如何在执行HTTPS请求时对不受信任的证书异常做出反应?

时间:2013-03-22 17:02:22

标签: android ssl https

我正在使用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();

理想情况下,我希望我的程序像浏览器一样做出反应:弹出一个对话框,指示证书不受信任,并可能将其添加到某个密钥存储区并重试请求。

但由于我无法找到获得异常的方法,我真的不知道该怎么做。

有任何线索吗?

2 个答案:

答案 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();