truststorefile example java ssl https cas

java - example - La construcción de ruta PKIX falló, pero el certificado está en cacerts



ssl java (3)

Tengo el problema que también se describe aquí . El caso es que creé un certificado y lo agregué al almacén de claves de tomcat, y luego lo copié en el cacerts confianza de cacerts. Sin embargo, de alguna manera sigo teniendo este error.

Que he hecho:

1) keytool -genkey -alias cas -keyalg RSA -keystore cas.keystore -storepass changeit

2) keytool -exportcert -alias cas -file cas.crt -keystore cas.keystore

Paso 2) porque quería poner el certificado en mi keystore y tomcat cacerts

3) keytool -import -alias cas -file cas.crt -keystore "C: / Archivos de programa / Java / jdk1.8.0_77 / jre / lib / security / cacerts"

4) keytool -import -alias archivo-cas "C: / Archivos de programa / Java / jdk1.8.0_7 / jre / bin / cas.crt" -keystore "D: / portal / apache-tomcat-8.0.3 / conf / portal.keystore "

Ahora, con los pasos 3 y 4, agregué el certificado en mi keystore de tomcat y en los repositorios de cacerts .

Ahora puedo hacer una lista de mi confianza y almacén de claves

Con este comando ...

keytool -list -v -keystore "C: / Archivos de programa / Java / jdk1.8.0_77 / jre / lib / security / cacerts" -alias cas

... Entiendo esto:

Keystore-Kennwort eingeben: Aliasname: cas Erstellungsdatum: 09.09.2016 Eintragstyp: trustedCertEntry Eigentümer: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx Aussteller: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx Seriennummer: xxx Gültig von: Fri Sep 09 10:40:55 CEST 2016 bis: Thu Dec 08 09:40:55 CET 2016 Zertifikat-Fingerprints: MD5: .... SHA1: .... SHA256: .... Signaturalgorithmusname: SHA256withRSA Version: 3 Erweiterungen: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [... ] ]

Y con esto:

keytool -list -v -keystore "D: / portal / apache-tomcat-8.0.30 / conf / portal.keystore" -alias cas

Entiendo esto:

Keystore-Kennwort eingeben: Keystore-Typ: JKS Keystore-Provider: SUN Keystore enthält 1 Eintrag Aliasname: cas Erstellungsdatum: 09.09.2016 Eintragstyp: trustedCertEntry Eigentümer: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx Aussteller: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx Seriennummer: ... Gültig von: Fri Sep 09 10:40:55 CEST 2016 bis: Thu Dec 08 09:40:55 CET 2016 Zertifikat-Fingerprints: MD5: ... SHA1: ... SHA256: ... Signaturalgorithmusname: SHA256withRSA Version: 3 Erweiterungen: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ ] ]

Si no está claro: los certificados (cas) son los mismos.

Así que mi impresión fue que el certificado ahora está en el almacén de claves del servidor de tomcat y los caces de cacerts . Pero de alguna manera sigo recibiendo esta excepción cuando ingresé mis credenciales en el servidor CAS y me redireccionaron (full stack rastrean abajo):

HTTP Status 500 - 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

Estos son mis conectores en mis server.xml :

<Connector port="8743" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" maxThreads="150" scheme="https" keystoreFile="${catalina.base}/conf/portal.keystore" keystorePass="changeit" secure="true" connectionTimeout="240000" clientAuth="false" sslProtocol="TLS" allowUnsafeLegacyRenegotiation="true" /> <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8309" protocol="AJP/1.3" redirectPort="8743" />

¿Cuál es la posible causa de mi problema? Todos los otros hilos como el mencionado al principio señalan que el OP no importó el certificado al archivo cacerts, pero lo hice.

La pila completa:

09-Sep-2016 12:05:30.146 SEVERE [http-bio-8743-exec-4] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [default] in context with path [/cas-sample] threw exception java.lang.RuntimeException: 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.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:443) at org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:41) at org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:193) at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:204) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:279) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) 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 at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1513) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) at org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.java:429) ... 20 more Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) at sun.security.validator.Validator.validate(Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) ... 33 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) ... 39 more


Mi problema fue bastante inesperado. Tenía un Tomcat que tenía un setenv.bat modificado que tenía opciones que apuntaban a otra ubicación de un almacén de claves. No sabía mucho sobre Tomcat y los servidores de aplicaciones en general, así que no pude entender eso antes.


Puede navegar al directorio tomcat / bin. Modifique catalina.sh (o catalina.bat dependiendo de su sistema operativo).

Agregue las siguientes propiedades a JAVA_OPTS.

JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=$CATALINA_HOME/certificates/truststore.ks -Djavax.net.ssl.trustStorePassword=truststorePassword -server"

Recientemente tuve que luchar contra algunos problemas de almacén de confianza / keystore yo mismo. Una herramienta que encontré muy útil para ver / modificar fácilmente trust / keystores es keystore explorer .


Su elemento Connector define un almacén de claves. Ese es un lugar donde se buscarán claves privadas y sus certificados.

Su excepción se refiere a un almacén de confianza , que es un lugar donde se encuentran o no se encuentran certificaciones de CA confiables.

Debe definir el almacén de confianza utilizado por Tomcat de alguna manera, ya sea a través de la configuración o mediante la propiedad del sistema javax.net.ssl.trustStore .