2016-11-28 16 views
1

SSLを使用する1つの外部HTTP API用にFeignClientを作成しようとしています。 この闘いは、私のロジック、この場合はSSL接続ファクトリで、デフォルトのSpring FeignClientを変更する方法です。ですから、基本的にはHystrix、Sleuth tracingなどのFeignClientのためにSpringが自動的に行うすべての良いことを維持したいと思っています。SpringBoot:FeignClient with SSL(p12)

ありがとうございます。ここで


は私がしようとしたものです:

私はComponentScanの外でカスタム@Configurationを提供しようとしました:

@Configuration 
public class CustomFeignConfiguration 
{ 
    @Bean 
    public Feign.Builder feignBuilder() 
    { 
     Client trustSSLSockets = new Client.Default(
       TrustingSSLSocketFactory.get("server1"), 
       new NoopHostnameVerifier()); 

     log.info("feignBuilder called"); 
     return Feign.builder().client(trustSSLSockets); 
    } 
... 
} 

メイドFeignClientは、注釈

@FeignClient(name = "sslClient", configuration = CustomFeignConfiguration.class, url = "https://...") 
を通してそれを使います

ここで、 "TrustingSSLSocketFactory"はthisと同様に実装されています。

クライアントをSpringアプリケーションに挿入すると、「feignBuilder」が呼び出され、キーが正常に読み込まれたことがわかります。問題は、作成されたクライアントが実際にcreateSocket呼び出しに指定されたSSLFactoryを使用しないことです。だから私は得る:それは@Bean自身ではなく、ビルダーの一部だとして

Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ~[na:1.8.0_72] 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) ~[na:1.8.0_72] 
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023) ~[na:1.8.0_72] 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125) ~[na:1.8.0_72] 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) ~[na:1.8.0_72] 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) ~[na:1.8.0_72] 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) ~[na:1.8.0_72] 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) ~[na:1.8.0_72] 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) ~[na:1.8.0_72] 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1513) ~[na:1.8.0_72] 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) ~[na:1.8.0_72] 
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) ~[na:1.8.0_72] 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338) ~[na:1.8.0_72] 
    at feign.Client$Default.convertResponse(Client.java:152) ~[feign-core-9.3.1.jar:na] 

答えて

1

Clientを作成します。 builder.client(client)が後で呼び出され、ビルダーの作成中に設定したクライアントがオーバーライドされます。

ので

@Bean 
public Client feignClient() 
{ 
    Client trustSSLSockets = new Client.Default(
      TrustingSSLSocketFactory.get("server1"), 
      new NoopHostnameVerifier()); 

    log.info("feignClient called"); 
    return trustSSLSockets; 
}