Jump to content
NazgulTuga

Software Certificado, Ajuda!

Recommended Posts

NazgulTuga

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.

  1. Li por aí, que o OpenSSL, dá chaves ou encriptações diferentes de ambiente para ambiente, e de linguagem para linguagem.

    1. 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.

  1. 
    
    <?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?

  1. ​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?

    1. ​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.

    
    
    <?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
    ?>

    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.

    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


​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 by NazgulTuga

Share this post


Link to post
Share on other sites
PALVES

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

Share this post


Link to post
Share on other sites
NazgulTuga

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?

Share this post


Link to post
Share on other sites
NazgulTuga

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.

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.