如何在 spring feign 客户端中使用 p12 客户端证书

BiA*_*AiB 5 client-certificates spring-boot 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
Run Code Online (Sandbox Code Playgroud)

但这并没有改变任何东西,我仍然收到此错误:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Run Code Online (Sandbox Code Playgroud)

BiA*_*AiB 7

经过大量的盲目尝试和错误,我终于成功了。

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

org.springframework.cloud.openfeign.FeignClientsConfiguration#feignBuilder

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

feign.Feign.Builder

  public static class Builder {
    // ...
    private Client client = new Client.Default(null, null);
Run Code Online (Sandbox Code Playgroud)

所以,我必须在 @Configuration 中定义这个 bean:

@Bean
@Profile({"prod", "docker"})
public Feign.Builder feignBuilder() {
    return Feign.builder()
        .retryer(Retryer.NEVER_RETRY)
        .client(new Client.Default(getSSLSocketFactory(), null));
Run Code Online (Sandbox Code Playgroud)

用这个方法:(不记得来源)

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();
}
Run Code Online (Sandbox Code Playgroud)

现在,它对我有用,我通过假客户端调用进行了调试,并且 sslSocketFactory 已正确传递到底层连接。