如何在Android应用中修复X509TrustManager warrning的不安全实现

时间:2016-02-29 18:39:47

标签: android ssl-certificate trustmanager

我在Google Play商店上传的Android Build上收到安全警报。

"您的应用正在使用与Apache HTTP客户端的X509TrustManager接口的不安全实现,从而导致安全漏洞。有关详细信息,请参阅此Google帮助中心文章,其中包括修复漏洞的截止日期。"

我尝试通过实施以下代码并更新我的构建

来修复它
public class MySSLSocketFactory  extends SSLSocketFactory {
    SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };

        sslContext.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

但我仍然得到安全警报。

还有一个问题,我不想一次又一次地更新我的实时应用程序以删除此安全警报。有没有办法可以上传我的版本,并且可以检查更改是否完美,并且可以使用相同的应用程序。

更新:我还在checkServerTrusted()

中添加以下行
try {
    chain[0].checkValidity();
} catch (CertificateExpiredException e) {
    Logger.e(TAG, "CertificateExpiredException");
    throw new CertificateException("CertificateExpiredException");
} catch (CertificateNotYetValidException e) {
    Logger.e(TAG, "CertificateNotYetValidException");
    throw new CertificateException("CertificateNotYetValidException");
}

1 个答案:

答案 0 :(得分:0)

如果您想检查您的应用是否已修复,可以将其上传为定时发布

如果您的新版本没有修复上述错误,系统会通知您。