Мне нужно настроить javax.net.ssl.SSLContext
для использования в приложении Jersey-Client. Все, что я хочу сделать, это контекст, чтобы принять пользовательский сертификат root ca. Действительно ли верно, что нет способа создания файла хранилища ключей и импорта сертификата ЦС?
Использование SSLContext только с сертификатом CA и без хранилища ключей
Ответ 1
Действительно ли это так, что нет способа создания хранилища ключей файл и импортировать сертификат CA?
Есть способ сделать это без файла хранилища ключей, но так как вам придется загрузить сертификат CA, которому вы хотите доверять так или иначе, вам придется каким-то образом загрузить файл или ресурс.
(Возможно, вы также можете реализовать свой собственный TrustManager
, который заставляет все вызовы использовать API-интерфейс сертификации, не используя API KeyStore
вообще, но это только увеличило бы сложность вашего кода, а не уменьшало бы его Вам также нужно будет понять Руководство программиста Java PKI, чтобы сделать это правильно.)
Если вам действительно не нужен файл хранилища ключей, вы можете использовать API KeyStore
в памяти и загрузить сертификат напрямую.
Что-то в этом направлении должно работать (не проверено):
InputStream is = new FileInputStream("cacert.crt");
// You could get a resource as a stream instead.
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate caCert = (X509Certificate)cf.generateCertificate(is);
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null); // You don't need the KeyStore instance to come from a file.
ks.setCertificateEntry("caCert", caCert);
tmf.init(ks);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
(Не забудьте закрыть все и обработать исключения.)
Возможно ли загрузить сертификат таким образом или загрузить сертификат в похожий экземпляр KeyStore
из файла хранилища ключей, более удобно решать вам.