Convert the certificate and private key to PKCS 12
openssl pkcs12 -export -in ./{your_cert}.cer -inkey ./{your_key}.key -name {host} -out {output_name}.p12
Import PKCS 12
and CA to keystore
keytool -importkeystore -deststorepass {password} -destkeystore ./{keystore.jks} -srckeystore ./{key.12} -srcstoretype PKCS12
keytool -import -alias bundle -trustcacerts -file ./{your_cert}.cer -keystore {keystore.jks}
At first add org.apache.httpcomponents:httpclient
to dependencies:
// gradle
compile group: 'org.apache.httpcomponents', name: 'httpclient'
<!-- maven -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
At second configure requestFactory
using key from keystore
@Configuration
public class TwoWaySslConfiguration {
@Value("classpath:keystore.jks")
private Resource keyStoreData;
@Value("${keystore-pwd}")
private String keyStorePassword;
@Value("${key-pwd}")
private String keyPassword;
@Bean
@SneakyThrows
public RestTemplate restTemplate() {
KeyStore keyStore = KeyStore.getInstance("jks");
keyStore.load(new BufferedInputStream(keyStoreData.getInputStream()), keyStorePassword.toCharArray());
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
new SSLContextBuilder()
.loadTrustMaterial(null, new TrustSelfSignedStrategy())
.loadKeyMaterial(keyStore, keyPassword.toCharArray()).build()
, NoopHostnameVerifier.INSTANCE);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(socketFactory)
.setMaxConnTotal(1)
.setMaxConnPerRoute(5)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
requestFactory.setReadTimeout(10000);
requestFactory.setConnectionRequestTimeout(10000);
return new RestTemplate(requestFactory);
}
}
So you can use RestTemplate
as standard rest client for Spring or just use
requestFactory
.
You can use Vault by HashiCorp if you want to provide right credential strategy.
Author Mark Andreev
Machine Learning Engineer