Я создаю приложение 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
Пожалуйста, кто-нибудь может сказать мне, что я делаю не так? Если мне нужно создать доверительный сертификат, можете ли вы сказать мне, как я должен сделать это шаг за шагом?