2014-07-22 144 views
2

我想向瀏覽器的最高加密級別爲SSLv3的客戶顯示一條消息。我可以針對SSLv3及更低版本的瀏覽器設置嗎?客戶端或服務器代碼?我們將允許較低版本的SSL在特定的寬限期內使用我們的網站。在此寬限期內,我們只想向瀏覽器設置爲SSL3或更低版本的用戶顯示一條消息。我可以檢測瀏覽器支持的SSL版本嗎?

回答

0

不容易。瀏覽器支持的SSL版本在SSL握手進行之前是不可檢測的,即使這樣,只有當瀏覽器使用SSLv2握手來允許動態版本協商時也是如此。如果檢測到不支持的版本,您將無法發回消息,因爲握手失敗,並且在發送任何消息之前連接將被關閉。但是,SSL本身有一個在握手期間發送的錯誤數據包,它可以指定版本不匹配錯誤。

您可以在自己的代碼中執行的最佳操作是支持服務器端的所有SSL版本,讓客戶端正常完成握手,然後檢測實際使用的版本,並在SSL版本過後發送消息低。

或者,您可以只啓用TLSv1或更高版本,並且根本拒絕讓舊客戶端連接。除非瀏覽器決定檢測SSL版本不匹配錯誤並顯示它自己的相關消息,否則他們不會收到錯誤消息。

+0

謝謝雷米,讓我澄清。我們將在寬限期內允許較低的SSL版本,在此期間,我們希望顯示一條消息,指明在某個日期,我們將不再支持其SSL版本,並且他們需要升級其瀏覽器。用當然更用戶友好的語言。因此,在第二段中提到檢測使用哪個版本。你知道一種方法來做到這一點,無論是服務器端還是客戶端代碼? – Matt

-2

我不得不同意雷米關於它有點具有挑戰性。

但是,一個好的起點可能是檢索一些SSL(證書)信息。

東西類似:

X509Certificate certChain[] = 
(X509Certificate[]) req.getAttribute("javax.net.ssl.peer_certificates"); 

獲得更多信息的另一種方式是檢索cipher_suite屬性(類似於代碼段以上)。

javax.net.ssl.cipher_suite 

我希望這個(至少)讓你更接近。

祝你好運。

+2

瀏覽器是否提供客戶端證書(通常情況下不會)與其支持的SSL版本無關。 – Bruno

0

首先,現在,您通常可以忽略不支持SSLv3的客戶端。 SSLv3已經有很多年了。

TLS Client Hello消息,當連接是由瀏覽器發起的發送,應該包含它支持的最高TLS版本:

client_version 
     The version of the TLS protocol by which the client wishes to 
     communicate during this session. This SHOULD be the latest 
     (highest valued) version supported by the client. For this 
     version of the specification, the version will be 3.3 (see 
     Appendix E for details about backward compatibility). 

Appendix E當然是值得考慮的。

(該Client Hello消息還將包含密碼套件的客戶端支持,這是你的問題的總體思路可能相關的列表。)

當然,這個規範只是一個「應該」,所以支持TLS 1.2的客戶仍然可以發送TLS 1.1的Client Hello,但是重要的是什麼?這樣做無論如何都不可能使用TLS 1.2。它可能是一個偏好框,關閉,但這將有效地使它成爲一個不支持最高版本的客戶端。(如果你想要更微妙的東西,你需要建立一個已知用戶代理的數據庫,這個數據庫部分是不可靠的,你需要分析完整的用戶代理字符串以瞭解平臺的所有可能的信息。)

現在,如何傳達Client Hello消息到你的應用程序的內容又是另一回事,而且在很大程度上取決於其SSL/TLS堆棧使用。如果不修改SSL/TLS庫或您正在使用的服務器,甚至可能無法直接進行。

這就是說,您通常可以很容易地在當前會話期間獲得協商的TLS版本。由於該版本是"lower of that suggested by the client in the client hello and the highest supported by the server"(即「min(max(client), max(server))」)。如果您的服務器支持SSLv3,TLS 1.0,TLS 1.1和TLS 1.2,並且由於最新版本是TLS 1.2,您在當前連接期間將獲得的最大值也將是客戶端當前支持的最大值。只要您的服務器支持最新版本,您應該能夠從任何實時連接中最好地瞭解客戶端支持的內容。

如果您位於Apache HTTP server's mod_ssl的後面,您應該可以從SSL_PROTOCOL環境變量中獲得該值。您還應該能夠從Java中獲得SSLSession的協議。 (如果您願意編寫更定製的服務,則可以將密碼套件等更多詳細信息更直接地傳遞給您的應用程序,例如this service from Qualys SSL Labs does,儘管我不確定它是要廣泛提供還是隻是一個測試服務。)