Bom dia,
O padrão utilizado para datar e assinar qualquer tipo de arquivo é o PKCS7.
Ao assinar, você pode "embutir" o arquivo original dentro da assinatura, ou pode criar um arquivo de assinatura
separado do arquivo (o que eu acho mais adequado e mais fácil de trabalhar).
Vejas a funções
openssl_pkcs7_* do PHP.
Não pesquisei ainda como "datar" o documento. Veja detalhes sobre ACT (Autoridades de Carimbo de Tempo).
A ideia básica é a seguinte: ao assinar um arquivo, você solicita um "carimbo de tempo" a uma ACT e inclui esse
carimbo na assinatura do arquivo.
Entre em contato com uma ACT para mais detalhes:
http://actbr.crsec.com.br/Depois compartilhe o que descobrir
Coloquei abaixo um post meu pra essa lista há algum tempo.
------
Navegadores Mozilla/Firefox oferecem uma função Javascript para assinar
uma
string, usando o certificado do cliente (testei com certificado
instalado
no browser e certificado em token).
Há também
funções para gerar CSR (solicitação de certificado a uma CA)
direto no browser.
Há alguns controles ActiveX para IE que fazem a
mesma coisa. Como não
uso Windows, ainda não testei. Se alguém quiser
se aventurar...
Informações sobre essa função:
https://developer.mozilla.org/en/JavaScript_crypto
Detalhe importante: essa função consegue assinar mesmo que a conexão
não seja HTTPS/SSL.
O retorno da função é a mensagem assinada, em modo "opaco"
PKCS7.
Uma assinatura normal teria a string original seguida da assinatura em
base64.
A assinatura "opaca" codifica a string junto com a assinatura, tudo em
base64.
Agora estou com outro problema: ao receber a mensagem assinada (
PKCS7),
não consigo verifica-la com o PHP. A função
openssl_pkcs7_verify()
sempre
retorna um erro.
Estou usando uma solução alternativa, chamando o openssl direto pela
linha de comando. Essa solução encontrei neste link:
http://fsl.cenditel.gob.ve/plugins/scmsvn/viewcvs.php/*checkout*/tronco/firmas/signText2.php?content-type=text%2Fplain&root=said
A função básica é:
function verifySig($msgFile,$sigFile,$
certFile) {
$ca_dir = "/var/www/ssl";
$ca_certs = $ca_dir."/allCACerts.crt";
exec("openssl
pkcs7 -inform PEM -in
$sigFile -print_certs -outform PEM -out $certFile", &$saida,
&$res);
if($res!=0) {
echo "Erro ao extrair certificados\n";
return $res;
}
exec("openssl smime -verify -inform PEM -in $sigFile -content
$msgFile -CApath $ca_dir -CAfile $ca_certs", &$saida,&$res);
return $res;
}
$msgFile é nome do arquivo com a mensagem original (não codificada, e
não assinada)
$sigFile é o arquivo que contem a mensagem assinada (gerada pelo
javascript signString)
$certFile é o nome de um arquivo onde serão gravados os certificados
usados para assinar a string
A função precisa ainda que você configure o caminho e o nome de arquivo
onde estarão os
certificados das CA's válidas para assinar a string.
A função retorna
true se a assinatura for válida.
Ainda não descobri o motivo da função do PHP acusar erro.
Um código simples para assinar uma string (teste no Firefox):
<script type='text/javascript'>
function
assinar() {
document.getElementById("form1").mensagemAssinada.value
=
window.crypto.signText( document.getElementById("form1").mensagem.value
,"ask");
document.getElementById("form1").submit();
}
</script>
<form name=form1 id=form1 method=post action='<?=
$_SERVER['PHP_SELF']?>'>
<input type=hidden
name=mensagemAssinada>
Mensagem a ser
transmitida:
<br>
<textarea name=mensagem rows=4
cols=65><?= $_POST['mensagem'] ?></textarea>
<br><br>
<input
type=button value="Assinar" onclick="assinar()">
</form>
[]'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).