2012-04-27 21 views
4

我有一個web服務可能綁定到ssl或純http。 Java客戶端配置爲了解服務器主機和端口。當客戶端連接時,我構建了服務器端點,如http://host:port/service。客戶端不知道服務器是否使用ssl - 服務器始終綁定到單個端口,以使其安全或不安全。現在,問題是如何讓客戶端在不引入其他參數的情況下發現這一點?我可以質疑純HTTP請求,然後回退到ssl(或反過來)在某個異常?或者我必須明確地爲客戶端引入新的連接參數?如何正常檢測SSL

回答

3

在服務器端,您可以使用像Grizzly's port unification實現的機制。這可以用於在同一端口上提供HTTP和HTTPS。這取決於這樣一個事實,即在這兩種情況下,客戶端都會首先進行對話併發送HTTP請求或SSL/TLS客戶端Hello消息。這在服務器端非常方便(儘管我不確定推薦在同一個端口上運行兩個協議)。

但從客戶的角度(這是你問什麼),那的後果是:

  • 事實上,客戶端先發言意味着它將總是首先嚐試。如果您嘗試將SSL/TLS轉換爲普通的HTTP服務,反之亦然,那麼預計會出現某種異常。
  • 如果服務器使用端口統一,那麼您將無法可靠地發現問題。

拋開端口統一(畢竟這是一種罕見的情況),您可以嘗試緩存過去嘗試的結果。

更爲重要的是,從安全角度考慮,不知道應該使用哪種協議,引入了一個漏洞:系統將開放到降級攻擊(以類似的方式爲blindly relying on automatic redirects會)。如果您的用戶代理支持HSTS,那麼值得研究一下(儘管它需要用戶代理記住哪些站點將與HTTPS一起使用)。

無論哪種方式,如果您關心安全性,您必須必須配置客戶端知道何時使用https://

+0

這看起來像我以後的事情。安全是一個問題,否則首先不會有SSL。但是,在這種特殊情況下,這不是什麼大問題,因爲我們需要的只是加密流量,認證不是問題。事實上,在這種情況下,客戶端實際上是一個服務器節點,它調用同一類型的另一個節點(這是羣集中的某種談話)。我只是需要一個很好的捷徑來避免引入一個新的參數。聽起來這樣做沒有可靠的方法,但我會玩弄港口統一thingy,聽起來很有趣,謝謝! – Dima 2012-04-27 10:25:42

+0

服務器的身份驗證(加密之前)始終是一個問題,除非您確定最多可以擁有無​​法根本改變流量的被動攻擊者(竊聽者)。 – Bruno 2012-04-27 10:42:31

+0

是的,就是這樣,竊聽者在我的情況下不是威脅 – Dima 2012-04-27 15:09:43