A algum tempo que atualizo e mantenho atualmente no MSDN um documento de como utilizar certificados digitais na autenticação de clientes (http://msdn.microsoft.com/pt-br/library/ee923720.aspx).
Porem, neste artigo abordamos a autenticação utilizando certificados emitidos pelo próprio cliente com uma CA seja no Windows 2003 ou no Windows 2008 (para as diferentes versões do Windows veja o link http://www.marcelosincic.com.br/blog/page/Artigos-e-Apostilas.aspx.
Recebo semanalmente perguntas e dúvidas sobre como utilizar o e-CNPJ e o e-CPF para fazer a autenticação e resolvi fazer este post em forma de FAQ das principais perguntas que recebo.
1. É necessário ter um certificado de autoridades públicas para autenticar e-CPF ou e-CNPJ?
Resposta: É necessário ter um certificado válido para instalar no seu IIS. Nos artigos acima a raiz certificadora (CA) não é válida na internet e a CRL muitas vezes está em um ambiente interno. Esta característica faz com que o browser não reconheça a CA ou não acesse a CRL e rejeite o certificado com a mensagem de erro devida. Como o browser não validou o certificado do servidor, ele não irá solicitar para o cliente o certificado dele.
2. Este certificado tem que ser emitido por uma certificadora vinculada ao ICP-Brasil (SERASA, CertiSign, CEF e outras) para autenticar e-CPF ou e-CNPJ?
Resposta: Teoricamente não, mas é preferencial. O problema de utilizar uma certificadora não vinculada a raiz do ICP-Brasil é que a autoridade não estará na lista de confiança, e mesmo podendo ser adicionada manualmente (veja questões abaixo) em alguns casos pode ocorrer a leitura parcial do certificado.
3. Eu tenho um e-CPF ou e-CNPJ e o meu servidor é certificado pela ICP-Brasil e mesmo assim não solicita o meu certificado. Porque?
Resposta: Você precisa montar a lista de autoridades certificadoras para que o certificado seja aceito e o motivo é que o ICP-Brasil não é um único emissor nem um único CA (veja questões abaixo). Para montar a lista de certificadoras aceitas verifique no documento do MSDN no inicio do post.
4. Alguns cartões ou tokens são aceitos e outros não, o que está acontecendo?
Resposta: O ICP-Brasil apresenta duas características que podem causar isso. A primeira é que a cadeia dos certificados é, por exemplo, “Autoridade Certificadora Brasileira –> Secretaria da Receita Federal (RFB) –> SERASA” e você irá precisar colocar o primeiro nível como “Autoridades Raiz Confiáveis” e as duas seguintes como “Autoridades Intermediarias Confiáveis” (veja como na continuação das perguntas).
O outro problema é que existem duas “Autoridade Certificadora Brasileira” que é o nome apenas e outras com “v1”. Ou seja, cartões e tokens emitidos antes de 2009 utilizam o certificado da primeira versão e os mais atuais da “v1” que é a mais recente. Portanto você precisará instalar os dois como raízes confiáveis.
5. Mesmo colocando os dois “Autoridade Certificadora Brasileira” na lista de confiáveis o token não aparece. Porque?
Resposta: Não é apenas a raiz que tem variações, mas também os certificados intermediários, que podem ser a “Secretaria da Fazenda”, “Receita Federal”, “SERAZA”, “CertiSign”, etc. Você precisa colocar estes como “Autoridades Intermediárias Certificadoras Confiáveis” (como encontrar todas elas veja perguntas abaixo).
6. Como incluo as raízes e intermediárias do ICP-Brasil no meu servidor?
Resposta: Abra o MMC e adicione o snap-in “Certificados” mas note que não “Usuário” e sim “Computador”. Não basta apenas dar duplo clique no arquivo “cer” para incluir, porque neste caso você estaria incluindo no usuário e não na máquina. Após incluir o snap-in clique com o botão direito nos locais e use a opção “Importar”. Veja na imagem abaixo onde deve ser incluído os certificados raízes “Autoridade Certificadora Brasileira” e os intermediários “Serasa”, “Certisign”, “RFB”, etc:
7. Onde encontro a lista com todos os certificadores e os certificados emitidos por eles?
Resposta: Utilize este endereço: http://www.iti.gov.br/twiki/bin/view/Certificacao/RepositoriodaACRaiz que contem as informações de todos os certificados existentes tanto as duas raízes quanto suas intermediárias. Note que indica quais os tipos de certificados e no caso do ICP-Brasil são A1 e A3.
8. No Internet Explorer e no Chrome funcionou logo na primeira vez e no Firefox não, o que acontece?
Resposta: O IE e o Chrome já possuem o ICP-Brasil na lista de autoridades, já o Firefox até hoje não implementou (http://br.mozdev.org/drupal/2008/07/icp-brasil-deve-ser-adicionado-ao-firefox) e é necessário fazer manualmente. No post da Mozilla ou no do ITI na pergunta anterior siga as instruções, lembrando que deve ser feito no cliente. Porem, note que o aplicativo do leitor do cartão normalmente tem a opção para fazer essa inclusão de forma automática.
9. Como leio os dados do certificado alem do “subjet” citado no artigo do MSDN?
Resposta: Utilizando o código abaixo é possivel ler os dados em uma aplicação Windows Form, basta converter o “Request.Certificate” que consta no artigo para o tipo X509Certificate2:
System.Security.Cryptography.X509Certificates.X509Store Lista =
new System.Security.Cryptography.X509Certificates.X509Store();
Lista.Open(System.Security.Cryptography.X509Certificates.OpenFlags.IncludeArchived);
for (int Contador = 0; Contador < Lista.Certificates.Count; Contador++)
{
System.Security.Cryptography.X509Certificates.X509Certificate2 Certificado = Lista.Certificates[Contador];
MessageBox.Show(Certificado.ToString());
string Dados = Certificado.Subject;
listBox1.Items.Add(Dados);
if (Dados.IndexOf("e-CPF") > 0 || Dados.IndexOf("e-CNPJ") > 0)
{
Dados = Dados.Remove(0, Dados.IndexOf(":") + 1);
Dados = Dados.Remove(Dados.IndexOf("OU=") - 2);
listBox1.Items.Add("e-CPF/e-CNPJ = " + Dados);
}
}
Espero ter respondido as principais perguntas, e caso surjam novas vou atualizando este post.