【发布时间】:2021-04-07 02:18:08
【问题描述】:
关于 Netty、Spring Webflux 以及如何向多个下游系统发送 http 请求的小问题,当每个下游系统都需要 mTLS 并且需要一个不同的客户端证书来向每个下游系统发送请求时?
到目前为止,我在 Java 11 Spring Webflux 2.4.2 应用程序中用于发送请求的内容是:
@Bean
@Primary
public WebClient getWebClient() {
return WebClient.create().mutate().defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).clientConnector(new ReactorClientHttpConnector(HttpClient.create().wiretap(true).secure(sslContextSpec -> sslContextSpec.sslContext(getSslContext())))).build();
}
对于 Netty SslContext(顺便说一句,它不是 apache SSLContext)
public SslContext getSslContext() {
try {
final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
try (InputStream file = new FileInputStream(keyStorePath)) {
final KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(file, keyStorePassPhrase.toCharArray());
keyManagerFactory.init(keyStore, keyPassPhrase.toCharArray());
}
final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
try (InputStream trustStoreFile = new FileInputStream(trustStorePath)) {
final KeyStore trustStore = KeyStore.getInstance(trustStoreType);
trustStore.load(trustStoreFile, trustStorePassPhrase.toCharArray());
trustManagerFactory.init(trustStore);
}
return SslContextBuilder.forClient().keyManager(keyManagerFactory).trustManager(trustManagerFactory).build();
} catch (CertificateException | NoSuchAlgorithmException | IOException | KeyStoreException | UnrecoverableKeyException e) {
return null;
}
}
当我们只需要向下游发送请求时,这甚至可以正常工作。
即使有多个下游,这也可以工作,并且它们接受相同的客户端证书!
但是当每个下游都要求我使用他们各自的客户端证书时,问题就出现了。
请问如何实现?
谢谢
【问题讨论】:
-
我建议对需要不同证书的不同下游使用不同的 WebClient。
标签: java ssl spring-webflux