Ошибка SSLHandshakeException при вызове веб-службы SOAP с Axis2 с использованием AuthSSLProtocolSocketFactory. Сертификат и сертификат доверия - PullRequest
0 голосов
/ 24 апреля 2020

Я создаю приложение java, которое использует веб-службу soap и использует библиотеки Axis2 для установления соединения. У меня нет большого опыта работы с сертификатами или в связи с веб-сервисами, и я думаю, что с сертификатом что-то не так, потому что он дает мне следующую ошибку:

24/04/2020 13:47:16 INFO  [HTTPSender:196] - Unable to sendViaPost to url[https://empresaurl.com/blabla1/blabla2/wsConsPersonaV2]
org.apache.axis2.AxisFault: Connection has been shutdown: 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
at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
at org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:78)
at org.apache.axis2.transport.http.AxisRequestEntity.writeRequest(AxisRequestEntity.java:84)
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:621)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:193)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:404)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:231)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443)
at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406)
at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
at es.empresa.sdncheckv2.SDNCheckV2PortTypeServiceStub.wsConsPersonaV2(SDNCheckV2PortTypeServiceStub.java:182)
at com.empresa.apl.ws.client.wsConsPersonaV2.ServicioConsultaPersona.invocarServicio(ServicioConsultaPersona.java:96)
at com.empresa.apl.threads.ThreadClientWS.run(ThreadClientWS.java:215)
Caused by: com.ctc.wstx.exc.WstxIOException: Connection has been shutdown: 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
at com.ctc.wstx.sw.BaseStreamWriter._finishDocument(BaseStreamWriter.java:1406)
at com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:247)
at org.apache.axiom.util.stax.wrapper.XMLStreamWriterWrapper.close(XMLStreamWriterWrapper.java:46)
at org.apache.axiom.om.impl.MTOMXMLStreamWriter.close(MTOMXMLStreamWriter.java:222)
at org.apache.axiom.om.impl.llom.OMSerializableImpl.serializeAndConsume(OMSerializableImpl.java:192)
at org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:74)
... 19 more

Соединение с веб-сервисом с сертификатами сделано с AuthSSLProtocolSocketFactory. Это файл свойств:

cert.name.path=file:///D:/empresa/APL/Certificados/APLJKS_PRE.jks
cert.name.password=APLPASS
cert.trust.path=file:///D:/empresa/APL/Certificados/APLJKS_PRE.jks
cert.trust.password=APLPASS

Как видите, я использую один и тот же файл сертификата для параметра сертификата и сертификата доверия. Я читал, что это можно сделать, но это не работает, или, возможно, сертификат доверия должен быть другим. Это код, который реализует протокол:

    logger.info("ServicioConsultaPersona - Inicio");

    try {

        this.serviceURL = serviceURL;
        String certNamePath = PBC_PROPERTIES.getProperty("cert.name.path");
        String certPassword = PBC_PROPERTIES.getProperty("cert.name.password");
        String trustNamePath = PBC_PROPERTIES.getProperty("cert.trust.path");
        String trustPassword = PBC_PROPERTIES.getProperty("cert.trust.password");           

        URL urlCert = new URL(certNamePath);
        URL urlTrust = new URL(trustNamePath); 


        Protocol.registerProtocol("https", new Protocol("https", 
                (ProtocolSocketFactory) new AuthSSLProtocolSocketFactory(
                        urlCert, certPassword,
                        urlTrust, trustPassword
                ), 
                443));

        logger.info("ServicioConsultaPersona - Fin");
    } catch (Exception e) {
        logger.error("Se ha producido un error:", e); 
        throw e;
    }

Я проверил этот сертификат JKS с curl и SOAPUI, и он возвращает данные. Таким образом, кажется, что JKS является правильным, но, возможно, мне нужно создать сертификат доверия, и я не знаю, как это сделать.

Я даю вам шаги, которые я предпринял для создания сертификата JKS Компания дал мне следующие шаги: я создал csr и ключ со следующей инструкцией:

openssl req -new -newkey rsa:2048 -sha256 -nodes -out APL_Cert_PRE.csr -keyout APL_Key_PRE.key -subj "/C=ES/ST=Barcelona/L=Calle Pepito Grillo, 2-4/O=Empresa SA/OU=BLABLABLA/CN=APLAUT_PRE_CER"

Эти файлы были созданы с помощью инструкции выше:

  • APL_Cert_PRE.csr
  • APL_Key_PRE.key

После создания этих файлов я отправил их в компанию, и они вернули следующие сертификаты:

  • APL_PRE.cer
  • APL_PRE_EMISORA.cer
  • APL_PRE_ ROOT .cer

Чтобы создать файл pkcs12, мне пришлось преобразовать следующие сертификаты в формат pem. Новые файлы также были предоставлены компанией:

  • APL_PRE_ ROOT .cer
  • APL_PRE_EMISORA.cer
  • AddTrust External CA Root .cer
  • COMODO CA Emisora ​​Intermedia.cer
  • COMODO CA Root .cer
  • Центр сертификации COMODO RSA.cer
  • COMODO RSA Расширенная проверка защищенного сервера CA. CER

Как только все эти сертификаты были преобразованы в PEM, они должны быть объединены в один файл .PEM. Я использовал следующую инструкцию:

 type APL_PRE_ROOT.pem APL_PRE_EMISORA.pem "AddTrust External CA Root.cer" "COMODO CA Emisora Intermedia.cer" "COMODO CA Root.cer" "COMODO RSA Certification Authority.cer" "COMODO RSA Extended Validation Secure Server CA.CER" > Certificados.pem

Затем я выполнил следующую инструкцию для создания pkcs12:

openssl pkcs12 -export -in APL_PRE.cer -inkey APL_Key_PRE.key -out APLP12_PRE.p12 -certfile certificados.pem -name APLpk12_PRE

Наконец, я создал JKS, который не работает в приложение, но оно работает с SOAPUI и curl со следующей инструкцией:

keytool -importkeystore -srckeystore APLP12_PRE.p12 -srcstoretype pkcs12 -srcalias APLpk12_PRE -destkeystore APLJKS_PRE.jks -deststoretype jks -deststorepass APLPASS -destalias APLjks_PRE

Пожалуйста, кто-нибудь может сказать мне, что я делаю не так? Если мне нужно создать доверительный сертификат, можете ли вы сказать мне, как я должен сделать это шаг за шагом?

...