Попытка передать клиентский сертификат x509 на второй сервер - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь дать серверу «А» возможность подключаться к серверу «В», используя тот же сертификат клиента X509, который он получил от пользователя.Вот основные сведения о том, где я нахожусь:

public int makeRemoteCall() {
    URL url = new URL("https://host.com/service/request");
    HttpsURLConnection conn = url.openConnection();
    SSLSocketFactory factory = getFactoryFromSessionCert();
    conn.setSSLSocketFactory(factory);
    int responseCode = conn.getResponseCode();
    return responseCode;
}


public static SSLSocketFactory getFactoryFromSessionCert() throws Exception {
    HttpServletRequest request = getRequest();
    X509Certificate[] certs = (X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");

    KeyStore keyStore = KeyStore.getInstance("JKS");
    keyStore.load(null, null);
    keyStore.setCertificateEntry("client_cert", certs[0]);

    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
    keyManagerFactory.init(keyStore,  null);

    SSLContext context = SSLContext.getInstance("TLS");
    context.init(keyManagerFactory.getKeyManagers(), null, null);

    return context.getSocketFactory();
}

Я могу без проблем получить сертификат клиента и могу убедиться, что он действительно окажется в keyStore.Но сертификат, похоже, не превращает его в keyManagerFactory.

. Я думал, что проблема в том, что я не предоставляю пароль в keyManagerFactory.init(keyStore, null), поэтому я попытался предоставить его, но безуспешно.И должен ли я вообще?Я понимаю, что мне нужен пароль, если бы я загружал сертификаты и ключи из защищенного файла, но здесь я просто пытаюсь передать уже открытый публичный сертификат.

В качестве дополнительной справки эта базовая схема работаетесли я заменю getFactoryFromSessionCert() на это:

public static SSLSocketFactory getFactory(File pKeyFile, String pKeyPassword) throws Exception {

    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
    KeyStore keyStore = KeyStore.getInstance("JKS");
    InputStream keyInput = new FileInputStream(pKeyFile);
    keyStore.load(keyInput, pKeyPassword.toCharArray());
    keyInput.close();

    keyManagerFactory.init(keyStore,  pKeyPassword.toCharArray());
    SSLContext context = SSLContext.getInstance("TLS");
    context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());
    return context.getSocketFactory();
}

Итак, что я не понимаю?И как должен передать сертификат клиента?

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