Software Certificado, Ajuda! - PHP - Portugal-a-Programar
Software Certificado, Ajuda!
By NazgulTuga, January 25, 2014 in PHP
Já li vários posts, neste forum, sobre o assunto de OpenSSL.
Li também o manual de construção dos Hash e respectivas chaves Públicas e Privadas.
Li o documento "Certificação de Software (Modelo 24)", que se encontra em: "Declarações", que me indica todos os requisitos/obrigações que o meu software deve ter a funcionar.
Tenho por tanto algumas dúvidas.
Li por aí, que o OpenSSL, dá chaves ou encriptações diferentes de ambiente para ambiente, e de linguagem para linguagem.
Este problema é fácil de resolver, estando eu a utilizar o PHP?
[*]Sou obrigado a criar uma chave Privada e outra Pública. Mas tenho visto na internet de que existe uma Assinatura a ser preenchida pelo cliente.
"countryName" => 'XX',
"stateOrProvinceName" => 'State',
"localityName" => 'SomewhereCity',
"organizationName" => 'MySelf',
"organizationalUnitName" => 'Whatever',
"commonName" => 'mySelf',
"emailAddress" => 'user@domain.com'
echo $privatekey.'<br><br>'; // Will hold the exported PriKey
echo $publickey.'<br><br>'; // Will hold the exported PubKey
echo $csrStr.'<br><br>'; // Will hold the exported Certificate
[*]Depois de as chaves criadas, tanto a pública como a privada, quais as que uso, como e onde?
[*]Ao encriptar a informação: "2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12;", onde vou buscar o XML para enviar ao SAF-PT, e como crio?
​Existem templates já construidos, disponibilizados na internet ou tenho de pedir essa informação à AT?
[*]Exemplo: link.
[*]Alguém me consegue, explicar de forma clara, quais os requisitos que o meu software deve comprir para poder ser certificado?
​Eu pergunto isto porque nas Finanças, onde moro, dizem-me que não sabem de nada disso, e quando telefonei para lá, que tinha de ler o Modelo 24. Li o documento mas para mim é chinês.
Eis o código que tenho e que se encontra a funcionar, apenas como teste.
# http://www.php.net/manual/pt_BR/book.openssl.php
"digest_alg" => "sha1", /* sha512*/
'x509_extensions' => 'v3_ca'
echo "Private Key:<BR>$privatekey<br><br>";
echo "Public Key:<BR>$publickey<BR><BR>";
$cleartext = '2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12;';
echo strlen($crypttext)."<br>";
$base64_data = base64_encode($crypttext);
echo strlen($base64_data)."<br>";
echo "Base64 text:<br>$base64_data<BR><BR>";
echo strlen($decrypted)."<br>";
openssl_sign($assinar,$signature,$pkeyid,"sha1");
# http://www.portugal-a-programar.pt/topic/58028-saft-openssl/page__hl__openssl
# http://www.portugal-a-programar.pt/topic/61541-at-questoes-legais/page__hl__openssl
# http://www.portugal-a-programar.pt/topic/61541-at-questoes-legais/page__st__20#entry517850
# http://www.portugal-a-programar.pt/topic/57734-utilizar-webservices-da-at/page__st__760__hl__openssl#entry503022
# GETs PUBLIC KEY object, from PRIVATE KEY
$pubkey = openssl_get_privatekey($privatekey);
# CREATES signature
openssl_sign($cleartext, $signature, $pubkey, "sha1");
# GETs PUBLIC KEYID object from PUBLIC KEY
$pubkeyid = openssl_get_publickey($publickey);
# http://www.portugal-a-programar.pt/topic/63288-at-saft-facturacao-php/#entry532920
$sig64 = base64_encode($signature);
echo strlen($sig64).'<br>';
echo $sig64.'<br>';
$Result = openssl_verify($cleartext, $signature, $pubkeyid,"sha1");
echo "ERROR: bad (there's something wrong)\n";
echo "SUCESS: signature ok (as it should be)\n";
echo "ERROR: ugly, error checking signature\n";
echo '<br>----------------------------<br><br>';
echo $csrStr.'<br><br>';	// Will hold the exported Certificate
Básicamente o que pretendo, é uma ajuda "paço-a-paço" para poder desenvolver um software que possa ser certificado e que funcione de acordo com o Modelo 24 da AT.
Não estou a pedir ajuda para o desenvolvimento do software, mas sim ajuda para a criação de um tutorial paço-a-paço, do que devo fazer com o mecanismo OpenSSL para que tudo fique a funcionar, tudo o que me é obrigatório ter por parte da AT, e o respectivo envio dessa mesma informação.
Ou seja, desde a criação das chaves Pública e Privada, registo das informações de uma factura (Ex: "2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12;"), exportação para XML e envio.
Como não conheço ninguém que tenha feito e desenvolvido um software certificado e que tenha passado pelo mesmo processo, pedia a vossa ajuda, com o intuito não só de me ajudar, mais também a outros interessados no assunto e que tenham as mesmas dúvidas ou dificuldades.
http://www.primaverabss.com/pt/UserFiles/Downloads/Especifica%C3%A7%C3%A3o_Regras_T%C3%A9cnicas.pdf
http://www.improxy.pt/LinkClick.aspx?fileticket=cmPEyh2GqWw%3D&tabid=788&mid=4195
http://repositorio.ipv.pt/handle/10400.19/1117
http://msmvps.com/blogs/albertosilva/archive/2010/08/30/processo-de-certifica-231-227-o-de-software-de-gest-227-o-e-c-243-digo-exemplo-em-vb-net-full-net-fx-amp-net-cf.aspx
​Resposta: SAF-T PT (Standard Audit File for Tax purposes) - Versão Portuguesa
Tenho de criar uma maneira para preencher apenas o que é relevante para uma factura ou recibo, certo? Não vou utilizar tudo. (?)
Edited January 25, 2014 by NazgulTuga
Estou a realizar um software de facturação em php e também pretendo certificá-lo.
Penso que dentro de uma semana estarei na altura de realizar o processo que envolve a chave publica e privada.
Podemos trocar impressões sobre o processo ?
A única coisa que tenho neste momento é mesmo só o código, mas até sobre ele tenho dúvidas sobre o que realmente utilizar pois tenho visto vários posts na internet em que se utilizam 2 métudos de encriptação e des-encriptação. Como podes ver no código que partilhei.
Não sei o que é necessário para além da encriptação, apesar de já ter lido vários documentos sobre o assunto, mas como sabes, ninguém vai dizer nada, ninguém vai ajudar ninguém e eu como não sei ler coisas escritas pelo estado pedi ajuda.
Adorava poder partilhar informações e quem sabe, ajudar quem tiver interessado.
Sabes em concreto o que é necessário/obrigatório existir/implementar num software certificado?
Existem três tópicos com bastante informação sobre estes temas de facturas, AT, webservices, etc.:
É capaz de ser boa ideia procurarem informações adicionais nesses tópicos, e se não encontrarem, colocar lá as vossas dúvidas.
Rui Carlos, foi precisamente por não ter encontrado as informações necessárias para as minhas dúvidas que eu comecei este novo post.
A minha intenção é criar uma lista de etapas, a fazer para desenvolver um software que seja ou esteja pronto para ser Certificado.
O que os tópicos resolvem/respondem é questões muito particulares e eu tenciono criar um manual.
Até porque se demoraram tanto tempo a responder a este post demonstra 2 coisas:
Não há ninguém interessado em ajudar
Ou, não há ninguém capaz de ajudar
A única coisa que quero é ajuda a traduzir os vários documentos PDF que estão disponíveis, para uma linguagem corrente. Porque como já referi acima, eu olho para aquilo e para mim é chinês.
O melhor que vi, foi o "AT - questões legais", mas a lista não está completa e poderá estar até, desactualizada, porque já tive a ler outros posts e por exemplo os backups terão de ser feitos de uma determinada maneira para não haver tentativa de fraude.
O problema de criar um novo tópico, é que passará mais despercebido para os utilizadores que percebem do assunto.
Eu não trabalho neste assunto, mas vou tentar responder a algumas questões. Para outras, o melhor será mesmo acompanhares os tópicos que te referi, pois o mais provável é que ninguém te consiga dar uma resposta correcta e completa.
Acho isso estranho. Comprometeria a interoperabilidade de sistemas. Tem algum referência sobre este assunto?
Sou obrigado a criar uma chave Privada e outra Pública. Mas tenho visto na internet de que existe uma Assinatura a ser preenchida pelo cliente.
$dn = array("countryName" => 'XX',
Depois de as chaves criadas, tanto a pública como a privada, quais as que uso, como e onde?
As assinaturas digitais costumam funcionar da seguinte forma:
- Crias um par de chaves (privada/pública), não divulgando a chave privada;
- Pedes a uma autoridade de certificação que certifique que a chave pública é mesmo tua (isto é necessário para que outros não emitam pares de chaves em teu nome, e falsifiquem a tua assinatura);
- Usas a chave privada para assinar documentos, para te autenticares, etc.;
- Outros usam a chave pública (e o certificado) para confirma que foste que fizeste determinada acção (assinatura, autenticação, etc.).
Penso que precisas de gerar um par de chaves, e depois gerar um CSR (certificate signing request), que é basicamente um pedido de certificação que envias à AT, para eles garantirem que a chave é mesmo tua. (Penso que na script acima, são basicamente estes elementos que estás a gerar.)
Depois penso que vais usar a chave privada para assinar facturas (possivelmente, os utilizadores do teu software vão usar a chave privada para assinarem as facturas que eles emitem).
Em todo caso, não trabalho nesta área, pelo que seria melhor confirmares isto (talvez o tópico do SAFT-PT seja o mais apropriado).
Alguém me consegue, explicar de forma clara, quais os requisitos que o meu software deve comprir para poder ser certificado?
Eu pergunto isto porque nas Finanças, onde moro, dizem-me que não sabem de nada disso, e quando telefonei para lá, que tinha de ler o Modelo 24. Li o documento mas para mim é chinês.
Este é uma pergunta à qual muito poucos te devem saber responder de forma correcta e complecta, pois há bastante informação que vai surgindo de forma mais ou menos avulsa vinda de quem já tento certificar um programa.
Lembro-me, por exemplo, que recentemente o nunopicado relatou a sua experiência no tópico das questões legais.