Благодаря комбинации ответов Каннана и Нираджа мне удалось настроить мой фиктивный клиент для использования customSSLSocketFactory.
Мой вариант использования: у меня есть API, для которого требуется добавить SSL-сертификат на мою локальную машину на JAVA cacerts, чтобы получить его. Однако я не могу добавить этот сертификат после развертывания на облачном сервере. Следовательно, мне нужно было настроить мой клиент Feign для получения пользовательского хранилища доверия из самого моего приложения.
Вот моя версия этого
Создайте свое собственное хранилище доверенных сертификатов с добавленным сертификатом keytool -import -file <filepath-of-certificate> -alias <certificate-alias-name> -keystore <truststore-alias-name>
система запросит пароль, установите свой собственный пароль и запомните его Доверительное хранилище не требует никаких расширений для этого случая
Скопируйте этот файл хранилища доверенных сертификатов в папку ресурсов вашего весеннего загрузочного приложения.
В файле application.properties или application.yml укажите путь к классам и пароль для вашего хранилища доверенных сертификатов. Я использую application.yml, поэтому пример выглядит следующим образом
e.g.
example-service:
server: https://example.api.com
trustStore: classpath:<Your truststore name>
trustStorePassword: yourpassword
* Вы также можете пропустить шаг 3 и напрямую перейти в хранилище доверенных сертификатов и пароль ниже *
- В классе CustomFeignConfig вы можете напрямую передать хранилище доверенных сертификатов в качестве ресурса и напрямую передать входной поток хранилища доверенных сертификатов в sslsocketfactory. Обратите внимание, что нотация Bean необходима для переопределения конфигурации имитации по умолчанию. Мне требуется хранилище доверенных сертификатов только для моего случая, поэтому я передаю пустой новый KeyManager[]{} в sslContext.init()
` открытый класс CustomFeignConfig {
@Bean
public Client feignClient(@Value("${example-service.trustStore}") Resource trustStoreResource,
@Value("${example-service.trustStorePassword}") String trustStorePassword) throws Exception {
try {
return new Client.Default(
sslSocketFactory(trustStoreResource.getInputStream(), trustStorePassword),
null);
} catch (Exception e) {
throw new Exception("Error in initializing feign client", e);
}
}
private static SSLSocketFactory sslSocketFactory(InputStream trustStoreStream, String trustStorePassword)
throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
TrustManagerFactory tmf = createTrustManager(trustStoreStream, trustStorePassword);
sslContext.init(new KeyManager[]{}, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
}
private static TrustManagerFactory createTrustManager(InputStream trustStoreStream, String trustStorePassword)
throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(trustStoreStream, trustStorePassword.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
return tmf;
}
} `
- Примените эту пользовательскую конфигурацию имитации только к тому API, для которого она требуется.
@FeignClient(name = "example-service", url = "${example-service.server}", configuration = CustomFeignConfig.class) public interface MyFeignClient {}
person
hairy25
schedule
14.06.2021