我有一个调用远程服务的 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/