Java >> Java tutoriál >  >> Java

Kontrola odvolání certifikátu Java SSL

Přišel jsem na to, jak povolit kontrolu CRL v rámci SSLContext bez implementace vlastního validátoru, jak je navrženo v komentářích.

Jde hlavně o správnou inicializaci TrustManagerů SSLContext pomocí kontroly odvolání, pouze pár řádků, žádná vlastní kontrolní logika a CRL je nyní kontrolováno automaticky stejně jako ověřovací cesta.

Zde je úryvek...

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);

To v podstatě udělalo to, co jsem ve své aplikaci potřeboval, zkontroloval, zda je certifikát vydaný klientovi v našem CRL odvolán. Přijímáme pouze kontrolu koncové entity a povolení kontroly CRL selhat, protože jde o veškerou naši infrastrukturu.


Je pro vás OCSP v pořádku?

níže uvedený kód mi umožňuje 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");

selhal na CRL kvůli chybám jako:Jak zkontrolovat stav odvolání řetězce certifikátů X509 pomocí JAVA?


Všimněte si, že zakázání kontroly odvolání je špatný bezpečnostní postup. Můžete to udělat, ale ujistěte se, že znáte riziko!

Aktuálně akceptovaná odpověď @DoNuT funguje nastavením PKIXRevocationChecker.Option.SOFT_FAIL , což způsobí, že validátor nevyvolá výjimku, i když selže kontrola odvolání. Následující odpověď zcela zakáže kontrolu odvolání, takže je rychlejší v případě, že ověření vůbec nechcete. Je to proto, že provádění kontrol odvolání vyžaduje kontaktování distribučních míst CRL nebo serverů OCSP, a pokud to nechcete, nemusíte platit cenu.

Můžete jednoduše použít setRevocationEnabled(false) na objekt typu 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);

Java Tag