多亏了Kannan和Niraj的回答,我成功地将我的外国客户机配置为使用CustomsSocketFactory。
我的用例:我有一个API,它要求将SSL证书添加到JAVA cacerts上的本地机器上,以便获取它。但是,在云服务器上部署后,我无法添加此证书。因此,我需要配置我的外部客户端,以便从我的应用程序本身接收自定义信任存储。
这是我的版本
-
使用添加的证书创建您自己的信任库
keytool -import -file <filepath-of-certificate> -alias <certificate-alias-name> -keystore <truststore-alias-name>
系统将提示输入密码,设置您自己的密码并记住它
Truststore不需要对此案例进行任何扩展
-
将此truststore文件复制到spring boot应用程序的资源文件夹
-
正在应用中。属性或应用程序。yml文件为您的信任库设置类路径和密码。我正在使用应用程序。yml因此示例如下
e、 g。
example-service:
server: https://example.api.com
trustStore: classpath:<Your truststore name>
trustStorePassword: yourpassword
您也可以跳过步骤3,直接传入下面的信任库和密码
-
在CustomFeignConfig类中,您可以直接将truststore作为资源传入,并直接将truststore inputstream传入sslsocketfactory。请注意,Bean表示法对于覆盖默认的外部配置至关重要。
对于我的案例,我只需要一个信任库,所以我在sslContext上传入一个空的新KeyManager[]{}。初始化()
public class CustomFeignConfig {
@Bean
public Client feignClient(@Value("${example-service.trustStore}") Resource trustStoreResource,
@Value("${example-service.trustStorePassword}") String trustStorePassword) throws Exception {
try {
return new Client.Default(
sslSocketFactory(trustStoreResource.getInputStream(), trustStorePassword),
null);
} catch (Exception e) {
throw new Exception("Error in initializing feign client", e);
}
}
private static SSLSocketFactory sslSocketFactory(InputStream trustStoreStream, String trustStorePassword)
throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
TrustManagerFactory tmf = createTrustManager(trustStoreStream, trustStorePassword);
sslContext.init(new KeyManager[]{}, tmf.getTrustManagers(), null);
return sslContext.getSocketFactory();
}
private static TrustManagerFactory createTrustManager(InputStream trustStoreStream, String trustStorePassword)
throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(trustStoreStream, trustStorePassword.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
return tmf;
}
}
-
仅将此自定义外部配置应用于需要它的api
@FeignClient(name = "example-service", url = "${example-service.server}", configuration = CustomFeignConfig.class)
public interface MyFeignClient {}