Возможно ли реализовать mTLS на стороне клиента без склада доверенных сертификатов? - PullRequest
1 голос
/ 03 апреля 2020

Я реализовал restTemplate, который отправляет POST на сервер, защищенный mTLS. Я реализовал следующий компонент в Springboot. Вкратце, я предоставляю restTemplate с Keystore и Truststore (формат .jks) для реализации двухстороннего ssl-соединения, но мне не нужно использовать TrustStore, но проверять какое-то поле сертификата сервера для его проверки.

@Bean
@Autowired
public RestTemplate mtlsRestTemplate(KeyStore keystore) throws IOException, UnrecoverableKeyException, KeyManagementException {
    if (!isMtlsActivated) {
        return classicRestTemplate();
    }
    SSLContext context;
    try {
        context = SSLContextBuilder.create()
                .setProtocol("TLS")
                .loadKeyMaterial(keystore, keyStorePassword.toCharArray())
                .loadTrustMaterial(new File(trustStoreLocation), trustStorePassword.toCharArray())
                .build();
    } catch (CertificateException | NoSuchAlgorithmException | KeyStoreException e) {
        // [...]
    }

    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(HttpClients.custom().setSSLSocketFactory(
            new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE))
            .setMaxConnTotal(maxConnectionsTotal)
            .setMaxConnPerRoute(maxConnectionsPerRoute)
            .build());
    clientHttpRequestFactory.setConnectTimeout(5000);
    clientHttpRequestFactory.setReadTimeout(5000);
    return new RestTemplate(clientHttpRequestFactory);
}

Мои потребности связаны с политикой сервера при обновлении их сертификатов. Эта задача будет выполняться довольно часто, что заставило бы меня постоянно проверять и загружать новые сертификаты (так как эту операцию нельзя автоматизировать). Я читал, что на стороне сервера с помощью Spring Security вы можете отправить свой собственный сертификат и затем проверить cn сертификата клиента (например, здесь среди других мест). Был бы какой-нибудь способ проверки cn (или dn, или любого другого поля, не уверенного в самом безопасном) при использовании метода .exchange() RestTemplate, сгенерированного моим бином?

Edit1: Я пытался, и мне удалось создать класс, реализующий CertificateTrustStrategy и загрузить его как TrustMaterial так же, как я инициализирую с trustStore, но я не могу понять, как проверить правильность сертификат кроме DN. Я забыл объяснить, что я не могу проверить сертификатом CA клиентский, но я мог бы сделать это с полями, которые не изменились бы, если бы CA изменил свой сертификат.

...