Espero utilizar el problema a continuación que encontramos recientemente para comprender mejor los proveedores de seguridad, cifrado y cifrado de Java en general.
Obtuvimos el siguiente error durante un protocolo de enlace SSL (usando InstallCert tool) desde un host Solaris 10, ejecutando Java 1.6.0_81 a uno de los dos hosts AD:
]$ java InstallCert host1.example.com:636
Loading KeyStore /usr/jdk/instances/jdk1.6.0/jre/lib/security/cacerts...
Opening connection to host1.example.com:636...
Starting SSL handshake...
javax.net.ssl.SSLException: java.lang.RuntimeException: Could not parse key values
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1747)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1708)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1691)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1222)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199)
at InstallCert.main(InstallCert.java:98)
Caused by: java.lang.RuntimeException: Could not parse key values
at sun.security.pkcs11.P11Key$P11ECPublicKey.fetchValues(P11Key.java:954)
at sun.security.pkcs11.P11Key$P11ECPublicKey.getW(P11Key.java:975)
at com.sun.net.ssl.internal.ssl.ECDHClientKeyExchange.<init>(ECDHClientKeyExchange.java:40)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:782)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:241)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:943)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215)
... 2 more
Caused by: java.io.IOException: extra data given to DerValue constructor
at sun.security.util.DerValue.init(DerValue.java:368)
at sun.security.util.DerValue.<init>(DerValue.java:277)
at sun.security.pkcs11.P11Key$P11ECPublicKey.fetchValues(P11Key.java:945)
... 11 more
El segundo host no da ningún error. La única diferencia que he podido adivinar aquí es el cifrado en host1.example.com
: es AES256-SHA; el cifrado en host2.example.com
es AES128-SHA.
]$ echo -n | openssl s_client -connect host1.example.com:636 | grep 'Cipher is'
New, TLSv1/SSLv3, Cipher is AES256-SHA
]$ echo -n | openssl s_client -connect host2.example.com:636 | grep 'Cipher is'
New, TLSv1/SSLv3, Cipher is AES128-SHA
Mis preguntas son:
- ¿Cuál es el propósito de los proveedores de seguridad de Java y cuál es su función en el cifrado?
- ¿De qué se trata el cifrado de AES256-SHA en
host1.example.com
que produce este error? -
Finalmente, comentamos este proveedor de seguridad en el archivo
java.security
para resolver el problema:security.provider.1=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/sunpkcs11-solaris.cfg
¿Parece que esta combinación de un proveedor con errores y Cipher estaba causando este problema? Ese enlace hace referencia a "EC", y no estoy seguro de qué es eso.
Cualquier punteros y puntos de vista muy apreciados!