/// <summary> /// Obtém um objeto contendo o certificado digital /// <para> /// Se for informado <see cref="CertificadoConfig.Arquivo" />, /// o certificado digital será obtido pelo método <see cref="ObterDeArquivo(string,string)" />, /// senão será obtido pelo método <see cref="ListareObterDoRepositorio" /> /// </para> /// <para> /// Para liberar os recursos do certificado, após seu uso, invoque o método /// <see cref="X509Certificate2.Reset()" /> /// </para> /// </summary> public static X509Certificate2 ObterCertificado(CertificadoConfig configuracaoCertificado) { try { if (configuracaoCertificado == null) { throw new ArgumentNullException(nameof(configuracaoCertificado), "Informar o certificado digital"); } if (!configuracaoCertificado.ManterDadosEmCache) { return(ObterDadosCertificado(configuracaoCertificado)); } if (!string.IsNullOrEmpty(configuracaoCertificado.CacheId) && CacheCertificado.ContainsKey(configuracaoCertificado.CacheId)) { return(CacheCertificado[configuracaoCertificado.CacheId]); } var certificado = ObterDadosCertificado(configuracaoCertificado); var keyCertificado = string.IsNullOrEmpty(configuracaoCertificado.CacheId) ? certificado.SerialNumber : configuracaoCertificado.CacheId; configuracaoCertificado.CacheId = keyCertificado; CacheCertificado.Add(keyCertificado, certificado); return(CacheCertificado[keyCertificado]); } catch (Exception ex) { Utils.TraceException(ex); throw new FalhaCertificadoDigitalException("Falha ao listar certificados digitais", ex); } }
/// <summary> /// Configuração do certificado A3 (cartão) /// </summary> /// <param name="serial">Serial do certificado</param> /// <param name="signatureMethodSignedXML">Algoritmo de Assinatura</param> /// <param name="digestMethodReference">URI para DigestMethod na Classe Reference para auxiliar para a assinatura</param> public void ConfiguraCertificadoA3(string serial, string signatureMethodSignedXML = "http://www.w3.org/2000/09/xmldsig#rsa-sha1", string digestMethodReference = "http://www.w3.org/2000/09/xmldsig#sha1") { if (Certificado != null) { throw new FalhaValidacaoException("O certificado já foi configurado previamente"); } if (string.IsNullOrEmpty(serial)) { throw new FalhaCertificadoDigitalException("Serial não informado"); } Certificado = new CertificadoConfig { TipoCertificado = TipoCertificado.A3, Serial = serial, DigestMethodReference = digestMethodReference, SignatureMethodSignedXml = signatureMethodSignedXML }; }
/// <summary> /// Busca o certificado de acordo com o <see cref="TipoCertificado" /> /// </summary> /// <returns></returns> private static X509Certificate2 ObterDadosCertificado(CertificadoConfig configuracaoCertificado) { switch (configuracaoCertificado.TipoCertificado) { case TipoCertificado.A1Repositorio: return(ObterDoRepositorio(configuracaoCertificado.Serial, OpenFlags.MaxAllowed)); case TipoCertificado.A1ByteArray: return(ObterDoArrayBytes(configuracaoCertificado.ArrayBytesArquivo, configuracaoCertificado.Senha)); case TipoCertificado.A1Arquivo: return(ObterDeArquivo(configuracaoCertificado.Arquivo, configuracaoCertificado.Senha)); case TipoCertificado.A3: return(ObterDoRepositorioPassandoPin(configuracaoCertificado.Serial, configuracaoCertificado.Senha)); default: throw new ArgumentOutOfRangeException(); } }
/// <summary> /// Configuração do certificado A1 em forma de arquivo físico /// </summary> /// <param name="caminhoArquivo">Caminho do arquivo .pfx do certificado</param> /// <param name="signatureMethodSignedXML">Algoritmo de Assinatura</param> /// <param name="digestMethodReference">URI para DigestMethod na Classe Reference para auxiliar para a assinatura</param> public void ConfiguraCertificadoA1Arquivo(string caminhoArquivo, string signatureMethodSignedXML = "http://www.w3.org/2000/09/xmldsig#rsa-sha1", string digestMethodReference = "http://www.w3.org/2000/09/xmldsig#sha1") { if (Certificado != null) { throw new FalhaValidacaoException("O certificado já foi configurado previamente"); } if (!File.Exists(caminhoArquivo)) { throw new FalhaCertificadoDigitalException("O arquivo não foi encontrado no caminho informado"); } Certificado = new CertificadoConfig { TipoCertificado = TipoCertificado.A1Arquivo, Arquivo = caminhoArquivo, SignatureMethodSignedXml = signatureMethodSignedXML, DigestMethodReference = digestMethodReference }; }
/// <summary> /// Configuração do certificado A1 em forma de byte array /// </summary> /// <param name="byteArrayCertificado"></param> /// <param name="signatureMethodSignedXML">Algoritmo de Assinatura</param> /// <param name="digestMethodReference">URI para DigestMethod na Classe Reference para auxiliar para a assinatura</param> public void ConfiguraCertificadoA1ByteArray(byte[] byteArrayCertificado, string signatureMethodSignedXML = "http://www.w3.org/2000/09/xmldsig#rsa-sha1", string digestMethodReference = "http://www.w3.org/2000/09/xmldsig#sha1") { if (Certificado != null) { throw new FalhaValidacaoException("O certificado já foi configurado previamente"); } if (byteArrayCertificado == null) { throw new FalhaCertificadoDigitalException("Byte array inválido"); } if (byteArrayCertificado.Length <= 0) { throw new FalhaCertificadoDigitalException("Byte array inválido"); } Certificado = new CertificadoConfig { TipoCertificado = TipoCertificado.A1ByteArray, ArrayBytesArquivo = byteArrayCertificado, SignatureMethodSignedXml = signatureMethodSignedXML, DigestMethodReference = digestMethodReference }; }