簡體   English   中英

Java SSL 證書吊銷檢查

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM