У меня проблемы с хранилищами ключей и доверенными. Для моего первого опыта в Springboot я должен разработать приложение, которое должно отправлять пост-запрос в Rest API и получать ответ Json. Приложение требует использовать сертификат P12 для выполнения запросов. Этот сертификат P12 был предоставлен нам.
Я провел несколько испытаний с Почтальоном (добавив файлы crt и ключи, которые я создал из файла P12) или с интерфейсом SOAP (непосредственно с файлом P12), и получил ответ от сервера.
Моя проблема касается моей разработки на Java и моего понимания хранилищ ключей и доверенных сертификатов.
В своих свойствах Application.properties я установил следующие значения:
server.ssl.key-store-type=PKCS12
server.ssl.key-store=C:/keystore/CERTIFICATE.p12
server.ssl.key-store-password=changeIt
server.ssl.key-alias=mycert
Я должен сделать вызов REST POST в методе из класса обслуживания:
Pkcs12Reader reader = new Pkcs12Reader();
String trustStore = properties.getProperty("server.ssl.key-store");
String keyStore = properties.getProperty("server.ssl.key-store");
String trustStorePassword = properties.getProperty("signature.api.passphrase");
String keyStorePassword = properties.getProperty("signature.api.passphrase");
if (isBlank(keyStore) || isBlank(keyStorePassword) || isBlank(trustStore) || isBlank(trustStorePassword)) {
throw new Exception("TrustStore or KeyStore details are empty, which are required to be present");
}
// I build the SSL context here
SSLContext sslContext = reader.getSSLContext(trustStore, keyStore, trustStorePassword, keyStorePassword);
// .. whatever
В Pkcs12Reader у меня есть эти методы:
public SSLContext getSSLContext(String trustStore, String keyStore, String trustStorePassword, String keyStorePassword) throws Exception {
try {
TrustManagerFactory trustManagerFactory = getTrustManagerFactory(trustStore, trustStorePassword);
KeyManagerFactory keyManagerFactory = getKeyManagerFactory(keyStore, keyStorePassword);
return getSSLContext(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers());
} catch (UnrecoverableKeyException | NoSuchAlgorithmException | CertificateException | KeyStoreException | IOException | KeyManagementException e) {
throw new Exception(e);
}
}
private SSLContext getSSLContext(KeyManager[] keyManagers, TrustManager[] trustManagers) throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, trustManagers, null);
return sslContext;
}
private KeyManagerFactory getKeyManagerFactory(String keystorePath, String keystorePassword) throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException {
KeyStore keyStore = loadKeyStore(keystorePath, keystorePassword);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, keystorePassword.toCharArray());
return keyManagerFactory;
}
private TrustManagerFactory getTrustManagerFactory(String truststorePath, String truststorePassword) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
KeyStore trustStore = loadKeyStore(truststorePath, truststorePassword);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
return trustManagerFactory;
}
private KeyStore loadKeyStore(String keystorePath, String keystorePassword) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
try(InputStream keystoreInputStream = SSLTrustManagerHelper.class.getClassLoader().getResourceAsStream(keystorePath)) {
if (isNull(keystoreInputStream)) {
throw new Exception(String.format("Could not find the keystore file with the given location %s", keystorePath));
}
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
keystore.load(keystoreInputStream, keystorePassword.toCharArray());
return keystore;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
У меня есть несколько проблем:
- мой trustStore равен нулю
- мой keystore равен нулю
- keystoreInputStream имеет значение null и возвращает следующее исключение: java.lang.Exception: Не удалось найти файл хранилища ключей суказанное расположение C: \ keystore \ CERTIFICATE.p12
trustStore / keyStore не должно быть правильно настроено. И я застрял на пару дней. Спасибо