Java-приложение не может подключиться к веб-службе https, используя библиотеку EJBCA

#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, и он начал работать.