8

訪問令牌終點時,我們運行一個JVM後端的Web應用程序(Java 7的更新75;代碼是Scala,但我不認爲這是相關的)。我們使用Google通過Oauth進行身份驗證。谷歌身份驗證錯誤從JVM

在過去的幾個月裏,我們一直有一些時間間歇性地無法驗證用戶身份。

來自Google的重定向成功,但是當我們嘗試撥打token_endpoint來驗證身份驗證時,我們有時會得到以下例外:javax.net.ssl.SSLHandshakeException: server certificate change is restrictedduring renegotiation

對另一個問題的評論讓我發現了一個JDK bug,它可以表現爲這個異常(What means "javax.net.ssl.SSLHandshakeException: server certificate change is restrictedduring renegotiation" and how to prevent it?)。

我的工作假設是:

的錯誤(https://bugs.openjdk.java.net/browse/JDK-8072385)表示,只有在主題備用名稱(SAN)列表中的第一項檢查。當被驗證的主機名在SAN列表中,但不在列表頂部時,會引發上述異常。

昨天(2015年5月27日從),我們看到了兩個不同的證書被間歇性地從www.googleapis.com服務。第一個(系列67:1a:d6:10:cd:1a:06:cc)的SAN列表爲DNS:*.googleapis.com, DNS:*.clients6.google.com, DNS:*.cloudendpointsapis.com, DNS:cloudendpointsapis.com, DNS:googleapis.com,而第二個(系列61:db:c8:52:b4:77:cf:78)的SAN列表爲:DNS:*.storage.googleapis.com, DNS:*.commondatastorage.googleapis.com, DNS:*.googleapis.com

由於JVM中存在缺陷,我們可以驗證第一個證書,但第二個(儘管完全有效)拋出異常,因爲*.googleapis.com不是SAN列表中的第一個條目。

解決方法是在尚未公佈7u85(沒有提及的時候,這將是可用)。

我已將羣集的單個節點降級到7u65,但證書似乎在我們這樣做的時候恢復(我們看到的最後一個錯誤是22:20GMT),因此很難確定是否有肯定的修復。

是否有其他人遇到過此類或類似的問題,並且除降級外還有其他解決方法(降級會刪除各種其他SSL/TLS檢查)?

回答

2

我不確定你的問題與JVM的bug有關。

有Java 6中的修復和上述用於CVE-2014-6457, 「對TLS/SSL連接三重握手攻擊(JSSE,8037066)」,防止了對等證書重新協商期間改變。

問題的解釋:

在傳輸層 安全(TLS)協議(包括舊的安全套接字層 (SSLv3)和)的所有版本中的一個安全漏洞可以允許人在這方面的中間人(MITM)類型的攻擊,其中選定的 純文本作爲TLS連接的前綴注入。這個 漏洞不允許攻擊者解密或修改被攔截的網絡通信,一旦客戶端和服務器在他們之間成功協商了會話。

但是,如果有可能改變證書是一樣身份作爲最後看到證書,則允許連接。

兩個身份被認爲在這種情況下等於:

  • 有一個在兩個證書是一個IP地址和在兩個證書的IP地址是相同的指定的對象的替代名稱。
  • 在兩個證書中都指定了一個主題替代名稱,這是DNS名稱,兩個證書中的DNS名稱都是相同的。
  • 主題和發行者字段出現在兩個證書中,幷包含相同的主題和發行者值。

在其他情況下(證書的身份已更改),會引發javax.net.ssl.SSLHandshakeException: server certificate change is restricted during renegotiation異常。

解決方法:

  • 禁用重新談判(不推薦)應用以下JVM參數:-Djdk.tls.allowUnsafeServerCertChange=true它禁用不安全的服務器證書保護。
  • 禁用的SSLv3在傳出HTTPS連接爪哇7支持TLSv1.1和TLSv1.2工作在客戶機模式,但默認爲TLS握手使用的TLSv1。我們應該在java 7中的客戶端模式TLS中使用TLSv1.1和TLSv1.2。 Java 8在客戶端模式(除SSLv3和TLSv1之外)中啓用TLSv1.1和TLSv1.2,並在TLS握手中默認使用TLSv1.2。如果您以編程方式創建連接並設置套接字工廠,請使用TLS而不是SSL。

無論如何,請在調用token_endpoint驗證身份驗證以查看可能發生的情況之前,使用您的google oauth客戶端代碼更新您的帖子。