Da uma olhada nesse projeto, ele tem um exemplo de como fazer assinatura digital em PHP. http://www.nfephp.org/
Aki vai um resumão que eu fiz sobre certificados digitais, assinaturas digitais, criptografia e essas coisas...
*Arquivos p12 e pfx: (certificados digitais) São a mesma coisa.
Eles contém a chave pública e a chave privada no mesmo documento criptografado e protegido por senha,
dele, podemos obter a chave privada e a chave publica, também certificado digital, dados esses criptografados em X509.
*X509: Criptografia usada para os arquivos .pem, usada também nos dados contidos nos arquivos .pfx, no PHP, ao extrairmos os dados de um certificado digital no formato .pfx com a função openssl_pkcs12_read(), as informações são apresentadas com a criptografia x509, essa função retorna um array com a chave publica e com o certificado, criptografados nesse padrão, para ler as informações contidas, usamos a função openssl_x509_parse(), que decripta os dados. Obs: Apenas decripta os dados do certificado.
*.pem: Formato de arquivo definido para conter a chave-pública, ou pode conter ambas as chaves, também o certificado digital.
*Certificado Digital: É a chave pública com algumas informações a mais, inseridas pela unidade certificadora,
o certificado digital assegura que essa chave pública é sua mesmo.
__________________________________________________________________________________________________________
Softwares de emissão de NFe e NFSe usam certificados A1.
Para assinaturas via software, é extremamente recomendável o certificado A1, pois este pode ser instalado em quantas maquinas desejarmos, inclusive seu servidor apache, já o A3 precisa do Token, que é uma espécie de pendrive, contendo as chaves do certificado, assim sendo, se seu software fizer assinatura digital para 500 clientes, você deve ter 500 Tokens conectados à ele, sem falar que precisaria de um servidor com 500 portas USB ^^. Sendo assim, softwares de emissão NFe ou NFSe geralmente dão suporte apenas a certificados do tipo A1. Certificado digital do Tipo A1 vem em um arquivo pfx ou p12.
__________________________________________________________________________________________________________
CERTIFICADOS DIGITAIS EM PHP
Utilizando o PHP, temos algumas funções que nos auxiliam a extrair as chaves de certificados tipo A1, que utilizam arquivos .pfx ou p12. Para isso precisamos da senha do arquivo em questão. Tendo a senha em mãos, usamos a função openssl_pkcs12_read() para abrir o arquivo pfx ou p12 e extrair os dados do certificado, depois usamos a função openssl_x509_read() que monta um array com as informações criptografadas no padrão X509, depois disso, conseguimos ler os dados do certificado com a função openssl_x509_parse(), essa função decripta os dados apenas do campo ['cert'] do array retornado. Nesse campo decriptado, temos informações sobre o dono do certificado, datas limites entre outras.
__________________________________________________________________________________________________________
ASSINATURA DIGITAL
Em alguns casos, como na emissão das NFS-e por exemplo, as chaves públicas com certificados digitais são usadas apenas para comprovar quem escreveu o documento, e manter as informações sem alterações de terceiros. Para esse processo, podem ser usados dois mecanismos, (Message Autentication Code)-MAC e assinaturas digitais. Usaremos assinaturas digitais.
Assinatura digital é um tipo expecífico de MAC. Para assinar um documento sem criptorafia, é usado um (Message Digest)-MD, como o MD5 por exemplo, para gerar um hash do conteúdo do documento, depois disso, criptografa-se o hash com a chave privada do emitente, e esse trecho criptografado é apresentado junto ao documento, isso tudo é a assinatura digital.
Para checar os dados, o destinatário deve gerar um hash do documento usando o mesmo MD do emissor, ignorando os dados da assinatura digital que foram acrescidos ao documento, depois decifrar os dados da assinatura com a chave publica do emitente, e comparar os hash's.
Para ser possível que um documento ou assinatura sejam adulteradas e não sejam detectadas, o atacante deve ter acesso a chave privada do emissor.
Assinaturas digitais são verificadas usando a chave publica do emissor. Documentos assinados digitalmente, não são criptografados, apenas a própria assinatura é criptografada. A assinatura é um MD, como MD5 por exemplo, tornando o processo muito mais rápido.
Assim sendo, assinaturas digitais podem ser geradas e anexadas aos documentos, e armazenadas em qualquer lugar, sem se preocupar com a segurança do sistena que as armzena, tendo em vista que o atacante precisa da chave privada para alterar de forma eficiente o documento.
__________________________________________________________________________________________________________
CRIPTOGRAFIA ASSIMÉTRICA
Também conhecida como criptografia de chave pública.
O padrão de criptografia assimétrica que a receita federal do Brasil adotou é o RSA. Um dos mais completos existentes. As chaves são diferentes porém são relacionadas, os dados criptografados com a chave privada só poderão ser decifrados com a chave pública, e os dados criptografados com a chave pública, só serão decifrados com a chave privada.
__________________________________________________________________________________________________________
CERTIFICADOS DIGITAIS NO BRASIL
Para entender certificados digitais, recomenda-se essa leitura:
http://pt.kioskea.net/contents/crypto/certificat.php3
Qual certificado comprar A1 ou A3 ?
Os certificados são os mesmos. A diferença é a mídia onde estarão armazenados.
O A1 é em formato de arquivo no padrão .p12 ou .pfx.
O A3 é armazenado no token ou pendrive.
O que faz a diferença é que o A1 pode ser criado e instalado a primeira vez em um computador e depois exportado para quantos computadores você desejar. Bem como salvá-lo em qualquer lugar como backup de segurança.
Já o A3 só pode ser utilizado em conjunto com o TOKEN. Pois a chave privada é gerada pelo hardware do token e não fica disponível de forma alguma. Tornando assim o certificado praticamente em objeto físico.
Portanto sendo o TOKEN um equipamento, ele pode sofrer danos.
Os danos mais comuns que tenho presenciado são os seguintes:
Bloquear o token por digitar a senha errada e não saber a senha PUK
Criar as senhas iniciais PIN e PUK (Usuário e Admin) idênticas
Entrar no modo administrador e apagar o certificado
Plugar o TOKEN em USB frontal com cabo invertido e queimá-lo
Quebrar o TOKEN
Molhar o TOKEN
Mas ao comprar o A1 tenho que renovar anualmente?
Sim, certificados A1 têm a validade de 01 ano.
Mas você não precisa fazer a validação presencial e nem apresentar a documentação.
Se o certificado ainda não venceu e ainda é válido, basta você renovar on-line.
O processo online de obtenção do certificado é o idêntico ao da aquisição.
O preço média da renovação do A1 é de R$120,00.
Mas porque eles sempre empurram o A1 para comprar?
O A1 custa na média R$150,00 inicialmente e é renovado anualmente.
O A3 custa na média R$400,00 inicialmente e é renovado em três anos.
O preço portanto para 3 anos é praticamente o mesmo:
A1 = R$ 390,00 (R$150,00 + R$ 120,00 + R$ 120,00)
A3 = R$ 400,00
O A1 pode ser instalado e usado independente da quantidade de computadores.
Já o A3 só pode estar em 01 computador por vez para ser usado.
Ou seja, para usar simultâneamente você precisa de 01 TOKEN em cada computador.
Outro detalhe está no fato de poder danificar o TOKEN e ter que comprar outro.
Literalmente, pois não poderá renovar sem ele funcionando.
Mas e se alguém roubar meu A1?
Opções é que não faltam para resolver isso:
Revogar o certificado no site do AR que você adquiriu;
Todos os sites pedem senha para serem acessados;
Renovar o certificado junto ao AR antes de expirar;
Solicitar que rastreamento do IP do meliante junto Policia Federal;
Confira nos sites:
PRODEMGE: Renovação de Certificado Pessoa Jurídica
PRODEMGE: Revogação
Validar assinaturas digitais em XML:
https://www.receita.fazenda.gov.br/Aplicacoes/SSL/ATBHE/Assinadoc/ValidadorAssinaturas.app/valida.aspx