示例#1
0
        private static X509Certificate2Collection BaseCollectCertificates(TBuscaCertificado tipoBusca)
        {
            if (tipoBusca != TBuscaCertificado.Nome_ContaUsuario && tipoBusca != TBuscaCertificado.Nome_MaquinaLocal &&
                tipoBusca != TBuscaCertificado.Serial_ContaUsuario && tipoBusca != TBuscaCertificado.Serial_MaquinaLocal)
            {
                throw new ArgumentException("Tipo de Busca inválida. Permitido somente Busca por Nome ou Serial (Conta Usuário ou Maquina Local).");
            }

            var StLocation = StoreLocation.CurrentUser;

            if (tipoBusca == TBuscaCertificado.Nome_MaquinaLocal || tipoBusca == TBuscaCertificado.Serial_MaquinaLocal)
            {
                StLocation = StoreLocation.LocalMachine;
            }

            X509Store store = new X509Store("MY", StLocation);

            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
            X509Certificate2Collection collection  = (X509Certificate2Collection)store.Certificates;
            X509Certificate2Collection collection1 = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, true);
            X509Certificate2Collection collection2 = (X509Certificate2Collection)collection1.Find(X509FindType.FindByKeyUsage, X509KeyUsageFlags.DigitalSignature, true);

            store.Close();

            return(collection2);
        }
示例#2
0
        public static X509Certificate2 Carregar(string valorPesquisa, TBuscaCertificado tipoBusca)
        {
            X509Certificate2 _X509Cert = null;

            try
            {
                if (tipoBusca == TBuscaCertificado.ArquivoDisco)
                {
                    var args    = valorPesquisa.Split('|');
                    var caminho = args[0];
                    var senha   = args[1];

                    if (string.IsNullOrEmpty(caminho))
                    {
                        throw new Exception("Caminho não informado;");
                    }

                    if (string.IsNullOrEmpty(senha))
                    {
                        throw new Exception("senha não informada;");
                    }

                    if (!System.IO.File.Exists(caminho))
                    {
                        throw new Exception("Arquivo informado não existe.");
                    }

                    _X509Cert = new X509Certificate2(caminho, senha, X509KeyStorageFlags.MachineKeySet);
                }
                else if (tipoBusca == TBuscaCertificado.Raw)
                {
                    var args  = valorPesquisa.Split('|');
                    var stRaw = args[0];
                    var pass  = args[1];

                    var raw = Convert.FromBase64String(stRaw);

                    _X509Cert = new X509Certificate2(raw, pass, X509KeyStorageFlags.MachineKeySet);
                }
                else if (tipoBusca == TBuscaCertificado.Nome_ContaUsuario || tipoBusca == TBuscaCertificado.Nome_MaquinaLocal ||
                         tipoBusca == TBuscaCertificado.Serial_ContaUsuario || tipoBusca == TBuscaCertificado.Serial_MaquinaLocal)
                {
                    X509Certificate2Collection collection2 = BaseCollectCertificates(tipoBusca);
                    X509Certificate2Collection scollection = null;

                    if (string.IsNullOrEmpty(valorPesquisa))
                    {
                        scollection = X509Certificate2UI.SelectFromCollection(collection2, "Certificado(s) Digital(is) disponível(is)", "Selecione o Certificado Digital para uso no aplicativo", X509SelectionFlag.SingleSelection);
                    }
                    else
                    {
                        X509FindType findType;
                        if (tipoBusca == TBuscaCertificado.Nome_ContaUsuario || tipoBusca == TBuscaCertificado.Nome_MaquinaLocal)
                        {
                            findType = X509FindType.FindBySubjectDistinguishedName;
                        }
                        else if (tipoBusca == TBuscaCertificado.Serial_ContaUsuario || tipoBusca == TBuscaCertificado.Serial_MaquinaLocal)
                        {
                            findType = X509FindType.FindBySerialNumber;
                        }
                        else
                        {
                            throw new Exception("Tipo de Pesquisa de Certificado não foi implementada.");
                        }

                        scollection = (X509Certificate2Collection)collection2.Find(findType, valorPesquisa, false);
                    }

                    if (scollection.Count > 0)
                    {
                        _X509Cert = scollection[0];
                    }
                }
                else
                {
                    throw new Exception("Tipo de pesquisa não definido");
                }

                return(_X509Cert);
            }
            catch (System.Exception ex)
            {
                throw new Exception("Falha ao carregar certificado.", ex);
            }
        }