我有一个调用远程服务的Sping Boot 应用程序。
这个远程Web服务为我提供了一个p12文件,它应该对我的应用程序进行身份验证。
如何配置我的伪客户端以使用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
3条答案
按热度按时间ie3xauqp1#
我终于可以通过大量的盲目试验和错误来做到这一点。
问题是,默认情况下,feign构建器使用null SSLSocketFactory构建feign客户端:
org.springframework.cloud.openfeign.FeignClientsConfiguration#feignBuilder:
feign.Feign.Builder:
所以,我必须在@Configuration中定义这个bean:
用这种方法:(不记得来源)
现在,它为我工作了,我调试了假装的客户端调用,sslSocketFactory被正确地传递给了底层连接。
vlf7wbxs2#
如果您希望在不使用keytool的情况下以编程方式实现上述效果,您可以执行以下操作:
使用该配置的FeignClient接口必须专门加载该配置
SSLContexts库只能使用p12证书,我们必须将PEM格式的证书和密钥转换为P12格式。
使用以下SSL命令从PEM证书和密钥创建p12证书:
请记录运行此命令后输入的密码。
使用以下命令将此p12证书转换为base64字符串
使用以下命令将此多行字符串转换为单行字符串:
使用此命令中的单行字符串和之前在application.properties中记录的密码。
8i9zcol23#
与@BiAiB的回答相反,如果有人在2023年面临同样的问题。我在Feign Configurations中将客户端配置为Bean,并在那里设置SSL Socket Factory详细信息。
Gradle导入:
虚拟配置中的客户端Bean:
并从资源文件中为创建了SSL Socket Factory,如下所示: