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)
经过大量的盲目尝试和错误,我终于成功了。
问题是,默认情况下,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 已正确传递到底层连接。
归档时间: |
|
查看次数: |
15344 次 |
最近记录: |