¿Cómo crear una cadena de certificados de confianza si tengo el último certificado?

0

Buen día. Durante las últimas dos semanas intenté crear mi aplicación cliente xmpp que se conectará al servidor xmpp a través de TLS (porque el servidor lo está utilizando)

Mi servidor es:

telnet xmpp.odnoklassniki.ru 5222
Trying 217.20.145.69...
Connected to xmpp.odnoklassniki.ru.
Escape character is '^]'.

Si lo hago:

  

openssl s_client -connect xmpp.odnoklassniki.ru:5222 -starttls xmpp   -showcerts | sed -ne '/ -BEGIN CERTIFICATE - /, / - END CERTIFICATE- / p' > /Usuarios/dmitry/odnoklassniki.pem

/Users/dmitry/odnoklassniki.pem es aquí

Después de esto, ¿cómo puedo crear la cadena de certificados e importarla al almacén de claves de confianza?

Si estoy usando Adium messenger funciona bien y en la pestaña de preferencias veo esto:

Porfavor,ayúdame.

Excepciónlanzadapormicódigo:

javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:rootcertificatenottrustedof[*.odnoklassniki.ru]atcom.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)atcom.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1764)atcom.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)atcom.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)atcom.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)atcom.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)atcom.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)atcom.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)atcom.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:958)atcom.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203)atcom.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230)atcom.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214)atorg.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:806)atorg.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:267)atorg.jivesoftware.smack.PacketReader.access$000(PacketReader.java:43)atorg.jivesoftware.smack.PacketReader$1.run(PacketReader.java:70)Causedby:java.security.cert.CertificateException:rootcertificatenottrustedof[*.odnoklassniki.ru]atorg.jivesoftware.smack.ServerTrustManager.checkServerTrusted(ServerTrustManager.java:144)atcom.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1198)...11more

UPDATED

  1. Descarguéelcertificadodehttps://www.entrust.net/downloads
  2. despuésdeesteC:\>keytool-import-aliasRoot-keystoreo.keystore-trustcacerts-fileroot.cerobtuveunalmacéndeclaveso.keystore
  3. enelcódigoheagregadoestasopciones:

      

    config.setDebuggerEnabled(true);  config.setSASLAuthenticationEnabled(true);  config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);  config.setSelfSignedCertificateEnabled(true);  config.setExpiredCertificatesCheckEnabled(true);  config.setVerifyRootCAEnabled(true);config.setTruststoreType("JKS");   config.setKeystorePath ("/ Users / dmitry / o.keystore");   config.setTruststorePath ("/ Users / dmitry / o.keystore");   config.setTruststorePassword ("changeit");

Pero el mismo error:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: root certificate not trusted of [*.odnoklassniki.ru]

Información de depuración

  

keyStore es: keyStore tipo es: jks keyStore proveedor es: init   keystore init keymanager de tipo SunX509 trustStore es: c: \ my.keystore   El tipo de trustStore es: jks El proveedor de trustStore es: init truststore   agregando como certificado de confianza: Asunto: CN = Certificación de Raíz Entrust   Autoridad, OU="(c) 2006 Entrust, Inc.", OU = www.entrust.net / CPS es   incorporado por referencia, O="Entrust, Inc.", C = Emisor estadounidense:   CN = Entust Root Certification Authority, OU="(c) 2006 Entrust, Inc.",   OU = www.entrust.net / CPS se incorpora por referencia, O="Entrust,   Inc. ", C = Algoritmo de EE. UU .: RSA; Número de serie: 0x456b5054 Válido desde   Lunes 27 de noviembre 23:23:42 MSK 2006 hasta sábado 28 de noviembre 00:53:42 MSK 2026

¿Qué estoy haciendo mal?

    
pregunta Dmitry Zagorulkin 14.11.2012 - 09:42
fuente

1 respuesta

4

No pones una cadena completa en una "tienda confiable". El almacén de confianza contiene las claves en las que confía a priori . Normalmente, tendría el certificado que inicia la cadena en su tienda de confianza. El servidor SSL en realidad envía una cadena completa (que es parte del estándar SSL / TLS , sección 7.4.2). Luego, el cliente verifica la firma en cada certificado de la cadena, en relación con la clave pública que se encuentra en el certificado anterior, y comienza con el certificado raíz, que se encuentra en el almacén de confianza.

En su caso, la CA raíz parece ser la "Autoridad de Certificación de Servidor Seguro Entrust.net", y ese es el certificado que necesita colocar en su tienda de confianza. El almacén de confianza Java predeterminado no lo contiene. Consulte esta pregunta para obtener explicaciones y sugerencias sobre cómo cambiar eso .

    
respondido por el Thomas Pornin 15.11.2012 - 01:30
fuente

Lea otras preguntas en las etiquetas