2010-09-23 27 views
6

Uso la conexión SSL para conectar el cliente web al servidor. Funciona sin ningún problema durante mucho tiempo. Pero desde ayer da el siguiente error ¿alguien puede decirme el motivo?Excepción SSL HandShake

javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1172) 
     at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65) 
     at net.schubart.fixme.internal.MessageInput.readExactly(MessageInput.java:166) 
     at net.schubart.fixme.internal.MessageInput.readMessage(MessageInput.java:78) 
     at cc.aot.itsWeb.ClientWriterThread.run(ClientWriterThread.java:241) 
     at java.lang.Thread.run(Thread.java:619) 
clientWriter.ready 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1586) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:865) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1029) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:621) 
     at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) 
     at java.io.OutputStream.write(OutputStream.java:58) 
     at net.schubart.fixme.internal.Message.write(Message.java:267) 
     at net.schubart.fixme.internal.MessageOutput.writeMessage(MessageOutput.java:53) 
+0

¿Tiene registros del servidor? ¿Es "SSL de una sola vía" (sin certificado de usuario) o autenticas a tu cliente? ¿Puedes conectar este servidor usando el navegador web? ¿Es válido el certificado del servidor? –

Respuesta

2

Compruebe que el certificado sea válido, puede hacerlo con su navegador.

2

El certificado presentado por el servidor no es confiable. Esto puede deberse al vencimiento del certificado o al administrador de confianza que no puede establecer una cadena de confianza con ninguno de los certificados en su tienda de confianza.

0

Puede verificar el certificado a través del navegador.

En Internet Explorer

Right Click >> Properties >> Certificates 

Una vez en la ventana de certificados se puede ver todo el árbol certificado también.

Si tiene un certificado no válido es posible que desee buscar una solución utilizando el comando keytool.

Keytool Commands

2

Si realmente realmente necesita, puede aceptar todos los certificados. Pero ten en cuenta que esto es realmente feo.

Eche un vistazo a this.

0

Creo que tiene que agregar el almacén de claves en jre1.6 cacert. A continuación, vuelva a implementar su servidor. De la manera que puede usar para agregar el programa keystorePORTECLE. es muy útil.

5

He pasado más de 12 horas sobre este tema. Después de crear un certificado autofirmado, se requiere exportar ese certificado al archivo cacert. En mi caso, estaba ubicado en /usr/lib/java/jre/lib/security/cacert. Puede exportar el certificado utilizando el keytool (que probablemente tiene que tener acceso a la raíz):

$ sudo keytool -exportcert -alias keyStoreAlias -keystore \ 
     keyStoreKeys.keys -file /usr/local/java/jre/lib/security/cacerts 
2

primero habría que ver si el certificado en cuestión ha caducado. Me he encontrado con esto muchas veces cuando trabajo con proveedores. Pueden actualizar sus certs sin avisarnos.

4

El problema que estás teniendo es con los certificados. Aquí hay una lista de cosas con las que debería estar familiarizado antes de trabajar con un programa SSL seguro. Debe haber un almacén de confianza, un almacén de claves y los certificados deben ser agregados. Para agregar la clave a su archivo de cacerts, como en el paso 6, la computadora podría pedirle una contraseña que no conoce.Es mostt "changeit" probable

1) Para crear un nuevo almacén de claves y el certificado autofirmado con sus correspondientes claves públicas/privadas:

keytool -genkeypair -alias "username" -keyalg RSA -validity 7 -keystore keystore 

2) para examinar el almacén de claves:

keytool -list -v -keystore keystore 

3) exportación y examinar el certificado autofirmado:

keytool -export -alias "username" -keystore keystore -rfc -file "username".cer 

4) Importar el certificado en un nuevo almacén de confianza:

keytool -import -alias "username" -file "username".cer -keystore truststore 

5) Examine el almacén de confianza:

keytool -list -v -keystore truststore 

6) Añadir al almacén de claves (esto es lo que buscas):

sudo keytool -import -file "username".cer -alias "username" -keystore "path-to-keystore" 

En algunos sistemas esto se encuentra en

/usr/lib/jvm/<java version folder>/jre/lib/security/cacerts 

y en otros sistemas es algo así como

/etc/ssl/certs/java/cacerts 

Comprobar a cabo este proyecto en Git-Hub si necesita más aclaraciones: https://github.com/rabbitfighter81/JSSLInfoCollectionServer Y aquí es un script de shell que ayuda con llaves. https://github.com/rabbitfighter81/SSLKeytool

0

Este 'certificate_unknown' es un mensaje de error muy engañoso. Este es el mismo mensaje de error lanzado cuando un certificado ha expirado incluso si está en el almacén de confianza. Sugiero verificar la fecha de vencimiento del certificado antes de perder el tiempo en otra cosa.

Cuestiones relacionadas