如何使用p12存储(和密码)配置sslContext,以便在Spring/Kotlin中使用https端点进行客户端身份



我想使用证书和私钥调用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;

最新更新