Я успешно установил SSL-аутентификацию с сертификатами: настроил Apache http-клиент, настроил сервер (weblogic, CLIENT-CERT login-config, если это имеет значение), проверил, что он работает.
однако в коде клиента я должен жестко указать путь к хранилищу доверия (либо вручную инициализировать TrustManagerFactory
, либо через соответствующие свойства JVM) и его пароль, и я не чувствую, что это правильно. Кроме того, сертификаты должны быть вручную зарегистрированы на стороне клиента с помощью keytool
, что также не так гибко.
Итак, есть ли способ полностью избежать всего этого? в идеале клиент должен иметь файл сертификата, связанный с ним, отправляя его на сервер по запросу. я пытался гуглить, но так и не нашел, как вручную передать сертификат файл .
UPDATE
как предложено здесь , я попытался прочитать файл сертификата в новое хранилище ключей без пароля и инициализировать KeyManagerFactory
и TrustManagerFactory
с этим хранилищем ключей:
CertificateFactory cf = CertificateFactory.getInstance("X509");
Certificate cer = cf.generateCertificate(new FileInputStream("myFile.cer"));
KeyStore defaultKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
defaultKeyStore.load(null, "".toCharArray());
defaultKeyStore.setCertificateEntry("alias", cer);
trustManagerFactory.init(defaultKeyStore);
keyManagerFactory.init(defaultKeyStore, "".toCharArray());
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
но это не сработало. обычное исключение "peer not authenticated". Полагаю, это потому, что мне нужен соответствующий закрытый ключ, но получить его невозможно ...