none
Erro tentando pegar certificado X509 do cliente RRS feed

  • Pergunta

  • Estou fazendo uma aplicacao web c# e uma funcionalidade é pegar os certificados do cliente para fazer login. Esse código quando roda local acha todos os certificados sem problemas, porém quando coloco no IIS eu não consigo encontrar os certificados do cliente.

    Perguntas:
    - O código está abrindo a store local e não a do cliente? Se sim, como abrir a do cliente?
    - O IIS precisa de certificado de servidor para algo simples como isso?
    Qualquer outro tópico ou ajuda é muito bem vinda!

    String s = HttpContext.Current.Request.ClientCertificate.Issuer;
                return;
               
                //da permissão para efetuar qq operacao no windows certificates store
                StorePermission sp = new StorePermission(StorePermissionFlags.AllFlags);
    
                //carrega todos certificados pessoais, para o usuario logado
                X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    
                //abre o store
                store.Open(OpenFlags.ReadWrite);
             
       //para cada certificado existente
    
                foreach (X509Certificate2 certificado in store.Certificates)
                    if (certificado.FriendlyName.Contains("o que eu procuro"))
                        break;//algum codigo q eu faco com isso
    
                store.Close();

    quarta-feira, 25 de novembro de 2009 13:34

Todas as Respostas

  • Quando você diz que roda local, quer dizer uma aplicação Windows Forms ou Console, certo? O código que você postou abriria o repositório de certificados da máquina onde o código está sendo executado, ou seja, da máquina que hospeda sua aplicação (se é que isso é possível).
    Para que o navegador solicite o certificado do cliente e este seja selecionado da máquina do cliente, você terá que, no IIS, selecionar a sua aplicação e em "Propriedades", "Segurança de Diretório", selecionar a opção "Aceitar certificados do cliente" ou "Exigir certificados do cliente".
    Se você pretende obrigar o usuário a selecionar o certificado dele, deverá marcar a opção de Exigir certificado, mas para isso terá que exigir SSL na aplicação, sendo para isso obrigado a instalar um certificado no site da Web Padrão (no IIS).

    Após esta configuração, quando o usuário acessar o site, será solicitado o certificado dele. Após confirmação, você poderá acessá-lo com HttpContext.Current.Request.ClientCertificate
    quarta-feira, 2 de dezembro de 2009 12:55
  • Olá, estou com o mesmo problema! Tentei ajustar as configurações no IIS e ainda não consigo localizar os certificados do Client. o Códi que eu utilizo é o seguinte:

                   X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
                   

                    store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
                    X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
                    X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid, DateTime.Now, true);

                    ////X509Certificate2 x509 = this.GetCertificateBySubject("Fabio Luis Correa Arruda");
                   
                    List<BE_Informacoes_Certificados> listaRetorno = new List<BE_Informacoes_Certificados>();

                    foreach (X509Certificate2 x509 in fcollection)
                    {
                        byte[] rawdata = x509.RawData;

                        BE_Informacoes_Certificados objInfo_Certificado = new BE_Informacoes_Certificados();

                        objInfo_Certificado.Nome = this.ExtractString(x509.Subject, "CN=", ",", true); //x509.FriendlyName;
                        objInfo_Certificado.Ac_certificadora = x509.GetNameInfo(X509NameType.SimpleName, true);

                        /*Buscar Dados do Certificado*/
                        string sExtensionsValues = string.Empty;
                        X509ExtensionCollection _extensions = x509.Extensions;
                        foreach (X509Extension extension in _extensions)
                        {

    (....)



    Poderia me ajudar?
    terça-feira, 8 de dezembro de 2009 10:49
  • Consegui resolver o problema. era mais simples do que estava pensando.
    sexta-feira, 5 de fevereiro de 2010 18:12
  • Fabio, nao consigo resolver esse problema teria como voce postar a solução que voce arrumou ai.

    Grato.
    sexta-feira, 26 de fevereiro de 2010 16:38
  • Olá Fábio, também estou com o mesmo problema aqui, se puder postar como foi resolvido ficarei muito grato.
    sexta-feira, 23 de abril de 2010 14:47
  • Olá Fabio, por favor, poderia me ajudar em como foi a sua solução?

    Estou há muito tempo já em busca disso.

    terça-feira, 18 de janeiro de 2011 12:11
  • Depois de tanto tempo procurando, descobri que você sabe a resposta para meu problema, poderia dizer qual foi a solução que encontrou?

    Obrigado

    quarta-feira, 6 de julho de 2011 19:45
  • Olá Fábio,

    Também estou a um bom tempo procurando uma solução para este problema, voc~e poderia compartilhar conosco.

    Desde já agradeço,

    terça-feira, 19 de julho de 2011 20:28
  • Alguém conseguiu resolver este problema?
    quarta-feira, 20 de julho de 2011 13:41
  • Após várias pesquisas, acabei chegando neste tópico de como carregar certificados no IIS, consegui resolver exportando o certificado para pfx e carregar o mesmo não mão conforme exemplo abaixo.

    using (var signatureCert = new X509Certificate2(dados.ArquivoCertificado, dados.SenhaCertificado, X509KeyStorageFlags.Exportable))
                    {
                        var pk = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(signatureCert.PrivateKey).Private;
                        IExternalSignature es = new PrivateKeySignature(pk, "SHA-256");
                        var chain = this.GetChain(signatureCert);
                        using (PdfReader reader = new PdfReader(dados.Arquivo))
                        {
                            using (PdfStamper stamper = PdfStamper.CreateSignature(reader, new FileStream(retorno.ArquivoFisico, FileMode.Create), '\0'))
                            {
                                PdfSignatureAppearance sap = stamper.SignatureAppearance;
                                sap.SetVisibleSignature(dados.CampoID);
    
                                MakeSignature.SignDetached(sap, es, chain, null, null, null, 0, CryptoStandard.CMS);
    
                                stamper.Close();
                            }
                            reader.Close();
                        }
                    }


    Gilson Joanelo - Desenvolvedor Web

    quarta-feira, 17 de março de 2021 20:00