/// <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);
            }
        }
Exemplo n.º 2
0
 /// <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();
            }
        }
Exemplo n.º 4
0
 /// <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
     };
 }
Exemplo n.º 5
0
 /// <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
     };
 }