当前位置: 首页 > 知识库问答 >
问题:

SpringBoot:使用SSL伪装客户端(第12页)

车辰龙
2023-03-14

我正在尝试为一个使用SSL的外部HTTP API创建一个假客户端。困难在于——如何用我的逻辑修改默认的Spring佯装客户端,在本例中是SSL连接工厂。所以基本上我想保留Spring自动为假客户机做的所有好事情,比如Hystrix、Sleuth跟踪等,并使其与我的SSL工厂一起工作。

如有任何建议,将不胜感激。

以下是我试图做的:

我尝试在ComponentScan之外提供自定义@配置:

@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);
    }
...
}

通过注解使FaignClient使用它

    @FeignClient(name = "sslClient", configuration = CustomFeignConfiguration.class, url = "https://...")

其中,“Trustingslssocketfactory”的实现与此类似。

现在,如果我将我的客户端注入Spring应用程序,我可以看到调用了“feignBuilder”并成功加载了我的密钥。问题是创建的客户端实际上并没有使用指定的SSLFactory进行createSocket调用。所以我得到:

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]

共有2个答案

郎玮
2023-03-14

我做了这样的事达到了我的目的-

@Bean
public Client feignClient()
{
    Client trustSSLSockets = new Client.Default(getSSLSocketFactory(), new NoopHostnameVerifier());
    log.info("feignClient called"); 
    return trustSSLSockets;
}


private SSLSocketFactory getSSLSocketFactory() {
    try {
    TrustStrategy acceptingTrustStrategy = new TrustStrategy() {
        @Override
        public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            //Do your validations
            return true;
        }
        };

        SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(null, acceptingTrustStrategy).build();
        return sslContext.getSocketFactory();
    } catch (Exception exception) {
        throw new RuntimeException(exception);
    }
}
郑博厚
2023-03-14

按照自己的Bean而不是生成器的一部分创建客户机<代码>生成器。稍后将调用客户端(client),覆盖创建生成器时设置的客户端。

所以

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

    log.info("feignClient called");
    return trustSSLSockets;
}
 类似资料:
  • 我通过SSL证书使用Axis实现调用Web服务。我使用keytool将证书添加到密钥库中。 它显示为"证书已添加到密钥库"。但是当我运行java程序时,我得到以下异常 故障代码:{http://schemas.xmlsoap.org/soap/envelope/}服务器。userException faultSubcode:faultString:javax。网ssl。SSLHandshakeEx

  • 我刚开始穿春靴。到目前为止我还很享受。我已经开发了一个演示SSL rest web服务器,它可以正确处理相互X.509证书身份验证。使用带有自签名客户端和服务器证书的IE浏览器,我测试了演示rest web服务器是否正常工作--服务器和浏览器都成功地交换和验证了彼此的证书。 我很难找到一个SSL客户机示例来说明如何包含客户机证书并发布HTTPS。谁有一个简单的rest客户机示例来说明如何使用我的s

  • 我目前正在努力掌握Spring和Fign。开门见山:我正在努力修改这个项目中的“飞度客户端”: Walery的“飞度你好世界”,以便代替 维基百科 使用@Autowired表示法,类似于此处的一个表示法:部分名为:手动创建外部客户端 这样做的目的是稍后注入自定义解码器和编码器。我已经尝试了一段时间,我所能实现的就是破坏整个事情。 我从这里和那里收集了一些线索,并设法到达了创建Configurati

  • 我正在努力与Netty 4.0.8网络套接字客户端示例和SSL,我似乎无法将数据发送到Netty SSL网络套接字服务器示例。尽管围绕这个问题已经有很多帖子了,(我相信我已经浏览了所有的帖子),最常见的建议是在管道的开头添加一个sslHandler,但它不起作用。握手似乎是成功的,因为它也表明了一个相关的问题在这里。 我记得4.0版的情况也一样。0,但我还是设法让它工作了。然而,当我升级到4.0时

  • 大家好,我正试图使用“pip install docker cloud”在ubuntu 14:10中安装docker cloud cli,但我收到了下面的错误,有什么想法吗? 正在复制lib/yaml/resolver。派克- 为Pyaml运行安装程序生成控制盘失败。py clean for PyYAML无法生成PyYAML安装收集的软件包:PyYAML,docker cloud找到现有安装:Py

  • 1. 创建 Maven 工程 服务端部署完毕后,我们可以新建一个 Maven 工程使用 SOFARegistry 提供的服务。首先新建一个 Maven 工程,然后引入如下依赖: <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>registry-client-all</artifactId> <versi