keycloak-service
クラス | 公開メンバ関数 | 限定公開メンバ関数 | 変数 | 非公開メンバ関数 | 静的非公開メンバ関数 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.authentication.authenticators.x509.CertificateValidator クラス
org.keycloak.authentication.authenticators.x509.CertificateValidator 連携図
Collaboration graph

クラス

class  BouncyCastleOCSPChecker
 
class  CertificateValidatorBuilder
 
class  CRLFileLoader
 
class  CRLLoaderImpl
 
class  CRLLoaderProxy
 
enum  KeyUsageBits
 
class  LdapContext
 
class  OCSPChecker
 

公開メンバ関数

 CertificateValidator ()
 
CertificateValidator validateKeyUsage () throws GeneralSecurityException
 
CertificateValidator validateExtendedKeyUsage () throws GeneralSecurityException
 
CertificateValidator checkRevocationStatus () throws GeneralSecurityException
 

限定公開メンバ関数

 CertificateValidator (X509Certificate[] certChain, int keyUsageBits, List< String > extendedKeyUsage, boolean cRLCheckingEnabled, boolean cRLDPCheckingEnabled, CRLLoaderImpl crlLoader, boolean oCSPCheckingEnabled, OCSPChecker ocspChecker)
 

変数

X509Certificate [] _certChain
 
int _keyUsageBits
 
List< String > _extendedKeyUsage
 
boolean _crlCheckingEnabled
 
boolean _crldpEnabled
 
CRLLoaderImpl _crlLoader
 
boolean _ocspEnabled
 
OCSPChecker ocspChecker
 

非公開メンバ関数

void checkRevocationUsingOCSP (X509Certificate[] certs) throws GeneralSecurityException
 

静的非公開メンバ関数

static void validateKeyUsage (X509Certificate[] certs, int expected) throws GeneralSecurityException
 
static void validateExtendedKeyUsage (X509Certificate[] certs, List< String > expectedEKU) throws GeneralSecurityException
 
static void checkRevocationStatusUsingCRL (X509Certificate[] certs, CRLLoaderImpl crLoader) throws GeneralSecurityException
 
static List< String > getCRLDistributionPoints (X509Certificate cert)
 
static void checkRevocationStatusUsingCRLDistributionPoints (X509Certificate[] certs) throws GeneralSecurityException
 

静的非公開変数類

static final ServicesLogger logger = ServicesLogger.LOGGER
 

詳解

著者
Peter Nalyvayko
バージョン
Revision
1
日付
7/30/2016

構築子と解体子

◆ CertificateValidator() [1/2]

org.keycloak.authentication.authenticators.x509.CertificateValidator.CertificateValidator ( )
inline
333  {
334 
335  }

◆ CertificateValidator() [2/2]

org.keycloak.authentication.authenticators.x509.CertificateValidator.CertificateValidator ( X509Certificate []  certChain,
int  keyUsageBits,
List< String >  extendedKeyUsage,
boolean  cRLCheckingEnabled,
boolean  cRLDPCheckingEnabled,
CRLLoaderImpl  crlLoader,
boolean  oCSPCheckingEnabled,
OCSPChecker  ocspChecker 
)
inlineprotected
342  {
343  _certChain = certChain;
344  _keyUsageBits = keyUsageBits;
345  _extendedKeyUsage = extendedKeyUsage;
346  _crlCheckingEnabled = cRLCheckingEnabled;
347  _crldpEnabled = cRLDPCheckingEnabled;
348  _crlLoader = crlLoader;
349  _ocspEnabled = oCSPCheckingEnabled;
350  this.ocspChecker = ocspChecker;
351 
352  if (ocspChecker == null)
353  throw new IllegalArgumentException("ocspChecker");
354  }
CRLLoaderImpl _crlLoader
Definition: CertificateValidator.java:329
X509Certificate [] _certChain
Definition: CertificateValidator.java:324
OCSPChecker ocspChecker
Definition: CertificateValidator.java:331
boolean _ocspEnabled
Definition: CertificateValidator.java:330
boolean _crlCheckingEnabled
Definition: CertificateValidator.java:327
boolean _crldpEnabled
Definition: CertificateValidator.java:328
int _keyUsageBits
Definition: CertificateValidator.java:325
List< String > _extendedKeyUsage
Definition: CertificateValidator.java:326

関数詳解

◆ checkRevocationStatus()

CertificateValidator org.keycloak.authentication.authenticators.x509.CertificateValidator.checkRevocationStatus ( ) throws GeneralSecurityException
inline
500  {
501  if (!(_crlCheckingEnabled || _ocspEnabled)) {
502  return this;
503  }
504  if (_crlCheckingEnabled) {
505  if (!_crldpEnabled) {
507  } else {
509  }
510  }
511  if (_ocspEnabled) {
513  }
514  return this;
515  }
static void checkRevocationStatusUsingCRL(X509Certificate[] certs, CRLLoaderImpl crLoader)
Definition: CertificateValidator.java:466
CRLLoaderImpl _crlLoader
Definition: CertificateValidator.java:329
X509Certificate [] _certChain
Definition: CertificateValidator.java:324
void checkRevocationUsingOCSP(X509Certificate[] certs)
Definition: CertificateValidator.java:431
static void checkRevocationStatusUsingCRLDistributionPoints(X509Certificate[] certs)
Definition: CertificateValidator.java:488
boolean _ocspEnabled
Definition: CertificateValidator.java:330
boolean _crlCheckingEnabled
Definition: CertificateValidator.java:327
boolean _crldpEnabled
Definition: CertificateValidator.java:328

◆ checkRevocationStatusUsingCRL()

static void org.keycloak.authentication.authenticators.x509.CertificateValidator.checkRevocationStatusUsingCRL ( X509Certificate []  certs,
CRLLoaderImpl  crLoader 
) throws GeneralSecurityException
inlinestaticprivate
466  {
467  Collection<X509CRL> crlColl = crLoader.getX509CRLs();
468  if (crlColl != null && crlColl.size() > 0) {
469  for (X509CRL it : crlColl) {
470  if (it.isRevoked(certs[0])) {
471  String message = String.format("Certificate has been revoked, certificate's subject: %s", certs[0].getSubjectDN().getName());
472  logger.debug(message);
473  throw new GeneralSecurityException(message);
474  }
475  }
476  }
477  }
static final ServicesLogger logger
Definition: CertificateValidator.java:63

◆ checkRevocationStatusUsingCRLDistributionPoints()

static void org.keycloak.authentication.authenticators.x509.CertificateValidator.checkRevocationStatusUsingCRLDistributionPoints ( X509Certificate []  certs) throws GeneralSecurityException
inlinestaticprivate
488  {
489 
490  List<String> distributionPoints = getCRLDistributionPoints(certs[0]);
491  if (distributionPoints == null || distributionPoints.size() == 0) {
492  throw new GeneralSecurityException("Could not find any CRL distribution points in the certificate, unable to check the certificate revocation status using CRL/DP.");
493  }
494  for (String dp : distributionPoints) {
495  logger.tracef("CRL Distribution point: \"%s\"", dp);
496  checkRevocationStatusUsingCRL(certs, new CRLFileLoader(dp));
497  }
498  }
static void checkRevocationStatusUsingCRL(X509Certificate[] certs, CRLLoaderImpl crLoader)
Definition: CertificateValidator.java:466
static List< String > getCRLDistributionPoints(X509Certificate cert)
Definition: CertificateValidator.java:478
static final ServicesLogger logger
Definition: CertificateValidator.java:63

◆ checkRevocationUsingOCSP()

void org.keycloak.authentication.authenticators.x509.CertificateValidator.checkRevocationUsingOCSP ( X509Certificate []  certs) throws GeneralSecurityException
inlineprivate
431  {
432 
433  if (certs.length < 2) {
434  // OCSP requires a responder certificate to verify OCSP
435  // signed response.
436  String message = "OCSP requires a responder certificate. OCSP cannot be used to verify the revocation status of self-signed certificates.";
437  throw new GeneralSecurityException(message);
438  }
439 
440  for (X509Certificate cert : certs) {
441  logger.debugf("Certificate: %s", cert.getSubjectDN().getName());
442  }
443 
444  OCSPUtils.OCSPRevocationStatus rs = ocspChecker.check(certs[0], certs[1]);
445 
446  if (rs == null) {
447  throw new GeneralSecurityException("Unable to check client revocation status using OCSP");
448  }
449 
450  if (rs.getRevocationStatus() == OCSPUtils.RevocationStatus.UNKNOWN) {
451  throw new GeneralSecurityException("Unable to determine certificate's revocation status.");
452  }
453  else if (rs.getRevocationStatus() == OCSPUtils.RevocationStatus.REVOKED) {
454 
455  StringBuilder sb = new StringBuilder();
456  sb.append("Certificate's been revoked.");
457  sb.append("\n");
458  sb.append(rs.getRevocationReason().toString());
459  sb.append("\n");
460  sb.append(String.format("Revoked on: %s",rs.getRevocationTime().toString()));
461 
462  throw new GeneralSecurityException(sb.toString());
463  }
464  }
static final ServicesLogger logger
Definition: CertificateValidator.java:63
OCSPChecker ocspChecker
Definition: CertificateValidator.java:331
abstract OCSPUtils.OCSPRevocationStatus check(X509Certificate cert, X509Certificate issuerCertificate)

◆ getCRLDistributionPoints()

static List<String> org.keycloak.authentication.authenticators.x509.CertificateValidator.getCRLDistributionPoints ( X509Certificate  cert)
inlinestaticprivate
478  {
479  try {
480  return CRLUtils.getCRLDistributionPoints(cert);
481  }
482  catch(IOException e) {
483  logger.error(e.getMessage());
484  }
485  return new ArrayList<>();
486  }
static final ServicesLogger logger
Definition: CertificateValidator.java:63

◆ validateExtendedKeyUsage() [1/2]

static void org.keycloak.authentication.authenticators.x509.CertificateValidator.validateExtendedKeyUsage ( X509Certificate []  certs,
List< String >  expectedEKU 
) throws GeneralSecurityException
inlinestaticprivate
392  {
393  if (expectedEKU == null || expectedEKU.size() == 0) {
394  logger.debug("Extended Key Usage validation is not enabled.");
395  return;
396  }
397  List<String> extendedKeyUsage = certs[0].getExtendedKeyUsage();
398  if (extendedKeyUsage == null) {
399  String message = "Extended key usage extension is expected, but unavailable";
400  throw new GeneralSecurityException(message);
401  }
402 
403  boolean isCritical = false;
404  Set critSet = certs[0].getCriticalExtensionOIDs();
405  if (critSet != null) {
406  isCritical = critSet.contains("2.5.29.37");
407  }
408 
409  List<String> ekuList = new LinkedList<>();
410  extendedKeyUsage.forEach(s -> ekuList.add(s.toLowerCase()));
411 
412  for (String eku : expectedEKU) {
413  if (!ekuList.contains(eku.toLowerCase())) {
414  String message = String.format("Extended Key Usage \'%s\' is missing.", eku);
415  if (isCritical) {
416  throw new GeneralSecurityException(message);
417  }
418  logger.warn(message);
419  }
420  }
421  }
static final ServicesLogger logger
Definition: CertificateValidator.java:63

◆ validateExtendedKeyUsage() [2/2]

CertificateValidator org.keycloak.authentication.authenticators.x509.CertificateValidator.validateExtendedKeyUsage ( ) throws GeneralSecurityException
inline
427  {
429  return this;
430  }
X509Certificate [] _certChain
Definition: CertificateValidator.java:324
CertificateValidator validateExtendedKeyUsage()
Definition: CertificateValidator.java:427
List< String > _extendedKeyUsage
Definition: CertificateValidator.java:326

◆ validateKeyUsage() [1/2]

static void org.keycloak.authentication.authenticators.x509.CertificateValidator.validateKeyUsage ( X509Certificate []  certs,
int  expected 
) throws GeneralSecurityException
inlinestaticprivate
356  {
357  boolean[] keyUsageBits = certs[0].getKeyUsage();
358  if (keyUsageBits == null) {
359  if (expected != 0) {
360  String message = "Key usage extension is expected, but unavailable.";
361  throw new GeneralSecurityException(message);
362  }
363  return;
364  }
365 
366  boolean isCritical = false;
367  Set critSet = certs[0].getCriticalExtensionOIDs();
368  if (critSet != null) {
369  isCritical = critSet.contains("2.5.29.15");
370  }
371 
372  int n = expected;
373 
374  StringBuilder sb = new StringBuilder();
375  for (int i = 0; i < keyUsageBits.length; i++, n >>= 1) {
376  boolean value = keyUsageBits[i];
377  if ((n & 1) == 1 && !value) {
378  String message = String.format("Key Usage bit \'%s\' is not set.", CertificateValidator.KeyUsageBits.fromValue(i).getName());
379  if (sb.length() > 0) sb.append("\n");
380  sb.append(message);
381 
382  logger.warn(message);
383  }
384  }
385  if (sb.length() > 0) {
386  if (isCritical) {
387  throw new GeneralSecurityException(sb.toString());
388  }
389  }
390  }
CertificateValidator()
Definition: CertificateValidator.java:333
static final ServicesLogger logger
Definition: CertificateValidator.java:63

◆ validateKeyUsage() [2/2]

CertificateValidator org.keycloak.authentication.authenticators.x509.CertificateValidator.validateKeyUsage ( ) throws GeneralSecurityException
inline
423  {
425  return this;
426  }
X509Certificate [] _certChain
Definition: CertificateValidator.java:324
CertificateValidator validateKeyUsage()
Definition: CertificateValidator.java:423
int _keyUsageBits
Definition: CertificateValidator.java:325

メンバ詳解

◆ _certChain

X509Certificate [] org.keycloak.authentication.authenticators.x509.CertificateValidator._certChain
package

◆ _crlCheckingEnabled

boolean org.keycloak.authentication.authenticators.x509.CertificateValidator._crlCheckingEnabled
package

◆ _crldpEnabled

boolean org.keycloak.authentication.authenticators.x509.CertificateValidator._crldpEnabled
package

◆ _crlLoader

CRLLoaderImpl org.keycloak.authentication.authenticators.x509.CertificateValidator._crlLoader
package

◆ _extendedKeyUsage

List<String> org.keycloak.authentication.authenticators.x509.CertificateValidator._extendedKeyUsage
package

◆ _keyUsageBits

int org.keycloak.authentication.authenticators.x509.CertificateValidator._keyUsageBits
package

◆ _ocspEnabled

boolean org.keycloak.authentication.authenticators.x509.CertificateValidator._ocspEnabled
package

◆ logger

final ServicesLogger org.keycloak.authentication.authenticators.x509.CertificateValidator.logger = ServicesLogger.LOGGER
staticprivate

◆ ocspChecker

OCSPChecker org.keycloak.authentication.authenticators.x509.CertificateValidator.ocspChecker
package

このクラス詳解は次のファイルから抽出されました: