private CertificadoDigital(X509Certificate2 certificado, CertificadoDigitalOptions options)
        {
            Erro            = false;
            TipoCertificado = TipoCertificado.Invalido;
            try
            {
                RawCertDataString = certificado.GetRawCertDataString();
            }
            catch
            {
                Erro         = true;
                ErroMensagem = CertificadoException.GetErrorMessage(CertificadoException.CertificadoExceptionTipo.CertificadoInvalido);
                return;
            }

            if (options.ValidarCadeia && CadeiaInvalida(certificado, options))
            {
                return;
            }

            TipoCertificado = ObterTipo(certificado);
            switch (TipoCertificado)
            {
            case TipoCertificado.ECpf:
                PessoaFisica = ObterDadosPessoaFisica(certificado);
                break;

            case TipoCertificado.ECnpj:
                var(pessoaJuridica, pessoaFisica) = ObterDadosPessoaJuridica(certificado);
                PessoaJuridica = pessoaJuridica;
                PessoaFisica   = pessoaFisica;
                break;
            }
        }
        private bool CadeiaInvalida(X509Certificate2 certificado, CertificadoDigitalOptions options)
        {
            using var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);

            var raizesIcpBrasil = store.Certificates.Find(X509FindType.FindByIssuerName, RaizIcpBrasil, true);

            using (var chain = new X509Chain())
            {
                if (options.ValidarRevogacao)
                {
                    chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
                }
                else
                {
                    chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
                }

                if (chain.Build(certificado))
                {
                    CadeiaValida = true;
                }
                else if (chain.ChainStatus.Any(x => x.Status == X509ChainStatusFlags.NotTimeValid) && options.ValidarRevogacao)
                {
                    ErroMensagem = CertificadoException.GetErrorMessage(CertificadoException.CertificadoExceptionTipo
                                                                        .CertificadoExpirado);
                    Erro = true;
                    return(true);
                }
                else if (
                    (options.ValidarRaizConfiavel && chain.ChainStatus.Any(x => x.Status != X509ChainStatusFlags.NotTimeValid)) ||
                    (!options.ValidarRaizConfiavel && chain.ChainStatus.Any(x =>
                                                                            x.Status != X509ChainStatusFlags.NotTimeValid &&
                                                                            x.Status != X509ChainStatusFlags.UntrustedRoot)))
                {
                    ErroMensagem = CertificadoException.GetErrorMessage(CertificadoException.CertificadoExceptionTipo
                                                                        .CadeiaInvalida);
                    Erro = true;
                    return(true);
                }

                var certificadoRaiz = chain.ChainElements[^ 1].Certificate;