2013-02-20 9 views
7

Prosta implementacja Netty serwera https z wykorzystaniem javax.net.ssl, z samopodpisanym certyfikatem. Serwer jest włączony, a następnie żądanie jest wykonywane przy użyciu DHC by Restlet. Po stronie serwera uzyskać:javax.net.ssl, klienci https i close_notify

io.netty.handler.ssl.SslHandler setHandshakeFailure UWAGA: SSLEngine.closeInbound() podnosi wyjątek ze względu na połączenie zamkniętym. javax.net.ssl.SSLException: Inbound zamknięty przed otrzymaniem peer's close_notify: możliwy atak skracania? na sun.security.ssl.Alerts.getSSLException (Unknown Source) w sun.security.ssl.SSLEngineImpl.fatal (Unknown Source) w sun.security.ssl.SSLEngineImpl.fatal (Unknown Source) na słońcu. security.ssl.SSLEngineImpl.closeInbound (Unknown Source) na io.netty.handler.ssl.SslHandler.setHandshakeFailure (SslHandler.java:905) na io.netty.handler.ssl.SslHandler.channelInactive (SslHandler.java:576) na io.netty.channel.DefaultChannelHandlerContext.invokeChannelInactive (DefaultChannelHandlerContext.java:819) na io.netty.channel.DefaultChannelHandlerContext.access 1300 dolarów (DefaultChannelHandlerContext.java:38) na io.netty.channel.DefaultChannelHandlerContext $ 5.Run (DefaultChannelHandlerContext.j Ava: 808) w io.netty.channel.SingleThreadEventExecutor.runAllTasks (SingleThreadEventExecutor.java:259) w io.netty.channel.nio.NioEventLoop.run (NioEventLoop.java:305) w io.netty.channel. SingleThreadEventExecutor $ 2.run (SingleThreadEventExecutor.java:110) na java.lang.Thread.run (Unknown Source)

A po stronie klienta:

Brak reakcji. Czy certyfikat jest ważny? Kliknij tutaj, aby sprawdzić.

Wydanie tego samego żądania na pasku adresu Chrome, ten sam wyjątek od strony serwera. Wydawanie tego samego na pasku adresu Firefoksa, ten sam wyjątek, podczas gdy Firefox wyświetla stronę z ostrzeżeniem o tym, że certyfikat nie pochodzi od zaufanego CA. Ten wyjątek wydaje się bardzo ogólny i nie wskazuje bezpośrednio, jaki jest stan protokołu:. Czy to oznacza, że ​​ci 3 klienci (Chrome, Firefox, DHC by Restlet) nie ładnie odtwarzają protokół i po prostu znikają na serwerze, zamiast wysyłać close_notify? czy jest to zachowanie po stronie klienta nakazane przez SSL RFC lub po prostu zorientowany na bezpieczeństwo projekt po stronie klienta?

+0

Wygląda na to, że wszyscy klienci, których próbowałem, pomijają wysyłanie close_notify. Być może jest to dobre dla klienta, aby natychmiast odszedł, ale pozostawiając serwerowi nieco zaintrygowany, co może być szczegółowym powodem ... – matanster

+0

Cześć Matt. Wykonuję żądanie https z Dev HTTP Client i mam tę samą sytuację po stronie klienta. Jak sobie z tym poradziłeś? –

+0

@AntonioAcevedo, wygląda na to, że zwykli klienci zachowują się w następujący sposób podczas łączenia się z niezaufanym certyfikatem - zamykają połączenie i monitują użytkownika. Więc cały serwer widzi, że klient znika na nich, ale klient nie powiadamia serwera o jego przyczynie. Ma to sens pod względem bezpieczeństwa z punktu widzenia klienta (najlepszym sposobem jest wydanie najmniejszej ilości informacji o problemie bezpieczeństwa drugiej stronie). Taka sytuacja nie wymaga "rozwiązania", a jedynie zaakceptowania go jako danego. – matanster

Odpowiedz

5

I skontaktowaliśmy się z DHC by Restlet zespole i oni powiedzieli mi obejście:

Chrome nie dostarcza API do zarządzania certyfikatami. Innymi słowy, nie mamy interfejsu API, który automatycznie akceptowałby Twój certyfikat, ani sposobu na podniesienie okna dialogowego "niezaufany certyfikat". Można jednak zastosować następujące obejście:

  1. Otwórz adres https w innej karcie.
  2. Ręcznie zaakceptuj certyfikat.
  3. Wróć do DHC i zadziała, ponieważ Twój certyfikat został zaakceptowany ręcznie (jest przechowywany w Chrome) w poprzednim kroku.

Zazwyczaj trzeba to zrobić tylko raz.

+0

Fajne rozwiązanie. Myślę, że może to pasować, ponieważ jest to "odpowiedź na własne pytanie", ponieważ pierwotne pytanie brzmiało, dlaczego i czy w rzeczywistości close_notify nie jest wysyłane przez popularnych klientów ... fajne obejście! miło, że mogłem pomóc! – matanster

1

I wobec tego problemu, kiedy instalacją otwartą wersję JDK java na maszynie linux, kiedy zmienił wersję Oracle Java JDK problem zniknął.

Dokładna aplikacja wyrzucił ten wyjątek jest Informacja warsztatowy (OPS płynne produkty) i wersję Java wynosiła 8 pomocą którego wersji Java nie mentiond w prerequists systemu płynem ops ludzi.