Quantcast
Channel: Tópicos
Viewing all articles
Browse latest Browse all 14700

Software Certificado, Ajuda!

$
0
0
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.
    • Código :
      <?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?
  • 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.

Código :
<?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

Viewing all articles
Browse latest Browse all 14700