Я пытаюсь дать серверу «А» возможность подключаться к серверу «В», используя тот же сертификат клиента 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();
}
Итак, что я не понимаю?И как должен передать сертификат клиента?