Spero di utilizzare il problema riportato di seguito che ci siamo imbattuti recentemente per comprendere meglio i provider di sicurezza, i codici e la crittografia di Java in generale.
Abbiamo ricevuto il seguente errore durante un handshake SSL (utilizzando InstallCert strumento) da un host Solaris 10, che esegue Java 1.6.0_81 in uno dei due host 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
Il secondo host non fornisce errori. L'unica differenza che sono riuscito a spigolare qui è la cifra su host1.example.com
- è AES256-SHA; il cipher su host2.example.com
è 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
Le mie domande sono:
- Qual è lo scopo dei provider di sicurezza Java e qual è il loro ruolo nella crittografia?
- Di cosa si tratta della cifra di AES256-SHA su
host1.example.com
che produce questo errore? -
Alla fine abbiamo commentato questo fornitore di sicurezza in
java.security
file per risolvere il problema:security.provider.1=sun.security.pkcs11.SunPKCS11 ${java.home}/lib/security/sunpkcs11-solaris.cfg
Quindi sembra che questa combinazione di un provider bug e di Cipher abbia causato questo problema? Quel collegamento fa riferimento a "EC" e non sono sicuro di cosa sia.
Qualche suggerimento e approfondimento molto apprezzato!