Spring-cloud-starter-openfeign: исключение рукопожатия SSL с feign-httpclient
При попытке использовать feign-httpclient с Spring-cloud-starter-openfeign, я получаю исключение SSL Handshake, в то время как тот же код работает, если я не использую feign-httpclient.
Мне нужно использовать feign-httpclient, так как я хочу использовать фабрику соединений.
build.gradle
//on commenting the below dependency the code works fine.
compile('io.github.openfeign:feign-httpclient:9.4.0')
compile('org.springframework.cloud:spring-cloud-starter-openfeign')
Симулировать клиента
@FeignClient(name = "testClient", url = "https://test:9820")
public interface TestClient {
@RequestMapping(method = RequestMethod.POST, value = "/test", consumes = "application/json", produces = "application/json")
TesteDto get(TestRequestDto testRequestDto);
}
Код вызова:
testClient.get(new TestRequestDto("test"));
application.yml
feign:
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
loggerLevel: full
httpclient:
maxConnections: 200
maxConnectionsPerRoute: 200
enabled: true
Исключение:
javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to
find valid certification path to requested target
4 ответа
Если вы хотите Self Signed Cert, используйте следующий код:
@FeignClient(name = "testClient", url = "https://test:9820", configuration = CustomFeignConfiguration.class)
public interface TestClient {
@RequestMapping(method = RequestMethod.POST, value = "/test", consumes =
"application/json", produces = "application/json")
TesteDto get(TestRequestDto testRequestDto);
}
public class CustomFeignConfiguration {
@Bean
public Client feignClient() {
return new ApacheHttpClient(getHttpClient());
}
private CloseableHttpClient getHttpClient() {
int timeout = 10000;
try {
SSLContext sslContext = SSLContextBuilder.create()
.loadTrustMaterial(new TrustSelfSignedStrategy()).build();
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(timeout)
.setConnectionRequestTimeout(timeout)
.setSocketTimeout(timeout)
.build();
return HttpClientBuilder
.create()
.useSystemProperties()
.setDefaultRequestConfig(config)
.setSSLContext(sslContext)
.setSSLHostnameVerifier(new NoopHostnameVerifier())
.build();
} catch (Exception e) {
throw new RuntimeException();
}
}
}
Требовалась следующая конфигурация:
feign:
httpclient:
disableSslValidation: true
В моем случае мне нужно добавить в свойства моего приложенияfeign.httpclient.disable-ssl-validation=true
Кроме того, мне нужно добавить эти зависимости вpom.xml
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
Наконец, не забудьте перезапустить приложение из-за добавления новых зависимостей.
Я также столкнулся с той же проблемой.
- Решение 1. Обратитесь к блогу https://blog.csdn.net/weixin_44519124/article/details/119909354 , чтобы создать сертификат SSL.
- Решение 2:
Шаг 1. Добавьте следующую конфигурацию в конфигурацию nacos или загрузочную программу. yml
feign:
okhttp:
enabled: true
httpclient:
disable-ssl-validation: true
enabled: false
Шаг 2. Добавьте симулированный okhttp в pom.xml.
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>11.10</version>
</dependency>
Конкретный номер версии такой же, как у ложного ядра.