2017-09-26 103 views
0

我試圖實現一個自定義X509TrustManager,它告訴用戶有關證書,並使他們能夠繼續使用服務器,儘管存在問題。我如何獲得可能只有葉證書的證書鏈?

我已經將幾乎所有東西都集中在一起,並開始對badssl.com上的各種證書進行測試。

當我在Safari瀏覽expired.badssl.com,我看到證書:

* COMODO RSA Certification Authority 
    * COMODO RSA Domain Validation Secure Server CA 
     * *.badssl.com 

我的應用程序獲取完整的鏈條。

當我訪問wrong.host.badssl.com,不過,Safari瀏覽器仍顯示了三個證書,但我的應用程序只看到二:

* DigiCert Global Root CA (Not in the array passed to the method!) 
    * DigiCert SHA2 Secure Server CA 
     * *.badssl.com 

我以爲我可以從「DigiCert SHA2安全服務器CA」使用「發行人」的名字證書以某種方式查找根證書,但是其中我能找到它嗎?

回答

3

應在本地信任庫中找到用於驗證服務器鏈(或通常任何接收鏈)的根證書。這正是默認的TrustManager所做的 - 它在本地信任庫中查找,或者更確切地說它實例化一個CertPathValidator,通常默認爲PKIXValidator,它查找信任庫(一個包含證書條目的KeyStore),通常從默認的本地文件初始化JRE/lib/security/cacerts,然後執行該驗證器,該驗證器通過使用主題名稱使用HashMap從所述信任庫查找根來進行驗證。

儘管簡單地陳述了這一點,但是in RFC 5246 for TLS 1.2(對於1.1和2346,對於1.0,從4346沒有變化)。

如果你仔細觀察,你會發現案例實際上並沒有你想象的那麼不同。

wrong.host.badssl.com提供由以下組成的證書鏈:
* https://crt.sh/?id=205900989葉* .badssl.com由DigiCert SHA2 SecServerCA發出
* https://crt.sh/?id=1262388中間由DigiCert GlobalRootCA發出
其中使用根https://crt.sh/?id=853428與SHA1指紋A8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436你將在大多數情況下,如果不是所有常見的信任庫(包括Java)(至少Oracle/Sun Java,OpenJDK可能因構建方式而異),都可以找到。請注意,對於*.badssl.com有效的此證書由於證書通配符名稱匹配只有一個(最左邊的)DNS標籤不多於(這將需要兩個)而不適用於wrong.host.badssl.com

expired.badssl.com供應證書鏈由以下組成:* .badssl.com由COMODO RSADomainValCA發出
* https://crt.sh/?id=7176112
* https://crt.sh/?id=3509153中間由COMODO RSACertAuth發出
* https://crt.sh/?id=1044348橋發出2000(直到2020年)由AddTrust ExternalRoot
,它使用帶有SHA1指紋02FAF3E291435468607857694DF5E45B68851868的AddTrust根https://crt.sh/?id=1。但是,COMODO RSA現在擁有自己的根目錄https://crt.sh/?id=1720081,其日期爲2010年(直到2038年),SHA1指紋AFE5D244A8D1194230FF479FE2F897BBCD7A8CB4得到了相當廣泛的認可 - 包括Oracle Java開始8u51。 (AddTrust External可以更進一步,至少6u07這是我可以輕鬆查看的最老的)。我敢打賭,如果你看起來你會發現Safari 替換爲 COMODO RSA的橋接證書, COMODO RSA)根;任何relier被允許做這種快捷方式,我的(近乎當前的)Firefox,IE和Chrome/Windows都可以做這種情況。 (後兩種份額Windows的信任; Firefox使用Mozilla的)。

(PS爲checklisters:我使用SHA1指紋,因爲他們更容易切割&糊狀,但仍不夠好 - SHA1碰撞已經發現了一些數據,而不是完全證書這是更難,因爲該簽名相關的,反正只有第二原像實際上是一個問題,據我所知沒有人上作出了任何進展都沒有。)


問題在您的標題中,'僅給出葉證書',因爲上面提到的RFC而不應該出現在TLS中。但是,如果是這樣,這幾乎是OpenSSL generate certificate chain的重複,並且適用相同的邏輯:遵循CAIssuers或(在運氣上)CT日誌中的鏈 - 就像我爲上述操作一樣!

+1

即使在這種情況下,我也不確定它是否會是該問題的重複,因爲該問題是關於如何在openssl中執行的,而這個問題是關於如何在java中執行它,它沒有方便的訪問打開。 – Trejkaz

+0

@Trejkaz:公平點;合格 –