2012-06-20 13 views
6

He perdido un par de días tratando de rastrear un error intermitente en el nuevo cifrado de transporte Akka.Netty SslHandler headache

NOTA: He experimentado con la configuración setIssueHandshake (verdadero) en uno o ambos servidores y los clientes, pero no ayuda en absoluto.

Nuestra especificación de cifrado prueba un par de cifras diferentes de diferentes suites, para garantizar que la configuración que admitimos realmente funciona. Sin embargo, las pruebas a veces pueden pasar 10 veces, y luego empezar a fallar todas las otras pruebas, es realmente SecureRandomly no ;-) Por favor, tenga en cuenta que la prueba falla incluso en SHA1PRNG por lo que es claramente no relacionados con los sistemas de cifrado adicionales que ofrecemos.

El código que crea el SslHandler: https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/main/scala/akka/remote/netty/NettySSLSupport.scala

El código que construye el gasoducto: https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala#L66

Las pruebas: https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/test/scala/akka/remote/Ticket1978CommunicationSpec.scala

La configuración de repliegue (por lo que no hace la prueba anterior anular): https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/main/resources/reference.conf

El almacén de claves & truststore para usar para la prueba: https://github.com/akka/akka/tree/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/test/resources

La excepción raíz que no pasa la prueba es:

**java.security.InvalidKeyException: No installed provider supports this key: (null)** 
    at javax.crypto.Cipher.a(DashoA13*..) 
    at javax.crypto.Cipher.init(DashoA13*..) 
    at javax.crypto.Cipher.init(DashoA13*..) 
    at com.sun.net.ssl.internal.ssl.CipherBox.<init>(CipherBox.java:88) 
    at com.sun.net.ssl.internal.ssl.CipherBox.newCipherBox(CipherBox.java:119) 
    at com.sun.net.ssl.internal.ssl.CipherSuite$BulkCipher.newCipher(CipherSuite.java:369) 
    at com.sun.net.ssl.internal.ssl.Handshaker.newReadCipher(Handshaker.java:410) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.changeReadCiphers(SSLEngineImpl.java:550) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1051) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:845) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:721) 
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:607) 
    at org.jboss.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:969) 
    at org.jboss.netty.handler.ssl.SslHandler.decode(SslHandler.java:670) 
    at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:333) 
    at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:214) 
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) 
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) 
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247) 
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 

Y el "lleno" uno es:

[ERROR] [06/20/2012 10:38:33.670] [remote-sys-4] [ActorSystem(remote-sys)] [email protected]://[email protected]:59104] Error[ 
javax.net.ssl.SSLException: Algorithm missing: 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.changeReadCiphers(SSLEngineImpl.java:554) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1051) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:845) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:721) 
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:607) 
    at org.jboss.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:969) 
    at org.jboss.netty.handler.ssl.SslHandler.decode(SslHandler.java:670) 
    at org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:333) 
    at org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:214) 
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) 
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) 
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373) 
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247) 
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.security.NoSuchAlgorithmException: Could not create cipher AES/128 
    at com.sun.net.ssl.internal.ssl.CipherBox.<init>(CipherBox.java:99) 
    at com.sun.net.ssl.internal.ssl.CipherBox.newCipherBox(CipherBox.java:119) 
    at com.sun.net.ssl.internal.ssl.CipherSuite$BulkCipher.newCipher(CipherSuite.java:369) 
    at com.sun.net.ssl.internal.ssl.Handshaker.newReadCipher(Handshaker.java:410) 
    at com.sun.net.ssl.internal.ssl.SSLEngineImpl.changeReadCiphers(SSLEngineImpl.java:550) 
    ... 17 more 
Caused by: java.security.InvalidKeyException: No installed provider supports this key: (null) 
    at javax.crypto.Cipher.a(DashoA13*..) 
    at javax.crypto.Cipher.init(DashoA13*..) 
    at javax.crypto.Cipher.init(DashoA13*..) 
    at com.sun.net.ssl.internal.ssl.CipherBox.<init>(CipherBox.java:88) 
    ... 21 more 
] 

Respuesta

2

mientras que no he visto exactamente esta excepción, es sin duda el caso de que a javax.crypto.Cipher no es seguro para subprocesos; Tengo una aplicación donde finalmente localicé un error que fue resuelto mediante la sincronización en el cifrado:

cipher synchronized { cipher doFinal encryptedBytes } 

Disculpas si esto no es la solución, pero publicado una gran cantidad de código! (Probablemente no es exactamente lo mismo que el seguimiento de la pila indica que el problema es incluso obtener una instancia Cipher, pero ¿podría esto también necesitar sincronización?)

+0

Gracias Chris, ahora estoy sospechando de SslHandler –

3

No es un error en Netty, hubo una desafortunada carrera de escritura entre la aplicación nivel de apretón de manos y el protocolo de enlace SSL. Vale la pena señalar que setIssueHandshake (true) no parece manejar de forma transparente el handshake, ya que necesita anular manualmente las escrituras hasta que se complete el handshake.

+0

Creo que esto se corrigió en Netty 3.5.0.Final ... ¿qué versión estás utilizando? –

+0

Esto fue 3.5.0.Final –

+0

¿Puedes por favor abrir un error para que podamos arreglarlo antes de 3.5.1Final? –

Cuestiones relacionadas