为什么我们在使用https时获得异常'javax.net.ssl.SSLException:不可信服务器证书'

时间:2011-10-10 07:37:31

标签: android exception https

当我尝试通过HTTPS访问网址时,我遇到了异常:

javax.net.ssl.SSLException:不受信任的服务器证书由以下引起:java.security.cert.CertificateException:java.security.cert.CertPathValidatorException:找不到CertPath的TrustAnchor。

我在Stackoverflow的一些帖子中发现,它应该接受一些证书。请告诉我接受证书的必要性....

提前感谢你......

2 个答案:

答案 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方法的开头。 希望它有所帮助。