Как создать доверительную стратегию, которая принимает только сертификаты с подписью государственного органа? - PullRequest
2 голосов
/ 15 апреля 2019

В настоящее время у меня есть следующий фрагмент кода, который принимает любой сертификат SSL (Apache HTTP-клиент 4.5.7):

CloseableHttpClient client;
final SSLConnectionSocketFactory sf = new SSLConnectionSocketFactory(new TLSSocketConnectionFactory(),
        new String[]{"TLSv1.2"}, new String[]{}, new AnyHostnameVerifier(logger));


client = HttpClients
        .custom()
        .setSSLSocketFactory(sf)
        .setSSLHostnameVerifier(new AnyHostnameVerifier(logger))
        .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
            @Override
            public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                return true;
            }
        }).build())
        .build();
return client;

Я хочу создать аналогичный клиент, который будет

  • принимает любой сертификат, подписанный государственным органом, и
  • отклоняет самозаверяющие сертификаты.

Как я могу это сделать?

Моя попытка сделать это

Насколько я знаю, если я использую хранилище ключей по умолчанию, он автоматически проверит действительность сертификата, подписанного государственным органом.

Так что янаписал это:

final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

Но метод SSLContextBuilder.loadTrustMaterial принимает второй аргумент - стратегию доверия.

Вот где я застрял - я понятия не имею, как реализоватьдоверительная стратегия, которая отвечала бы вышеуказанным критериям (принять все сертификаты, подписанные государственным органом, отклонить все самозаверяющие).Должен ли я реализовать это вообще или просто передать null?

...