[英]Java SSL Certificate Revocation Checking
我目前正在使用 SSL 編寫網絡 TCP 服務器。 在生產中,我們最終會要求客戶端使用證書進行身份驗證。
為了在緊急情況下撤銷證書,我們還想建立一個 CRL。
我的問題是:Java 是否開箱即用地檢查 CRL(如果提供了證書),或者我是否需要手動實施此類檢查?
為了進行測試,我准備了一個帶有 CRL 集的證書,但 Java 似乎沒有嘗試對其進行驗證(我將其放入本地 Web 服務器並且無法訪問)。
我只找到了com.sun.net.ssl.checkRevocation=true VM 選項,但顯然它沒有查詢 CRL。 VM 調試設置為java.security.debug=certpath也不會生成任何輸出...
Java 的子系統中似乎有相關的類(例如java.security.cert.X509CRLSelector ),但顯然它並沒有發揮作用。
編輯:刪除過時的 Dropbox 鏈接
我想出了如何在 SSLContext 中啟用 CRL 檢查而不實現自定義驗證器,如評論中所建議的。
它主要是關於使用吊銷檢查器正確初始化 SSLContext 的 TrustManagers,只有幾行,沒有自定義檢查邏輯,現在自動檢查 CRL 以及驗證路徑。
這是一個片段...
KeyStore ts = KeyStore.getInstance("JKS");
FileInputStream tfis = new FileInputStream(trustStorePath);
ts.load(tfis, trustStorePass.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
// initialize certification path checking for the offered certificates and revocation checks against CLRs
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker();
rc.setOptions(EnumSet.of(
PKIXRevocationChecker.Option.PREFER_CRLS, // prefer CLR over OCSP
PKIXRevocationChecker.Option.ONLY_END_ENTITY,
PKIXRevocationChecker.Option.NO_FALLBACK)); // don't fall back to OCSP checking
PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(ts, new X509CertSelector());
pkixParams.addCertPathChecker(rc);
tmf.init( new CertPathTrustManagerParameters(pkixParams) );
// init KeyManagerFactory
kmf.init(...)
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers), tmf.getTrustManagers(), null);
這基本上完成了我在應用程序中的需要,檢查頒發給客戶的證書是否在我們的 CRL 中被撤銷。 只接受檢查終端實體並允許 CRL 檢查失敗,因為它是我們所有的基礎設施。
OCSP 適合您嗎?
下面的代碼為我啟用了 OCSP:
// for debugging:
System.setProperty("javax.net.debug", "all");
System.setProperty("java.security.debug", "all");
System.setProperty("com.sun.net.ssl.checkRevocation", "true");
Security.setProperty("ocsp.enable", "true");
CRL 因以下錯誤而失敗: 如何使用 JAVA 檢查 X509Certificate 鏈的吊銷狀態?
請注意,禁用吊銷檢查是一種糟糕的安全做法。 你可以做到,但要確保你知道風險!
@DoNuT當前接受的答案通過設置PKIXRevocationChecker.Option.SOFT_FAIL
,這會導致驗證器即使吊銷檢查失敗也不會拋出異常。 以下答案完全禁用吊銷檢查,因此如果您根本不需要驗證,它會更快。 這是因為執行吊銷檢查需要聯系 CRL 分發點或 OCSP 服務器,如果您不想這樣做,則無需為此付出代價。
你可以簡單地使用setRevocationEnabled(false)
類型的對象上PKIXBuilderParameters
。
// Initialize "anchors" to trusted certificates
// Initialize "selector" to the certificate you want to validate
PKIXBuilderParameters pbParams = new PKIXBuilderParameters(anchors, selector);
pbParams.setRevocationEnabled(false); // disable revocation check
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
CertPathBuilderResult cpbResult = cpb.build(pbParams);
CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
CertPathValidatorResult result = cpv.validate(cpbResult.getCertPath(), pbParams);
System.out.println(result);
首先,您可以在 jcontrol(從 1.8 開始)中配置的撤銷檢查僅適用於小程序和WebStart下載以及簽名者證書檢查! 對於已編程的 https 客戶端,您可以使用上面提到的 PKIXRevocationChecker,但根據我的經驗,Oracle 實現根本不支持 LDAP CDP 下載。 當我遇到這個問題時,我需要在我的自定義 TrustManager 的 checkXXXX 函數后面使用 CRL 和立即從 LDAP 下載 CA 證書來實現完整的證書鏈檢查......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.