Я реализовал 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 изменил свой сертификат.