Certificado A3..

539 views
Skip to first unread message

Diego Mosela

unread,
Sep 13, 2010, 1:24:22 PM9/13/10
to NFePHP

Pessoal,

Como será que a secretária da fazendo fez para acessar o certificado A3 no site do e-cac..


Quando entramos em Acesso via Certificado Digital, se temos um Token ou Smart Card instalado na maquina ele consegue
detectar e fazer o login utilizando tal certificado....

Pergunta: Como será que eles fizeram?

Abraços

Att.:
Diego Mosela
www.empresarialsistemas.com.br

Roberto Leite Machado

unread,
Sep 13, 2010, 1:44:03 PM9/13/10
to nfe...@googlegroups.com
Via browser .... funciona no mozilla ! tem comantarios sobre isso na nossa lista ...

Roberto



2010/9/13 Diego Mosela <diego....@gmail.com>

Diego Mosela

unread,
Sep 13, 2010, 1:51:09 PM9/13/10
to nfe...@googlegroups.com
Roberto,

Funciona no IE, Mozilla e no Chrome.. foi nos que testei.

Se tem comentário na lista não sei pois não achei quando procurei, procurei na net também e não achei nada
pelo que pude observar na url que ele chama é utilizado uma dll na qual também não encontrei nada na net...

Agora não sei como eles fizeram... basta procurar mais informações

Att.:
Diego Mosela
www.empresarialsistemas.com.br

Roberto Leite Machado

unread,
Sep 13, 2010, 2:26:24 PM9/13/10
to nfe...@googlegroups.com

Diego Mosela

unread,
Sep 13, 2010, 2:43:11 PM9/13/10
to nfe...@googlegroups.com
Roberto,

Ah você se referencio sobre o assunto do Applet esse eu já vi rss.

Mas engraçado neste site do governo, não abre nenhum applet na tela, quando seleciono o tipo de login (Certificado Digital) quando
a tela é carregada já foi feito o acesso ao certificado, unica coisa que ele faz é me pedir para selecionar qual o certificado que eu 
desejo utilizar quando tenho mais de um. E uma coisa que reparei, é que se o certificado não estiver instalado nos browser ele não é lido.

Portando acredito que não seja um applet rodando, e sim alguma rotina que acessa o browser e busca os certificados, sem falar que a maquina virtual do applet não é levantada.

Vou tentar ver se acho alguma coisa na net sobre isso.

Abraços e obrigado

Att.:
Diego Mosela

On Line Sistemas

unread,
Sep 13, 2010, 5:05:44 PM9/13/10
to nfe...@googlegroups.com
Olá Mosela,
 
      Tenho interesse também. Mesmo se tiver que comprar algum  "drivers" , tenho interesse.
      Se souber de algo, favor dar um 'toque'.
 
      Att
 
      Walber Sales
 
--

Walker de Alencar

unread,
Sep 21, 2010, 1:41:20 PM9/21/10
to nfe...@googlegroups.com
Pessoal, até tenho um token e talz.

kd o código aberto para trabalharmos nele?
--
Walker de Alencar
Arquiteto de Sistemas PHP
http://www.walkeralencar.com
(61) 8172-8999 | (62) 8172-5487
ZCE: ZEND014591

Clemilson Pena

unread,
Sep 21, 2010, 2:14:03 PM9/21/10
to nfe...@googlegroups.com
Eu tambem quero.


Clemilson Pena
Desenvolvedor ERP e Web
www.chr13.net
8502-3594

Walker de Alencar

unread,
Sep 21, 2010, 3:08:26 PM9/21/10
to nfe...@googlegroups.com
nas discussões do forum tem o código fonte, vou checar uma forma de disponibilizar os arquivos no projeto.

já estou abrindo com netbeans, para fazer verificações.

Bernardo Höhl

unread,
Sep 21, 2010, 7:41:24 PM9/21/10
to nfe...@googlegroups.com
Amigos,


Vocês já deram uma olhada no www.opensc.org??

Atenciosamente,

Bernardo Hõhl

Reinaldo Borges

unread,
Sep 30, 2010, 6:23:40 PM9/30/10
to nfe...@googlegroups.com
É possível configurar o servidor web para exigir autenticação com certificado emitido por uma AC específica.
No nosso caso, usamos a ICP Brasil. Feito isso, basta que o token esteja corretamente instalado (ou leitora de
cartão) para que A3 seja aceito.

No PHP é possível verificar se foi autenticado com sucesso (mas sem diferenciar, a princípio, A1 de A3).
Também é possível recuperar os dados do certificado usado para a autenticação (CPF ou CNPJ, nome, email).

Se precisar assinar alguma solicitação mais crítica, veja esse post meu em outro fórum:
http://groups.google.com.br/group/gophp/browse_thread/thread/d8ac7a250785da10/ec6ed5a63868b581


Exemplo do configuração do APACHE:

O site precisa ter um certificado SSL instalado (conexão https).
Veja essa dica:
http://www.vivaolinux.com.br/dica/Ativando-SSL-no-Apache-2/

O ideal é configurar um diretório do seu site pra solicitar o certificado.
Exemplo: o diretório principal funciona com o https, mas sem solicitar o certificado.
Mas se entrar no diretório "/certificado" é então solicitado.

Para solicitar um certificado você precisa informar ao Apache de qual AC (autoridade
certificadora) você aceitará os certificados.
Não precisa ser da mesma AC que emitiu o certificado SSL do site.

Depois que você conseguir fazer o apache usar o SSL (https) é que deve tentar
solicitar o certificado. Não tente exigir certificado antes disso, senão você vai
acabar se perdendo nas mensagens de erro.

Para informar ao apache qual AC é válida:
SSLCACertificateFile "/private/etc/apache2/certs/icp.crt"
/private/etc/apache2/certs/icp.crt é o caminho completo para o certificado da AC

Para solicitar o certificado do cliente, coloque isso na configuração do Apache:
SSLVerifyClient require
SSLVerifyDepth  4

E para passar os dados do certificado ao PHP, coloque isso na configuração do Apache:
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>

Para testar isso, crie um script PHP:

<pre>
<?php
    $certBase64 = $_SERVER['SSL_CLIENT_CERT'];
   
    $cert = openssl_x509_read( $certBase64 );
    $certArray = openssl_x509_parse($cert,true);
    echo "Cliente autenticado...........: ",$_SERVER['SSL_CLIENT_VERIFY'],"\n";
    echo "Número de série do certificado: 0x",$_SERVER['SSL_CLIENT_M_SERIAL'],"\n";
    echo "Versão do certificado.........: ",$_SERVER['SSL_CLIENT_M_VERSION'],"\n";
    echo "Identificação do emissor......: ",$_SERVER['SSL_CLIENT_I_DN'],"\n";
    echo "Nome..........................: ",$_SERVER['SSL_CLIENT_I_DN_CN'],"\n";
    echo "Empresa.......................: ",$_SERVER['SSL_CLIENT_I_DN_O'],"\n";
   
    echo "\n";
   
    echo "Identificação do cliente......: ",$_SERVER['SSL_CLIENT_S_DN'],"\n";
    echo "Nome..........................: ",$_SERVER['SSL_CLIENT_S_DN_CN'],"\n";
    echo "E-Mail........................: ",$_SERVER['SSL_CLIENT_S_DN_Email'],"\n";
    echo "Validade......................: ",$_SERVER['SSL_CLIENT_V_START'],' / ',$_SERVER['SSL_CLIENT_V_END'],"\n";
   
    echo "\n";
   
    echo "Protocolo SSL.................: ",$_SERVER['SSL_PROTOCOL'],"\n";
    echo "Codificação...................: ",$_SERVER['SSL_CIPHER'],' - Usando ',$_SERVER['SSL_CIPHER_USEKEYSIZE'],' bits',"\n";
   
    echo '<hr>';
   
    print_r($certArray);
?>
</pre>


[]'s

Reinaldo Borges


Proteja o endereço de seus amigos como estou protegendo o seu.
Ao enviar mensagens para mais de um endereço use SEMPRE o
"Cco" (cópia oculta) ou "Bcc" (Blind carbon copy).


2010/9/13 Diego Mosela <diego....@gmail.com>
--

dodi

unread,
Oct 8, 2010, 5:23:07 PM10/8/10
to NFePHP
Dessa forma citada pelo Reinaldo, é possível termos acesso à chave
privada?

On 30 set, 19:23, Reinaldo Borges <em...@reinaldoborges.com> wrote:
> É possível configurar o servidor web para exigir autenticação com
> certificado emitido por uma AC específica.
> No nosso caso, usamos a ICP Brasil. Feito isso, basta que o token esteja
> corretamente instalado (ou leitora de
> cartão) para que A3 seja aceito.
>
> No PHP é possível verificar se foi autenticado com sucesso (mas sem
> diferenciar, a princípio, A1 de A3).
> Também é possível recuperar os dados do certificado usado para a
> autenticação (CPF ou CNPJ, nome, email).
>
> Se precisar assinar alguma solicitação mais crítica, veja esse post meu em
> outro fórum:http://groups.google.com.br/group/gophp/browse_thread/thread/d8ac7a25...
>
> Exemplo do configuração do APACHE:
>
> O site precisa ter um certificado SSL instalado (conexão https).
> Veja essa dica:http://www.vivaolinux.com.br/dica/Ativando-SSL-no-Apache-2/
>
> O ideal é configurar um diretório do seu site pra solicitar o certificado.
> Exemplo: o diretório principal funciona com o https, mas sem solicitar o
> certificado.
> Mas se entrar no diretório "/certificado" é então solicitado.
>
> Para solicitar um certificado você precisa informar ao Apache de qual AC
> (autoridade
> certificadora) você aceitará os certificados.
> Não precisa ser da mesma AC que emitiu o certificado SSL do site.
>
> Depois que você conseguir fazer o apache usar o SSL (https) é que deve
> tentar
> solicitar o certificado. Não tente exigir certificado antes disso, senão
> você vai
> acabar se perdendo nas mensagens de erro.
>
> Para informar ao apache qual AC é válida:
> SSLCACertificateFile "/private/etc/apache2/certs/icp.crt"
> */private/etc/apache2/certs/icp.crt* é o caminho completo para o certificado
> 2010/9/13 Diego Mosela <diego.cai...@gmail.com>
>
>
>
> > Pessoal,
>
> > Como será que a secretária da fazendo fez para acessar o certificado A3 no
> > site do e-cac..
>
> >https://cav.receita.fazenda.gov.br/scripts/CAV/login/login.asp
>
> > Quando entramos em Acesso via Certificado Digital, se temos um Token ou
> > Smart Card instalado na maquina ele consegue
> > detectar e fazer o login utilizando tal certificado....
>
> > *Pergunta*: Como será que eles fizeram?
>
> > Abraços
>
> > Att.:
> > Diego Mosela
> >www.empresarialsistemas.com.br
>
> > --
> > Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
> > Para Postar: nfe...@googlegroups.com
> > Para Sair do Grupo: nfephp+un...@googlegroups.com<nfephp%2Bunsu...@googlegroups.com>

Reinaldo Borges

unread,
Oct 11, 2010, 10:01:43 AM10/11/10
to nfe...@googlegroups.com
Acesso à chave privada não é possível em A3.

Ainda não existe uma solução para assinar XML no navegador, com A3, sem ter que instalar
alguma coisa no computador do cliente (plugin, applet java, activex, etc).

O pessoal do LabSEC está desenvolvendo um módulo para que o PHP acesse A3, mas no servidor.

A assinatura de strings, no navegador, segue o padrão PKCS7, e portanto não serve para assinar o XML.
Não consegui descobrir uma forma de aproveitar a assinatura PKCS7 do XML para inserir no XMLSEC.
Ainda não tenho certeza, mas parece que o método de assinatura é diferente, por isso não é possível
"converter" do PKCS7 para XMLSEC.

Consegui extrair do PKCS7 o hash que foi assinado (necessário para o XMLSEC), mas a assinatura do XML
incluir, além do hash, todo o conteúdo; já o PKCS7 assina apenas o hash (ou o contrário, não lembro agora ).


[]'s

Reinaldo Borges


Proteja o endereço de seus amigos como estou protegendo o seu.
Ao enviar mensagens para mais de um endereço use SEMPRE o
"Cco" (cópia oculta) ou "Bcc" (Blind carbon copy).


32A.png

Bernardo Hoehl

unread,
Oct 11, 2010, 11:03:38 AM10/11/10
to nfe...@googlegroups.com
Amigos,


Vocês já deram uma olhada neste aqui???


Há alguma chance de colocar isso para funcionar com nossos A3s aqui no Brasil?


Bernardo


=======================
On 11.10.2010, at 11:01 AM, Reinaldo Borges wrote:

Acesso à chave privada não é possível em A3.

Ainda não existe uma solução para assinar XML no navegador, com A3, sem ter que instalar
alguma coisa no computador do cliente (plugin, applet java, activex, etc).

O pessoal do LabSEC está desenvolvendo um módulo para que o PHP acesse A3, mas no servidor.

A assinatura de strings, no navegador, segue o padrão PKCS7, e portanto não serve para assinar o XML.
Não consegui descobrir uma forma de aproveitar a assinatura PKCS7 do XML para inserir no XMLSEC.
Ainda não tenho certeza, mas parece que o método de assinatura é diferente, por isso não é possível
"converter" do PKCS7 para XMLSEC.

Consegui extrair do PKCS7 o hash que foi assinado (necessário para o XMLSEC), mas a assinatura do XML
incluir, além do hash, todo o conteúdo; já o PKCS7 assina apenas o hash (ou o contrário, não lembro agora <32A.png>).

Reinaldo Borges

unread,
Oct 11, 2010, 11:51:59 AM10/11/10
to nfe...@googlegroups.com
Já usei com um token e com um smart card, e funcionou no linux sem problemas.
A questão é que é preciso executar comandos openssl no linux para operações de assinatura.
Não é nativo no PHP.

Também tem como configurar o OpenSSL pra usar módulo PKCS11, que acessa o token,
para assinar e criptografar arquivos.
Então tem que usar o PHP pra gerar o arquivo, pra executar o comando, e depois ler o resultado.
O problema está na hora de solicitar o PIN.
Como o PHP vai executar, o PHP tem que informar o PIN junto com o comando.
Então o PIN, além de estar no código PHP, pode ficar armazenado nos logs do linux.


[]'s

Reinaldo Borges


Proteja o endereço de seus amigos como estou protegendo o seu.
Ao enviar mensagens para mais de um endereço use SEMPRE o
"Cco" (cópia oculta) ou "Bcc" (Blind carbon copy).


Bernardo Hoehl

unread,
Oct 11, 2010, 12:09:49 PM10/11/10
to nfe...@googlegroups.com
Reinaldo,


Eu uso Mac Os e assino a NFe usando o xmlsec... Man page aqui:


Você acha que há chance de colocar o opensc para funcionar aqui?

Que posso ganhar?

Por exemplo, posso colocar a senha num arquivo, com acesso de leitura somente ao próprio PHP daemon, ou apache, ou xmlsec, e deixar meu funcionário com um token na mão sem acesso a senha?

Assim, sem o token, a máquina não emitiria NFe e não precisaria ter um certificado A1 gravado?

Obrigado por seus comentários,



Bernardo

====================
Reply all
Reply to author
Forward
0 new messages