Skip to content

Certificado Modelo A3

Roberto L. Machado edited this page Nov 24, 2016 · 13 revisions

#Os certificados A3 NÃO FUNCIONAM com o PHP!!!!

A forma de um A3 operar é que a chave privada não é exportável, ou seja ela é inacessível ao PHP ou ao S.O. diretamente e portanto não pode ser disponibilizada para os pacotes como OpenSSL, cURL, ou SOAP que usam as chaves em arquivo físico.

Num ambiente "cliente - servidor" com as rotinas sendo executadas no servidor, nunca haverá forma de usar um A3, para fazer a comunicação com a SEFAZ. Isso é um FATO !!

A única possibilidade do uso de certificados A3 por um servidor remoto, mesmo com a introdução de novos pacotes que permitam seu uso, é que ele esteja FISICAMENTE conectado nesse servidor, o que é na grande maioria dos casos simplesmente IMPOSSÍVEL.

Já em aplicações DESKTOP como as escritas em JAVA, .NET, C#, etc. isso se torna possível, mas esse aplicativo deverá não só fazer a assinatura mas também toda a parte da comunicação SOAP sobre HTTPS. O uso de certificado em formato A3 pelo PHP (em execução local) está em estudo para verificarmos a possibilidade futura de seu uso, porém isso irá requer programas externos para a comunicação com o token (usb drive ou smart card).

Existem ferramentas para isso, mas ainda não estão integradas ao PHP (e provavelmente nunca serão) e portanto esse certificado ainda não está acessível ao sistema. Isso inclui também sistemas profissionais como o HSM (Hardware Secure Module).

Um projeto está em andamento mas ainda não foi testado, que deve permitir o acesso pelo PHP dos certificados A3: LibCryptoSec

###Mas todos esses bla bla bla são pura perda de tempo pois os custos envolvidos não compensam a perda de tempo para tentar fazer isso funcionar. É uma completa BOBAGEM!!!

Aparentemente existe um workaround, que usa o openssl executado via exec(php) para conseguir utilizar o certificado A3.

Não veja isto como um processo simples, pois depende do driver do leitor ser instalado e do engine, da lib openssl configurada para conversar com o engine do leitor. Ou seja, se você não tem habilidades técnicas elevadas, desista! O certificado A1 está baratinho nos correios e na caixa. Mais barato que o trabalho que você terá, ok?

Aqui abaixo um exemplo assinando pdf:

 exec('openssl smime -md sha256 -binary -outform SMIME -sign -certfile /home/user/full_chain.pem -signer        /home/user/personal.pem -inkey slot_x-id_xxxxxxxxxxxxxxx -keyform engine -in ' . $tempdoc . ' -out ' . $tempsign . ' -  engine pkcs11 -passin pass:123456');
  • certfile: The path to the chain certificates (in PEM format). All certificates should be in a single file, one after the other. If your certificate authority has given you the certificates in another format (e.g. DER), see this link on how to convert them using OpenSSL.

  • signer: The path to your personal certificate (its public key). You can usually export this from your token using the manufacturer's middleware.

  • inkey: The slot and id of your certificate. In order to get these, from command line run "pkcs11-tool --module /usr/lib/libeTPkcs11.so --list-objects" where you have to replace the --module parameter value with the correct path for your middleware library.

  • passin: The PIN of your token (after pass:)

Mais informações: http://linkwi.se/gr-el/blog/blog-inner/qualified-electronic-signatures-pdf-php/