spring-boot - spring feign客户端如何使用p12客户端证书

标签 spring-boot client-certificates spring-cloud-feign

我有一个调用远程服务的 Spring Boot 应用程序。

这个远程 Web 服务为我提供了一个 p12 文件,该文件应该对我的应用程序进行身份验证。

如何配置我的 feign 客户端以使用 p12 证书?

我试过设置这些属性:

-Djavax.net.ssl.keyStore=path_to_cert.p12 -Djavax.net.ssl.keyStorePassword=xxx -Djavax.net.ssl.keyStoreType=PKCS12

但它没有改变任何东西,我仍然收到此错误:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

最佳答案

我终于可以通过大量盲目的试错来做到这一点。

问题是,默认情况下,feign builder 使用 null SSLSocketFactory 构建 feign 客户端:

org.springframework.cloud.openfeign.FeignClientsConfiguration#feignBuilder :

@Bean
@Scope("prototype")
@ConditionalOnMissingBean
public Feign.Builder feignBuilder(Retryer retryer) {
    return Feign.builder().retryer(retryer);
}

feign.Feign.Builder :
  public static class Builder {
    // ...
    private Client client = new Client.Default(null, null);

所以,我必须在@Configuration 中定义这个 bean:
@Bean
@Profile({"prod", "docker"})
public Feign.Builder feignBuilder() {
    return Feign.builder()
        .retryer(Retryer.NEVER_RETRY)
        .client(new Client.Default(getSSLSocketFactory(), null));

用这种方法:(不记得来源)
SSLSocketFactory getSSLSocketFactory() {
    char[] allPassword = keyStorePassword.toCharArray();
    SSLContext sslContext = null;
    try {
        sslContext = SSLContextBuilder
            .create()
            .setKeyStoreType(keyStoreType)
            .loadKeyMaterial(ResourceUtils.getFile(keyStore), allPassword, allPassword)
            .build();
    } catch (Exception e) { /* *** */ }
    return sslContext.getSocketFactory();
}

现在,它对我有用,我调试了 feign 客户端调用并且 sslSocketFactory 正确传递给底层连接。

关于spring-boot - spring feign客户端如何使用p12客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58059632/

相关文章:

java - Spring和Gradle构建:无此类属性:类的主类名称:org.gradle.api.internal.project.DefaultProject_Decorated

client-certificates - 苹果触摸图标在安全域中不起作用

c# - 本地 UWP 客户端到本地 asp.net core api web 服务器 - 证书颁发机构无效或不正确

java - Spring 启动 2 中的 FeignClient

spring-boot - 由于 lombok,Gradle 构建失败

java - 使用 Spring Boot 和 Spring Security 的 OpenID (OAuth2) 授权失败

java - HystrixFeign 客户端回退中获取原因的问题

spring-cloud-feign - feign如何获取所请求接口(interface)的头数据

spring-boot - Spring Reactive kafka Receiver 总是将引导服务器覆盖到本地主机

Java TLS 客户端在访问 soap 服务时找不到证书