Использование файла.p12 для выполнения запроса на оставшийся сервер
Я пытаюсь выполнить запросы к серверу, который предоставил мне файл.p12, чтобы установить безопасное соединение с остальными службами, я делаю следующее, чтобы установить HttpClient с ключом:
SSLContext sslContext =SSLContextBuilder
.create().loadKeyMaterial(ResourceUtils.getFile("classpath:keystore/file.p12"), "secret".toCharArray(), "secret".toCharArray())
.build();
return HttpClientBuilder
.create()
.setConnectionManager(connManager())
.setSSLContext(sslContext)
.setDefaultRequestConfig(requestConfig())
.build();
Когда я выполняю запрос с OAuth2RestOperations, я получаю:
401 , Non existing certificate or invalid
3 ответа
Решение
У меня недавно было подобное требование. Вот код, который я использовал:
KeyStore clientStore = KeyStore.getInstance("PKCS12");
try {
clientStore.load(ResourceUtils.getFile("classpath:keystore/file.p12"), "secret".toCharArray());
} catch (IOException e) {
//handle exception
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(clientStore, "secret".toCharArray());
KeyManager[] kms = kmf.getKeyManagers();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kms, null, new SecureRandom());
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
HttpClientBuilder builder = HttpClientBuilder.create();
return builder.setSSLSocketFactory(socketFactory).build();
Во всех примерах вам нужно вызвать метод loadKeyMaterial с KeyStore
public SSLContextBuilder loadKeyMaterial(KeyStore keystore,
Загрузите хранилище ключей, используя путь к файлу, например:
keyStore = KeyStore.getInstance("PKCS12"); FileInputStream inputStream = new FileInputStream(new File(certPath)); keyStore.load(inputStream, certPassword.toCharArray());
Я думаю, что это на самом деле дублирующий вопрос.
Пожалуйста, посмотрите этот ответ на этот вопрос Проверка подлинности сертификата клиента Java HTTPS.