我想使用证书和私钥调用https保护的端点。我收到了一个受密码保护的.p12密钥库。
出于测试目的,我使用openssl提取了.cer文件和私钥。
我可以通过如下设置ssl上下文在本地验证通信是否有效:
fun test(): WebClient.RequestHeadersSpec<*> {
val sslContext = SslContextBuilder
.forClient()
.keyManager(ClassPathResource("cert").inputStream, ClassPathResource("key").inputStream)
.build()
val httpClient: HttpClient = HttpClient.create().secure { sslSpec -> sslSpec.sslContext(sslContext) }
val webClient = WebClient
.builder()
.baseUrl("baseUrl")
.clientConnector(ReactorClientHttpConnector(httpClient))
.build()
return webClient
.post()
.uri("uri")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue("test")
}
但是,我不想在我的存储库中对证书和私钥进行版本设置。如何使用.p12密钥库和密码设置sslContext?我没有找到任何关于这种情况的例子。
从光盘加载文件
这是java,但应该很容易适应kotlin
KeyStore keyStore = KeyStore.getInstance("pkcs12");
keyStore.load(new FileInputStream(keyStoreLocation), keyStorePassword.toCharArray());
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
new SSLContextBuilder()
.loadKeyMaterial(keyStore, keyStorePassword.toCharArray())
.build(),
NoopHostnameVerifier.INSTANCE);
HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
其中可以从配置提供文件位置和密码
@Value("${keyStore.location}")
private String keyStoreLocation;
@Value("${keyStore.password}")
private String keyStorePassword;