NazgulTuga Posted January 25, 2014 at 01:08 AM Report #542620 Posted January 25, 2014 at 01:08 AM Boa noite, 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. <?php $dn = array( "countryName" => 'XX', "stateOrProvinceName" => 'State', "localityName" => 'SomewhereCity', "organizationName" => 'MySelf', "organizationalUnitName" => 'Whatever', "commonName" => 'mySelf', "emailAddress" => 'user@domain.com' ); $privkeypass = '1234'; $numberofdays = 365; $privkey = openssl_pkey_new(); $csr = openssl_csr_new($dn, $privkey); $sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays); openssl_x509_export($sscert, $publickey); openssl_pkey_export($privkey, $privatekey, $privkeypass); openssl_csr_export($csr, $csrStr); 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á construídos, 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 cumprir para poder ser certificado? Eis o código que tenho e que se encontra a funcionar, apenas como teste. <?php # http://www.php.net/manual/pt_BR/book.openssl.php if (isset($_SERVER['HTTPS']) ) { echo "SECURE: This page is being accessed through a secure connection.<br><br>"; } else { echo "UNSECURE: This page is being access through an unsecure connection.<br><br>"; } // Create the keypair $config = array( "digest_alg" => "sha1", /* sha512*/ "private_key_bits" => 1024, "private_key_type" => OPENSSL_KEYTYPE_RSA, 'x509_extensions' => 'v3_ca' ); $res=openssl_pkey_new($config); // Get private key openssl_pkey_export($res, $privatekey); echo "Private Key:<BR>$privatekey<br><br>"; // Get public key $publickey=openssl_pkey_get_details($res); $publickey=$publickey["key"]; echo "Public Key:<BR>$publickey<BR><BR>"; $cleartext = '2010-05-18;2010-05-18T11:22:19;FAC 001/14;3.12;'; echo "Clear text:<br>$cleartext<BR><BR>"; openssl_public_encrypt($cleartext, $crypttext, $publickey); echo strlen($crypttext)."<br>"; echo "Crypt text:<br>$crypttext<BR><BR>"; $base64_data = base64_encode($crypttext); echo strlen($base64_data)."<br>"; echo "Base64 text:<br>$base64_data<BR><BR>"; openssl_private_decrypt($crypttext, $decrypted, $privatekey); echo strlen($decrypted)."<br>"; echo "Decrypted text:<BR>$decrypted<br><br>"; echo '<br/>'; echo '<br/>'; /* $pkeyid = openssl_get_privatekey($priv_key); openssl_sign($assinar,$signature,$pkeyid,"sha1"); return base64_encode($signature); */ # 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>'; # CHECK IF data is VALID $Result = openssl_verify($cleartext, $signature, $pubkeyid,"sha1"); switch($Result) { case 0: { echo "ERROR: bad (there's something wrong)\n"; } break; case 1: { echo "SUCESS: signature ok (as it should be)\n"; } break; default: { echo "ERROR: ugly, error checking signature\n"; } break; } echo '<br>----------------------------<br><br>'; $dn = array("countryName" => 'XX', "stateOrProvinceName" => 'State', "localityName" => 'SomewhereCity', "organizationName" => 'MySelf', "organizationalUnitName" => 'Whatever', "commonName" => 'mySelf', "emailAddress" => 'user@domain.com'); $privkeypass = '1234'; $numberofdays = 365; $privkey = openssl_pkey_new($config); $csr = openssl_csr_new($dn, $privkey); $sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays); openssl_x509_export($sscert, $publickey); openssl_pkey_export($privkey, $privatekey, $privkeypass); openssl_csr_export($csr, $csrStr); 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 ?> Basicamente 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. Obrigado, Links úteis: http://www.primaverabss.com/pt/UserFiles/Downloads/Especifica%C3%A7%C3%A3o_Regras_T%C3%A9cnicas.pdf http://info.portaldasfinancas.gov.pt/NR/rdonlyres/AC494AE7-7E41-41C9-991B-15C3F0126ABF/0/ComunicacaodedadosdasFaturas20130418.pdf http://info.portaldasfinancas.gov.pt/pt/apoio_contribuinte/NEWS_SAF-T_PT.htm 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 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. 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. (?)
PALVES Posted February 4, 2014 at 12:49 AM Report #543846 Posted February 4, 2014 at 12:49 AM Boa Noite 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 ? Carlos Alves
NazgulTuga Posted February 4, 2014 at 12:55 AM Author Report #543847 Posted February 4, 2014 at 12:55 AM Boa noite, 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?
Rui Carlos Posted February 4, 2014 at 08:04 PM Report #543955 Posted February 4, 2014 at 08:04 PM Existem três tópicos com bastante informação sobre estes temas de facturas, AT, webservices, etc.: SAFT-PT: debate de dúvidas e ideias Utilizar Webservices da AT AT - questões legais É 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 Gonçalves
NazgulTuga Posted February 4, 2014 at 08:17 PM Author Report #543959 Posted February 4, 2014 at 08:17 PM 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.
Rui Carlos Posted February 4, 2014 at 11:40 PM Report #544000 Posted February 4, 2014 at 11:40 PM 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. 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? 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. <?php $dn = array("countryName" => 'XX', "stateOrProvinceName" => 'State', "localityName" => 'SomewhereCity', "organizationName" => 'MySelf', "organizationalUnitName" => 'Whatever', "commonName" => 'mySelf', "emailAddress" => 'user@domain.com' ); $privkeypass = '1234'; $numberofdays = 365; $privkey = openssl_pkey_new(); $csr = openssl_csr_new($dn, $privkey); $sscert = openssl_csr_sign($csr, null, $privkey, $numberofdays); openssl_x509_export($sscert, $publickey); openssl_pkey_export($privkey, $privatekey, $privkeypass); openssl_csr_export($csr, $csrStr); 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? 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. Rui Carlos Gonçalves
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now