Как исправить небезопасную реализацию TrustManager?

Мое приложение было отклонено в Google Play из-за небезопасной реализации TrustManager.

Но в моей библиотеке есть только одна реализация TrustManager (это мой класс SSLUtil).

import android.content.Context;

import java.io.InputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class SSLUtil {

    /**
     * @param ctx
     * @param certRaw File from /res/raw
     * @return
     * @throws Exception
     */
    public static SSLSocketFactory trustCert(Context ctx, int certRaw) throws Exception {
        // Load CAs from an InputStream

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        // File at /res/raw
        InputStream caInput = FileUtils.readRawFile(ctx, certRaw);
        Certificate ca;
        try {
            ca = cf.generateCertificate(caInput);
        } finally {
            caInput.close();
        }

// Create a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);
//      Log.d(TAG, "KeyStore: " + keyStore);

// Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
        SSLSocketFactory socketFactory = context.getSocketFactory();
        HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);

        return socketFactory;
    }
}

Я написал этот класс после прочтения следующих документов с сайта разработчика Android:

https://developer.android.com/training/articles/security-ssl.html

Если я правильно понимаю, этот код в порядке. Правильна ли эта реализация TrustManager?

Я не понял, почему моя заявка была отклонена.

1 ответ

Нет, ваш код не защищен. Как вы можете сказать из названия allHostsValidкод слепо принимает все имена хостов, что означает, что соединение может быть посредственным. Вы должны удалить этот класс.

Другие вопросы по тегам