Понимание стратегии доверия SSL - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь понять, что TrustStrategy принять для метода loadTrustMaterial .

 public SSLContextBuilder loadTrustMaterial(KeyStore truststore,
                                  TrustStrategy trustStrategy)
                                    throws NoSuchAlgorithmException,
                                           KeyStoreException

Я нашел четыре разных примера, и мне очень любопытно узнать разницу между этими четырьмя, так как описание слишком мало для понимания различий / использования / преимуществ / недостатков.

Вот четыре различных примера кода:

TrustStrategy: похоже, здесь мы переопределяем стандартный процесс проверки сертификата JSSE, но он всегда возвращает true, поэтому он также доверяет недействительным сертификатам?

TrustStrategy trustStrategy = new TrustStrategy() {
    @Override
    public boolean isTrusted(X509Certificate[] x509Certificates, String authType) throws CertificateException {
        return true;
    }
    };
SSLContextBuilder sslContextBuilder = SSLContexts.custom()
    .loadTrustMaterial(trustStore, trustStrategy);

NULL: Мы НЕ даем никакой стратегии, так что она будет делать?

SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                            .loadTrustMaterial(trustStore, null);

TrustAllStrategy: Она будет доверять всем подписанным сертификатам, так что это безопасно?

SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                            .loadTrustMaterial(trustStore, new TrustAllStrategy());

TrustSelfSignedStrategy: В чем разница между этим и TrustAllStrategy?

SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                            .loadTrustMaterial(trustStore, new TrustSelfSignedStrategy());

Помогите, пожалуйста, понять разницу между этими четырьмя версиями примера? Заранее спасибо.

1 Ответ

2 голосов
/ 06 апреля 2020

Прежде всего, доверять всем сертификатам крайне не рекомендуется. Скорее добавьте сертификаты в склад доверенных сертификатов.

TrustStategy - это интерфейс, реализованный некоторыми типами.

Все эти методы взяты из apache httpclient - первый (переопределяющий метод isTrusted) более или меньше или равный TrustAllStrategy и просто создавая пользовательский экземпляр TrustStrategy, где вы можете определить свой собственный способ определения, является ли сертификат доверенным или нет.

См. Исходный код TrustAllStrategy здесь:

public class TrustAllStrategy implements TrustStrategy {

    public static final TrustAllStrategy INSTANCE = new TrustAllStrategy();

    @Override
    public boolean isTrusted(final X509Certificate[] chain, final String authType) throws CertificateException {
        return true;
    }

Установка TrustStrategy в ноль приведет к отсутствию TrustManager:

   public SSLContextBuilder loadTrustMaterial(
            final KeyStore truststore,
            final TrustStrategy trustStrategy) throws NoSuchAlgorithmException, KeyStoreException {
        final TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(
                trustManagerFactoryAlgorithm == null ? TrustManagerFactory.getDefaultAlgorithm()
                        : trustManagerFactoryAlgorithm);
        tmfactory.init(truststore);
        final TrustManager[] tms = tmfactory.getTrustManagers();
        if (tms != null) {
            if (trustStrategy != null) {
                for (int i = 0; i < tms.length; i++) {
                    final TrustManager tm = tms[i];
                    if (tm instanceof X509TrustManager) {
                        tms[i] = new TrustManagerDelegate(
                                (X509TrustManager) tm, trustStrategy);
                    }
                }
            }
            for (final TrustManager tm : tms) {
                this.trustManagers.add(tm);
            }
        }
        return this;
    }

TrustSelfSignedStrategy работает следующим образом:

@Override
public boolean isTrusted(
        final X509Certificate[] chain, final String authType) throws CertificateException {
    return chain.length == 1;
}

Самостоятельно подписанный сертификат выдается целью сертификата. Он генерируется по умолчанию во многих приложениях и часто используется для целей intr anet.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...