Validação de certificados revogados (CRL)

View: New views
3 Messages — Rating Filter:   Alert me  

Validação de certificados revogados (CRL)

by Marcelo Gonzalez :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Pessoal,
 
Estou batendo cabeça aqui para descobrir uma maneira de validar um certificado digital contra a sua respectiva CRL.
 
Preciso obter este arquivo a partir da URL contida na extensão do certificado.
 
O que eu fiz até agora?
 
A partir de um objeto do tipo "X509Certificate", utilizo o método "getExtensionValue" passando como parâmetro p OID "2.5.29.31". (ex: certificado.getExtensionValue("2.5.29.31")).
 
Este método me retorna um array de bytes, segundo a documentação: "Gets the DER-encoded OCTET string for the extension value (extnValue) identified by the passed-in oid String.".
 
E agora? Qual a melhor maneira de acessar a URL indicada para obter a CRL? Alguma sugestão?
 
Obrigado,
 
Marcelo Gonzalez.
 
 

Re: Validação de certificados revogados (CRL)

by Renato Diogo :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

  public static Vector getCRLDistUrls(X509Certificate cert) {
    CRLDistPoint crlDistPoints = UtilAssinador.getCRLDistPoint(cert);
    AuthorityInformationAccess authInfoAcc = getAuthorityInformationAccess(cert);
    Vector urls = new Vector();
    if (crlDistPoints != null) {
      DistributionPoint[] distPoints = crlDistPoints.getDistributionPoints();
      for (int i = 0; i < distPoints.length; i++) {
        DistributionPointName dp_name = distPoints[i].getDistributionPoint();
        if (dp_name.getType() == DistributionPointName.FULL_NAME) {
          GeneralName[] generalNames = GeneralNames.getInstance(dp_name.getName()).getNames();
          for (int j = 0; j < generalNames.length; j++) {
            if (generalNames[j].getTagNo() == GeneralName.uniformResourceIdentifier) {
              String url = ((DERIA5String) generalNames[j].getName()).getString();
              urls.add(url);
            }
          }
        }
      }
    }
    return urls;
  }

  private static AuthorityInformationAccess getAuthorityInformationAccess(X509Certificate cert) {
    AuthorityInformationAccess authInfoAcc = null;
    try {
      DERObject auth_info_acc = getExtensionValue(cert, AUTH_INFO_ACCESS);
      if (auth_info_acc != null) {
        authInfoAcc = AuthorityInformationAccess.getInstance(auth_info_acc);
      }
    } catch (Exception e) {
      log.error(e);
    }
    return authInfoAcc;
  }

  private static DERObject getExtensionValue(java.security.cert.X509Extension ext, String oid) throws AnnotatedException {
    byte[] bytes = ext.getExtensionValue(oid);
    if (bytes == null) {
      return null;
    }
    return getObject(oid, bytes);
  }

  private static DERObject getObject(String oid, byte[] ext) {
    DERObject dERObject = null;
    try {
      ASN1InputStream aIn = new ASN1InputStream(ext);
      ASN1OctetString octs = (ASN1OctetString) aIn.readObject();
      aIn = new ASN1InputStream(octs.getOctets());
      dERObject = aIn.readObject();
    } catch (IOException e) {
      log.error(e);
    }
    return dERObject;
  }

2009/10/23 Marcelo Gonzalez <mfgonzalez@...>
Pessoal,
 
Estou batendo cabeça aqui para descobrir uma maneira de validar um certificado digital contra a sua respectiva CRL.
 
Preciso obter este arquivo a partir da URL contida na extensão do certificado.
 
O que eu fiz até agora?
 
A partir de um objeto do tipo "X509Certificate", utilizo o método "getExtensionValue" passando como parâmetro p OID "2.5.29.31". (ex: certificado.getExtensionValue("2.5.29.31")).
 
Este método me retorna um array de bytes, segundo a documentação: "Gets the DER-encoded OCTET string for the extension value (extnValue) identified by the passed-in oid String.".
 
E agora? Qual a melhor maneira de acessar a URL indicada para obter a CRL? Alguma sugestão?
 
Obrigado,
 
Marcelo Gonzalez.
 
 


Re: Validação de certificados revogados (CRL)

by Marcelo Gonzalez :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Obrigado pela resposta Renato!

Tu pode me enviar tb o que o teu método "UtilAssinador.getCRLDistPoint(cert)"?

Procurei referências sobre o boucy castle para validação de certificados revogado mas não encontrei muita coisa!

Depois de obter a lista de URLs, como tu conecta para obter a lista?

Obrigado!

Marcelo Gonzalez.



2009/10/23 Renato Diogo <renato.c.diogo@...>
  public static Vector getCRLDistUrls(X509Certificate cert) {
    CRLDistPoint crlDistPoints = UtilAssinador.getCRLDistPoint(cert);
    AuthorityInformationAccess authInfoAcc = getAuthorityInformationAccess(cert);
    Vector urls = new Vector();
    if (crlDistPoints != null) {
      DistributionPoint[] distPoints = crlDistPoints.getDistributionPoints();
      for (int i = 0; i < distPoints.length; i++) {
        DistributionPointName dp_name = distPoints[i].getDistributionPoint();
        if (dp_name.getType() == DistributionPointName.FULL_NAME) {
          GeneralName[] generalNames = GeneralNames.getInstance(dp_name.getName()).getNames();
          for (int j = 0; j < generalNames.length; j++) {
            if (generalNames[j].getTagNo() == GeneralName.uniformResourceIdentifier) {
              String url = ((DERIA5String) generalNames[j].getName()).getString();
              urls.add(url);
            }
          }
        }
      }
    }
    return urls;
  }

  private static AuthorityInformationAccess getAuthorityInformationAccess(X509Certificate cert) {
    AuthorityInformationAccess authInfoAcc = null;
    try {
      DERObject auth_info_acc = getExtensionValue(cert, AUTH_INFO_ACCESS);
      if (auth_info_acc != null) {
        authInfoAcc = AuthorityInformationAccess.getInstance(auth_info_acc);
      }
    } catch (Exception e) {
      log.error(e);
    }
    return authInfoAcc;
  }

  private static DERObject getExtensionValue(java.security.cert.X509Extension ext, String oid) throws AnnotatedException {
    byte[] bytes = ext.getExtensionValue(oid);
    if (bytes == null) {
      return null;
    }
    return getObject(oid, bytes);
  }

  private static DERObject getObject(String oid, byte[] ext) {
    DERObject dERObject = null;
    try {
      ASN1InputStream aIn = new ASN1InputStream(ext);
      ASN1OctetString octs = (ASN1OctetString) aIn.readObject();
      aIn = new ASN1InputStream(octs.getOctets());
      dERObject = aIn.readObject();
    } catch (IOException e) {
      log.error(e);
    }
    return dERObject;
  }

2009/10/23 Marcelo Gonzalez <mfgonzalez@...>

Pessoal,
 
Estou batendo cabeça aqui para descobrir uma maneira de validar um certificado digital contra a sua respectiva CRL.
 
Preciso obter este arquivo a partir da URL contida na extensão do certificado.
 
O que eu fiz até agora?
 
A partir de um objeto do tipo "X509Certificate", utilizo o método "getExtensionValue" passando como parâmetro p OID "2.5.29.31". (ex: certificado.getExtensionValue("2.5.29.31")).
 
Este método me retorna um array de bytes, segundo a documentação: "Gets the DER-encoded OCTET string for the extension value (extnValue) identified by the passed-in oid String.".
 
E agora? Qual a melhor maneira de acessar a URL indicada para obter a CRL? Alguma sugestão?
 
Obrigado,
 
Marcelo Gonzalez.