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.
Código :
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
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
?>
- Código :
- 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?
- 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. (?)
- Resposta: SAF-T PT (Standard Audit File for Tax purposes) - Versão Portuguesa
- Exemplo: link.
- Existem templates já construidos, disponibilizados na internet ou tenho de pedir essa informação à AT?
- 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.
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
?>
# 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