#java #ssl #certificate #pki #ejbca
#java #ssl #сертификат #pki #ejbca
Вопрос:
Я бы хотел, чтобы приложение Java подключалось к веб-службе с использованием библиотеки EJBCA, но оно выдает исключение. Вы видите следующий метод void, пытающийся подключиться к Ejbca
protected void connectToEjbca() {
LOG.info("Establishing Ejbca conecction");
String trustStore = CONFIG.getProperty("truststore");
String trustStorePassword = CONFIG.getProperty("truststore.password");
String keyStoreType = CONFIG.getProperty("keystore.type");
String keyStore = CONFIG.getProperty("keystore");
String keyStorePassword = CONFIG.getProperty("keystore.password");
String ejbcaUrl = CONFIG.getProperty("url");
try{
CryptoProviderTools.installBCProvider();
KeyManager[] kms = this.getKeyManagers(keyStore, keyStorePassword);
TrustManager[] tms = this.getTrustManagers(trustStore, trustStorePassword);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kms, tms, null);
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) { return true; }
};
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(hv);
QName qname = new QName("http://ws.protocol.core.ejbca.org/", "EjbcaWSService");
EjbcaWSService service = new EjbcaWSService(new URL(ejbcaUrl),qname);
ws = service.getEjbcaWSPort();
connect = true;
LOG.info("EJBCA connection was successfully");
}catch(Exception ex){
LOG.info("Error in EJBCA connection: " ex.getLocalizedMessage());
connect = false;
ex.printStackTrace();
}
}
Сбой выполнения кода в строке:
Служба EjbcaWSService = новый EjbcaWSService(новый URL (ejbcaUrl), qname);
И в исключениях говорится:
org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
Caused by: javax.wsdl.WSDLException: WSDLException: faultCode=PARSER_ERROR: Problem parsing 'https://192.168.1.30:443/ejbca/ejbcaws/ejbcaws?wsdl'.: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Согласно config.properties:
url=https://192.168.1.30:443/ejbca/ejbcaws/ejbcaws?wsdl
truststore=E:\admin_test.jks
keystore=E:\admin_test.p12
keystore.type=PKCS12
Переменные пароля в порядке.
Кроме того, я импортировал сертификат admin_test.p12 в firefox, и браузеры отображают страницу https://192.168.1.30:443/ejbca/ejbcaws/ejbcaws?wsdl очень хорошо.
Кроме того, я импортировал сертификат admin_test.p12 в Windows Cert Manager. Затем. Я экспортировал как сертификат X.509 (admin_test.cert). После этого я создал файл JKS с помощью KeyStore Explorer и импортировал admin_test.cert.
Эти два файла admin_test.cert и admin_test.p12 указаны в config.properties
Итак, URL https://192.168.1.30:443/ejbca/ejbcaws/ejbcaws?wsdl работает в Firefox, но приложение Java этого не делает.
Я подозреваю, что проблема в файле jks, который, я думаю, не сгенерирован должным образом.
Что я могу сделать?
Ответ №1:
Я думаю, вы правы. Ваше сообщение об ошибке «не удается найти действительный путь сертификации к запрошенной цели», в котором говорится, что клиент не может найти сертификат CA как доверенный для проверки соединения TLS. Это проблема с установлением соединения TLS. truststore должен содержать сертификат CA цепочки сертификатов сервера и ничего больше.
Комментарии:
1. Это решено, то, что произошло с admin_test.jks, было производным файлом из admin_test.p12, а не для сертификата CA. Итак, я создал новый файл jks, включающий сертификат CA, затем заменил новые jks вместо старых jks, и он начал работать.