2012-06-20 2 views
6

Я потерял пару дней, пытаясь отследить прерывистую ошибку в недавно добавленном транспортном шифровании Akka.Головная боль Netty SslHandler

ПРИМЕЧАНИЕ. Я экспериментировал с установкой setIssueHandshake (true) на любом из серверов или клиентов, или на обоих, но это совсем не помогает.

Наша спецификация шифрования проверяет несколько разных шифров из разных комплектов, чтобы убедиться, что настройки, которые мы поддерживаем, действительно работают. Тем не менее, тесты иногда могут проходить 10 раз, а затем запускать сбой при каждом другом тесте, это действительно SecureRandomly failing ;-) Обратите внимание, что тест не работает даже на SHA1PRNG, поэтому он явно не связан с дополнительными шифрами, которые мы предоставляем.

код, который создает SslHandler: https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/main/scala/akka/remote/netty/NettySSLSupport.scala

код, который строит трубопровод: https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/main/scala/akka/remote/netty/NettyRemoteSupport.scala#L66

испытаний: https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/test/scala/akka/remote/Ticket1978CommunicationSpec.scala

падения возврата конфигурации (для того, что вышеописанное испытание не override): https://github.com/akka/akka/blob/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/main/resources/reference.conf

Хранилище & Truststore для использования в испытаниях: https://github.com/akka/akka/tree/wip-ssl-unbroken-%E2%88%9A/akka-remote/src/test/resources

Корневая исключение, которое не проходит тест является:

**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) 

И «полный» один:

[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 
] 

ответ

2

, пока я не видел, именно это исключение, это тот случай, когда a javax.crypto.Cipher не является потокобезопасным; У меня есть приложение, где я, наконец, выследил ошибку, которая была решена путем синхронизации на шифре:

cipher synchronized { cipher doFinal encryptedBytes } 

Извинение, если это не решение, но вы вывесили много кода! (Вероятно, это не совсем то же самое, что трассировка стека указывает на то, что проблема даже при получении экземпляра Cipher - но может ли это также потребоваться синхронизация?)

+0

Спасибо Крис, сейчас я подозреваю SslHandler –

3

Не ошибка в Netty, произошла неудачная запись между приложением -level рукопожатие и SSL-квитирование. Стоит отметить, что setIssueHandshake (true), похоже, не прозрачно обрабатывает рукопожатие, так как вам нужно вручную отменить записи до тех пор, пока не будет завершено рукопожатие.

+0

Я думаю, что это было исправлено в netty 3.5.0.Final .. какую версию вы используете? –

+0

Это было 3.5.0.Final –

+0

вы можете открыть ошибку, чтобы мы могли ее исправить до 3.5.1Final? –