web-dev-qa-db-fra.com

Comment réparer une implémentation non sécurisée de X509TrustManager dans une application Android

Google m'a informé que l'implémentation de l'interface X509TrustManager dans mon application Android était dangereuse et que je devais modifier mon code comme suit:

Pour gérer correctement la validation du certificat SSL, modifiez votre code dans le fichier Méthode checkServerTrusted de votre interface X509TrustManager personnalisée vers déclenchez CertificateException ou IllegalArgumentException à chaque fois que le certificat présenté par le serveur ne correspond pas à votre attentes. Pour les questions techniques, vous pouvez poster sur Stack Overflow et utilisez les balises «Android-security» et «TrustManager».

Comment le code suivant peut-il être modifié pour résoudre le problème ci-dessus?

public EasySSLSocketFactory(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;
        }
    };

    mContext.init(null, new TrustManager[] { tm }, null);
}
18
Nabeel

J'ai résolu ceci en utilisant le code suivant:

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                try {
                    chain[0].checkValidity();
                } catch (Exception e) {
                    throw new CertificateException("Certificate not valid or trusted.");
                }
            }
21
Nabeel

Si vous rencontrez cela à partir de la bibliothèque externe que vous utilisez, vérifiez si appache libraray en est la cause. 

Pour moi, la bibliothèque Apache a provoqué l’erreur suivante: j’utilisais une classe obsolète - MultipartEntity . Cette classe utilise SSLContextBuilder Qui utilise TrustManagerDelegate . TrustManagerDelegate implémente X509TrustManager, ce qui provoque l'erreur "implémentation non sécurisée de TrustManager" lors du téléchargement de l'application sur Google Play Store.

La solution est la suivante: au lieu de obsolète MultipartEntity class, utilisez MultipartEntityBuilder .

Par exemple : 

MultipartEntity httpMultipart = new MultipartEntity();
String contentType = httpMultipart.getContentType().getValue();

Sera remplacé par:

MultipartEntityBuilder httpMultipart = new MultipartEntityBuilder();
String contentType = httpMultipart.build().getContentType().getValue();
1
Dus

J'ai rencontré ce problème.Si votre code est comme ça:

 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;
    }
};

il acceptera tout le certificat et c’est une mauvaise idée, c’est pourquoi google vous envoie un courrier . Nous pouvons modifier l’acceptation du certificat auto-signé aussi . Je l’ai résolu, voici ma question et ma solution

0
zys