首页 > 解决方案 > 由于带有 https url 的设备日期时间错误,无法在 Android 中加载 api 响应

问题描述

当我调用托管在安全服务器 SSL(https) 上的 API 时,如果系统的日期时间错误(手动设置),那么我们会出现以下错误。

javax.net.ssl.SSLHandshakeException: Chain validation failed
java.security.cert.CertPathValidatorException: Response is unreliable: its validity interval is out-of-date
java.security.cert.CertPathValidatorException: Could not determine revocation status

即使移动日期和时间错误,是否有任何方法允许应用程序加载响应表单 api?

奇怪的问题是所有其他应用程序都可以正常工作,即使那些有带有 https 的 api。我需要做哪些更改,它允许移动应用程序也以错误的日期时间调用 api(https)。

标签: androidrestsslhttps

解决方案


添加证书访问

private static SSLSocketFactory getSSLSocketFactory() {
    try {
        // Create a trust manager that does not validate certificate chains
        final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
        };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        return sslSocketFactory;
    } catch (KeyManagementException | NoSuchAlgorithmException e) {
        return null;
    }

}

现在添加 SSL 套接字工厂,如下所示

         httpClient.sslSocketFactory(getSSLSocketFactory());
         httpClient.hostnameVerifier(new HostnameVerifier() {
         @Override
         public boolean verify(String hostname, SSLSession session) {
         return true;
           }
         });

推荐阅读