【问题标题】:Retrofit HTTPS connection not working in Android改造 HTTPS 连接在 Android 中不起作用
【发布时间】:2016-02-21 23:08:01
【问题描述】:

我收到信任锚错误。我为 https 连接尝试了http://www.snip2code.com/Snippet/25364/Get-OkHttpClient-which-ignores-all-SSL-e,但这会返回以下错误。

 D/Retrofit﹕ javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328)

【问题讨论】:

  • 您是否尝试过自己研究此错误?该链接甚至没有任何上下文。这只是一个没有解释的代码 sn-p。您是否需要安装证书才能使其正常工作?
  • 是的@matt,你能指导我或提供我的证书文件(适用于所有人)
  • 您正在尝试的网站似乎正在使用自签名证书,请尝试从网站中提取证书并将其包含在您的代码中。
  • 我从服务团队获得了 crt 文件,但仍然抛出 javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certificate path not found。在 com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328)

标签: android https ssl-certificate retrofit okhttp


【解决方案1】:

尝试使用以下示例代码:

    private TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) {
        final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0];
        return new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return originalTrustManager.getAcceptedIssuers();
                    }
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {
                        try {
                            originalTrustManager.checkClientTrusted(certs, authType);
                        } catch (CertificateException ignored) {
                        }
                    }
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {
                        try {
                            originalTrustManager.checkServerTrusted(certs, authType);
                        } catch (CertificateException ignored) {
                        }
                    }
                }
        };
    }

    private SSLSocketFactory getSSLSocketFactory()
            throws CertificateException, KeyStoreException, IOException,
                    NoSuchAlgorithmException, KeyManagementException {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = getResources().openRawResource(R.raw.your_cert); // your certificate file
        Certificate ca = cf.generateCertificate(caInput);
        caInput.close();
        KeyStore keyStore = KeyStore.getInstance("BKS");
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);
        TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, wrappedTrustManagers, null);
        return sslContext.getSocketFactory();
    }

然后你可以在你的项目中设置 OkHttpClient 如下:

okHttpClient.setSslSocketFactory(getSSLSocketFactory());

关于setHostnameVerifier,看起来您在问题的链接中有解决方案。

希望这会有所帮助!

【讨论】:

  • 问题出在证书上,因为从 volley 和 iOS 来看,https 在没有附加任何证书的情况下可以正常工作。 (getResources().openRawResource(R.raw.your_cert))
  • 您的意思是您的问题在不使用证书文件的情况下已解决?
  • 是的,当我尝试使用我的 iOS 时,它一直在使用没有 crt 文件的基本设置。
  • 您找到解决方案了吗?我遇到了同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 2018-09-15
相关资源
最近更新 更多