Extrair certificado do modelo A3

15,441 views
Skip to first unread message

Ricardo Estevam

unread,
Mar 5, 2010, 3:52:24 PM3/5/10
to nfe...@googlegroups.com
Pessoal,

Alguém já conseguiu extrair o certificado digital de dentro do cartão?

Alguns clientes estão me pedindo isso e não estou conseguindo achar uma solução. A pessoa que me vendeu o certificado modelo A1 falou que dá para extrair ele do modelo A3, mas até agora não achei como fazer isso.

Vi que o Firefox tem uma solução, que é o complemento Crypto, funciona mesmo? O nfePHP consegue ler o arquivo que o firefox extrai como ele faz com o arquivo do modelo A1?

É que não tenho o modelo A3 para testar.

Aguardo.


Abraços,
Ricardo J. Estevam

Marcelo Freitas

unread,
Mar 5, 2010, 4:34:13 PM3/5/10
to nfe...@googlegroups.com
Então,


Tive esse problema e pelo resultado da minha pesquisa não rola; tanto
é que pra funcionar o token precisa estar na máquina do sujeito. É
possível usar o token num sistema web usando essa extensão que você
falou (o internet explorer tem funciinalidade equivalente também).
Para isso, a assinatura do XML fica no lado do cliente (via
JavaScript).


Acho isso tremendamente porco e sujeito a falhas de segurança (por
passar pela máquina do sujeito, pode ter um virus - por exemplo - que
muda o valor da nota.. e esse é só o primeiro caso que me vem à cabeça
agora).

O que estou fazendo é emitir tudo certificado do tipo A1.


Ah, além disso, pelo que o contador me falou só existe um fornecedor
do hardware do token. Tem um desses tokens num cliente meu e ele parou
de funcionar em menos de 3 meses. O suporte falou que é falha na USB
ou na instalação... em outras palavras recomendaram formatar a máquina
e instalar tudo dnovo.... A USB está OK e formatar a máquina está fora
de questão. Tentei em outra máquina onde o software já estava
instalado (e funcionando) e tb não funcionou.. nem me dei ao trabalho
de falar novamente com o suporte.


O jeito é ir com A1. Tanto por que daí rola usar qualquer sistema
operacional sem dó (o token só é suportado no windows e numa versão
antiga do ubuntu....). Eles podiam ao menos abrir os fontes dos
drivers deles. Aliás, na minha opinião o governo devia exigir isso já
que a empresa vai faturar bilhões só com a NFe.


[]'s

> --
> Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
> Para Postar: nfe...@googlegroups.com
> Para Sair do Grupo: nfephp+un...@googlegroups.com
> Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
> -------
> FAQ: https://www.assembla.com/wiki/show/nfephp/FAQ
> Como Participar: https://www.assembla.com/wiki/show/nfephp/Como_participar

--
Marcelo C. Freitas

IM's:
MSN: bate...@hotmail.com
ICQ: 24263609
Jabber: Og...@jabber.org
GTalk: marcelo...@gmail.com
Yahoo: baterausp

Reinaldo Borges

unread,
Mar 5, 2010, 9:05:30 PM3/5/10
to nfe...@googlegroups.com
Olá,

Os certificados A3 não podem ser "transformados" em A1. Para fazer isso, seria necessário
exportar a chave privada (que está no token ou cartão), e isso não é possível fazer, por isso
o A3 é mais seguro que o A1. Aliás, é também um requisito da ICP-Brasil: a chave privada
do A3 não deve sair do token/cartão.
O contrário é possível: colocar um A1 dentro de um token/cartão.

Já fiz testes de assinatura no lado cliente. Só pensei em uma forma para evitar que algum
vírus no cliente altere os dados: após a assinatura no cliente (via javascript mesmo),
você precisa checar no servidor se os dados assinados conferem com os que você enviou
ao cliente. Se tiver alguma alteração, avise o cliente do problema e descarte os dados
assinados pelo cliente.

Não sei se o Ricardo já fez assinatura com javascript, mas é basicamente passar uma
string para a função javascript. A string, no caso, deve ser o XML a ser assinado.
No Firefox será solicitado o PIN do A3, e será apresentada a string que deve ser assinada.
A possibilidade de alteração do vírus é aqui, já que seu XML estará em texto claro no
script, e pode ser alterado por outro javascript ou vírus.

Mas tive um problema ao verificar: as funções do PHP (openssl_pkcs7_verify) não funcionaram
para verificar a assinatura feita no cliente. Tive que usar o OpenSSL (via sistema operacional)
para fazer a verificação. Fora esse contra-tempo, a verificação funciona bem: ela permite que
você saiba se a assinatura é válida, e ainda é possível comparar o que o cliente assinou com
os dados que estão no servidor.

Algumas diferenças básicas entre usar A1 em relação ao A3 (no cliente):
Vantagens ao usar A1:
- O servidor consegue fazer assinatura sem intervenção do usuário.
- Vários usuários ao mesmo tempo podem assinar os documentos.
- O processo é mais rápido.
Desvantagens ao usar A1:
- Se o servidor for comprometido, sua chave privada pode ser roubada, ou
usada para assinar documentos falsos.

Vantagens ao usar A3 (cliente):
- O processo é mais seguro, já que o cliente precisa interagir para assinar os documentos.
Desvantagens:
- Apenas o usuário que está com o token/cartão pode assinar.
- O processo de assinatura é mais lento.

Outra solução é deixar o A3 (token/cartão) conectado ao servidor. Nesse caso, se o servidor
for comprometido não há perigo de perder o certificado/chave privada.
Se o PIN ficar salvo no servidor (no código ou arquivo de configuração) é possível fazer
assinatura sem interação com o usuário, mas reduz a segurança.
Por outro lado, solicitar o PIN ao usuário tem um problema: se um usuário tentar muitas
vezes com o PIN errado, pode travar o token/cartão. E se o token/cartão não tiver PUK,
o certificado será perdido.

Não sei como usar A3 conectado ao servidor usando apenas PHP. O único jeito que
conheço é usando o OpenSSL, e não é tarefa tão trivial.

[]'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).
Reply all
Reply to author
Forward
0 new messages