Как получить ключ publi c из SSL-соединения - PullRequest
0 голосов
/ 21 января 2020

У меня есть служба REST, к которой я получаю доступ через https. Параметры службы включают пароли в виде открытого текста, которые на уровне TRACE регистрируются в файлах журнала. Чтобы избежать непреднамеренной регистрации этих данных, я хочу зашифровать пароли перед отправкой, очевидный способ (по крайней мере для меня) - использовать ключ publi c соединения https.

Я не хочу отключать ведение журнала, потому что детали иногда полезны, и было бы очень просто случайно включить их заново.

Я использую Spring RestTemplate.

Как получить ключ publi c?

1 Ответ

0 голосов
/ 29 января 2020

Я решил эту проблему, установив соединение HttpsURLConnection с сервером.

KeyStore keyStore = loadKeystore(keystoreFilename, keystorePassword);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, keystorePassword.toCharArray());

KeyStore trustStore = loadKeystore(truststoreFilename, truststorePassword);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, trustManagers, new java.security.SecureRandom());

URL destinationURL = new URL(origin);
HttpsURLConnection conn = (HttpsURLConnection) destinationURL.openConnection();
conn.setSSLSocketFactory(sslContext.getSocketFactory());
conn.connect();

return conn.getServerCertificates();

private KeyStore loadKeystore(String keyStoreFilename, String keyStorePassword) {
    try {
        final KeyStore trustStore = KeyStore.getInstance("JKS");
        final InputStream is = new FileInputStream(keyStoreFilename);
        trustStore.load(is, keyStorePassword.toCharArray());

        return trustStore;

    } catch (Exception ex) {
        throw new MyException(ex);
    }
}

Возвращает массив сертификатов, первым элементом которого является сертификат однорангового узла, из которого ключ publi c можно получить.

...