2012-05-15 48 views
3

我正在研究基於服務器和基於客戶端的應用程序,該應用程序需要雙向SSL身份驗證。 (客戶端使用SSL證書驗證服務器和服務器對客戶端進行身份驗證。)Netty中的雙向SSL身份驗證

我對Netty很陌生,對此幾乎沒有懷疑。

  1. 是使用Netty進行雙向認證的可能嗎?
  2. 通過向服務器和客戶端的pipelinefactories添加另一個SslHandler可以簡單地實現嗎?
  3. 如果以上情況屬實,我如何在ChannelConnected()方法中獲取所需的SslHandler來執行SslHandshake?是否有可能通過調用管道再次調用ChannelConected()方法來調用第二次握手?
  4. 我有什麼可以參考的例子嗎?

我真的很感謝任何關於這方面的幫助,答案或正確的方向。

謝謝先進。

回答

11

是否可以使用Netty進行雙向認證?

它可以簡單地通過增加另一個SslHandler到服務器和客戶端的pipelinefactories實現的?

如果以上是真的,我怎麼能搶要求SslHandler在ChannelConnected()方法做SslHandshake?

創建SSLContext時,您需要正確設置密鑰庫和信任庫。

是否有可能通過再次調用管道調用ChannelConected()方法的第二次握手?

從內存中,客戶端和服務器驗證在第一次握手中完成。

在客戶端上,將客戶端的私鑰安裝在密鑰庫中,並將服務器的公鑰放在信任庫中。

在服務器上,將服務器的私鑰安裝在密鑰庫中,並將客戶端的公鑰放在信任庫中。

我有什麼可以參考的例子嗎?

  • 下面是一個example我做的WebSockets。它僅向您顯示如何設置服務器密鑰庫。您將不得不添加信任庫作爲第二個參數serverContext.init(kmf.getKeyManagers(), null, null);

  • 以下是Scala中類似的example,其中包含信任存儲區設置。

  • 關於如何設置SSLContext,下面是一個很好的java guide

希望這會有所幫助。

+1

您沒有在scala示例中關閉信任庫的輸入流。另外,最好使用'Key/TrustManagerFactory.getDefaultAlgorithm()'而不是強制'SunX509',它不是TMF的默認JSSE,並且不適用於非Sun/Oracle的JRE(例如IBM)。 – Bruno

3

雙向身份驗證要求服務器和客戶端都有另一個信任的證書。客戶端需要生成一個私鑰,將其存儲在他的密鑰庫中,並由服務器的信任庫所信任的人簽名。

這不僅僅是你寫的代碼的問題。

1

SSL是一種表示層協議,SSL握手恰好在套接字連接建立之後並且應用層獲得可用的套接字連接之前發生。無論您使用什麼應用程序,如果您擁有SSL協議層,那麼您可以通過SSL進行工作。

雙向認證只是上面@EJP提到的配置問題。如果雙方都可以建立並驗證彼此的信任鏈,那麼握手成功。請參閱netty配置手冊以配置SSL信任庫。

+0

SSL握手不一定會在連接建立後立即發生,它可能發生在一些純文本通信後(例如,使用'STARTTLS'-like協議或HTTP代理'CONNECT')或重新協商後(通常爲如果在第一次握手中沒有請求,則獲得一個客戶端證書)。 – Bruno

+0

@布魯諾但是,不是SSL會話建立過程的純文本通信部分? – Drona

+0

實際上,握手真正開始之前通常是正常的應用協議(通過'Client Hello')。通常情況下,它發生在大部分應用程序請求/響應之後,但是原則上在更長時間的交換之後可能會發生。 – Bruno