Spring boot: не удалось найти файл хранилища ключей с указанным местоположением - PullRequest
0 голосов
/ 24 октября 2019

У меня проблемы с хранилищами ключей и доверенными. Для моего первого опыта в 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;
}

У меня есть несколько проблем:

  1. мой trustStore равен нулю
  2. мой keystore равен нулю
  3. keystoreInputStream имеет значение null и возвращает следующее исключение: java.lang.Exception: Не удалось найти файл хранилища ключей суказанное расположение C: \ keystore \ CERTIFICATE.p12

trustStore / keyStore не должно быть правильно настроено. И я застрял на пару дней. Спасибо

...