Jump to content

Recommended Posts

Posted
Em 10/11/2022 às 12:58, bioshock disse:

Juntas-lhe o hash + a chain de certificados presumo eu.

Hoje de madrugada cheguei a este ponto e não consegui pôr a funcionar porque me devolvia sempre erro 500. É só em pré-produção a anomalia? É que sem isto não dá para assinar documentos. Depois há incoerências no Swagger:

  • O Swagger diz que o endpoint v2/credentials/authorize devolve o SAD e não devolve
  • O Swagger não diz que no endpoint credentials/authorize/verify deve ser passado o BASIC Authentication (e provavelmente o SAFE Authorization) e deve

Eu estou. Ainda não cheguei a este ponto, pois não consigo obter o SAD. 

Assim que eu tiver isto aceite e a bombar em produção, coloco aqui o código em PHP completo.

Estas a usar o openssl_pkcs7_sign? Ou como estas a fazer?

Posted
On 11/10/2022 at 4:05 PM, CCoutinho said:

Chamo a v/ atenção para a informação não-oficial que foi passada na Reunião Livre Online - 09 novembro 2022 da Ordem dos Contabilistas Certificados a partir do minuto 14

On 11/10/2022 at 4:52 PM, samuquinha said:

Mais um adiamento...

Já se estava mesmo a ver. Adiada novamente a obrigatoriedade da Facturação Electrónica em 2023. Até me admira que o ATCUD não tenha sido também adiado...

Enfim.

On 11/10/2022 at 5:37 PM, Nel said:

Estas a usar o openssl_pkcs7_sign? Ou como estas a fazer?

Ainda não cheguei a esse ponto. Hoje estive o dia fora e não consegui testar mais nada. Ainda não consegui obter o SAD, já conseguiste?

Posted
Em 10/11/2022 às 18:53, bioshock disse:

Já se estava mesmo a ver. Adiada novamente a obrigatoriedade da Facturação Electrónica em 2023. Até me admira que o ATCUD não tenha sido também adiado...

Enfim.

Ainda não cheguei a esse ponto. Hoje estive o dia fora e não consegui testar mais nada. Ainda não consegui obter o SAD, já conseguiste?

Sim consigo obter um SAD. Testei ainda sem gerar o container para a assinatura no PDF, pois nao sei bem como fazer isso em PHP por exemplo com tcpdf.

Qual o teu problema?

Eu estou a gerar o hash assim: (não sei se esta correcto)

    $pdf_bytes = file_get_contents('Exemplo.pdf');

    $hash = safe_hash($pdf_bytes);

    echo base64_encode($hash);


    function safe_hash($text)
    {
        $algo      = 'sha256';
        $algo_len  = 32;

        $output = hash($algo, $text, true);

        $output = strlen($output) > $algo_len ? substr($output, 0, $algo_len) : $output;

        //prefix de sha256
        $prefix = "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20";

        return $prefix . $output;
    }

 

Posted
Em 10/11/2022 às 18:53, bioshock disse:

Já se estava mesmo a ver. Adiada novamente a obrigatoriedade da Facturação Electrónica em 2023. Até me admira que o ATCUD não tenha sido também adiado...

 

Na sessão livre falaram só dos PDF's assinados e não da faturação eletrónica para as entidades públicas.

Posted
On 11/10/2022 at 6:53 PM, bioshock said:

Já se estava mesmo a ver. Adiada novamente a obrigatoriedade da Facturação Electrónica em 2023. Até me admira que o ATCUD não tenha sido também adiado...

Enfim.

Uma coisa não tem nada a ver com a outra...

A mega hiper colossal confusão que está introduzida no mercado da FACTURA ELECTRÓNICA PDF e FACTURA ELECTRÓNICA AP (Administração Pública) não tem nada a ver com algo que está funcional, bem definido, e em produção há mais de 1 ano...

Quanto a mim este SAFE é uma solução do tipo "pior a emenda que o soneto", sinceramente. Eu entendo as questões de segurança, mas este processo é uma barafunda total! (ainda por cima a AMA não apresenta UM exemplo de implementação, o que dificulta o processo e apenas os sobrecarrega a própria AMA com resmas de dúvidas)

Acho que muita coisa vai mudar durante o próximo ano... principalmente na questão da FE-AP. E mesmo na factura electrónica PDF, acho que o caminho é este: https://www.portugal-a-programar.pt/forums/topic/77364-at-questões-legais/page/317/#comment-627942

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Posted (edited)
On 11/10/2022 at 8:32 PM, CCoutinho said:

Na sessão livre falaram só dos PDF's assinados e não da faturação eletrónica para as entidades públicas.

A FE-AP vem por arrasto... A confusão ainda é maior no que toca à FE-AP... o sistema TEM de ser revisto, sob pena de "não funcionar" para grande parte dos fornecedores do estado...

Edited by marcolopes

The simplest explanation is usually the correct one

JAVA Utilities: https://github.com/marcolopes/dma

Posted
On 11/10/2022 at 8:32 PM, CCoutinho said:

Na sessão livre falaram só dos PDF's assinados e não da faturação eletrónica para as entidades públicas.

Queria-me referir aos PDF's assinados e não à facturação electrónica, que sei que é outro tema diferente. Basicamente é adiado a necessidade do documento PDF ter uma assinatura digital que comprove a sua veracidade.

On 11/10/2022 at 7:30 PM, Nel said:

Sim consigo obter um SAD. Testei ainda sem gerar o container para a assinatura no PDF, pois nao sei bem como fazer isso em PHP por exemplo com tcpdf.

Qual o teu problema?

Estou a chamar o endpoint credentials/autorize/verify desta forma:

$url = "https://pprsafe.autenticacao.gov.pt/credentials/authorize/verify?processId={$processId}";

$headers = 
[
    'Accept: application/json', 
    'Authorization: Basic ' . base64_encode('clientTest:Test'), 
    'SAFEAuthorization: Bearer ' . $accessToken
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$response = json_decode($response);

No entanto é-me devolvido o erro 500. Na documentação nem diz em lado nenhum que deves utilizar o Authorization: Basic, mas sem isso retorna-me 401 forbidden.

Relativamente ao hash, também não sei ainda se está OK, mas tenho a coisa um bocado mais simples:

private function hashPDF($fileUrl)
{
  $hash = hash_file('sha256', $fileUrl);
  $sha256SignPrefix = ['x30', 'x31', 'x30', 'x0d', 'x06', 'x09', 'x60', 'x86', 'x48', 'x01', 'x65', 'x03', 'x04', 'x02', 'x01', 'x05', 'x00', 'x04', 'x20'];
  $sha256SignPrefix = implode('\\', $sha256SignPrefix);

  $concat = $sha256SignPrefix . $hash;

  return $concat;
}

 

Posted
Em 10/11/2022 às 21:43, bioshock disse:

Queria-me referir aos PDF's assinados e não à facturação electrónica, que sei que é outro tema diferente. Basicamente é adiado a necessidade do documento PDF ter uma assinatura digital que comprove a sua veracidade.

Estou a chamar o endpoint credentials/autorize/verify desta forma:

$url = "https://pprsafe.autenticacao.gov.pt/credentials/authorize/verify?processId={$processId}";

$headers = 
[
    'Accept: application/json', 
    'Authorization: Basic ' . base64_encode('clientTest:Test'), 
    'SAFEAuthorization: Bearer ' . $accessToken
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$response = json_decode($response);

No entanto é-me devolvido o erro 500. Na documentação nem diz em lado nenhum que deves utilizar o Authorization: Basic, mas sem isso retorna-me 401 forbidden.

Relativamente ao hash, também não sei ainda se está OK, mas tenho a coisa um bocado mais simples:

private function hashPDF($fileUrl)
{
  $hash = hash_file('sha256', $fileUrl);
  $sha256SignPrefix = ['x30', 'x31', 'x30', 'x0d', 'x06', 'x09', 'x60', 'x86', 'x48', 'x01', 'x65', 'x03', 'x04', 'x02', 'x01', 'x05', 'x00', 'x04', 'x20'];
  $sha256SignPrefix = implode('\\', $sha256SignPrefix);

  $concat = $sha256SignPrefix . $hash;

  return $concat;
}

 

Estas a usar a versão nova. Eu estou a usar o credentials/autorize

Posted
On 11/10/2022 at 10:56 PM, Nel said:

Estas a usar a versão nova. Eu estou a usar o credentials/autorize

Hm? Eu também. Mas depois do credentials/authorize tens de chamar o credentials/authorize/verify, e é neste último endpoint que está o meu problema.

O valor do campo processID, enviado no credentials/authorize/verify, presumo eu que é sempre o mesmo..

Posted
Em 10/11/2022 às 23:20, bioshock disse:

Hm? Eu também. Mas depois do credentials/authorize tens de chamar o credentials/authorize/verify, e é neste último endpoint que está o meu problema.

O valor do campo processID, enviado no credentials/authorize/verify, presumo eu que é sempre o mesmo..

Na versão anterior não necessitas.

Chamas assim o  "credentials/autorize" com o seguinte, que ele devolve o SAD

{
  "clientData": {
    "clientName": "clientTest",
    "documentNames": [
      "documentName1"
    ],
    "processId": "a015722c-456e-4abc-9efb-d774936ce749"
  },
  "credentialID": "f0c3aba7-11f2-4994-936d-2c68bd2cbf44",
  "hashes": [
    "MDEwDQYJYIZIAWUDBAIBBQAEILyv2oDRjRYGhF8FhFrdAP46Kd272FHm/xqnNfBKg8ES"
  ],
  "numSignatures": 1
}

 

Posted (edited)
On 11/10/2022 at 11:44 PM, Nel said:

Na versão anterior não necessitas.

Chamas assim o  "credentials/autorize" com o seguinte, que ele devolve o SAD

{
  "clientData": {
    "clientName": "clientTest",
    "documentNames": [
      "documentName1"
    ],
    "processId": "a015722c-456e-4abc-9efb-d774936ce749"
  },
  "credentialID": "f0c3aba7-11f2-4994-936d-2c68bd2cbf44",
  "hashes": [
    "MDEwDQYJYIZIAWUDBAIBBQAEILyv2oDRjRYGhF8FhFrdAP46Kd272FHm/xqnNfBKg8ES"
  ],
  "numSignatures": 1
}

 

Ah certo, ok. 👍

E consegues passar para o endpoint sign/hash?

Eu estou a enviar algo deste género:

{
  "sad": "YWM0MDRjMjItMzRmNC00ZjA4LTljOTQtOTE0ZmU4YWIzNzIy",
  "hashes": [
    "\\x30\\x31\\x30\\x0d\\x06\\x09\\x60\\x86\\x48\\x01\\x65\\x03\\x04\\x02\\x01\\x05\\x00\\x04\\x20309a975f758e7b2f367fef62ea6b58bff2159d6697d665e83cd10fe6930ab0bc"
  ],
  "signAlgo": "1.2.840.113549.1.1.11",
  "clientData": {
    "processId": "..............",
    "clientName": "clientTest"
  },
  "credentialID": "............."
}

Mas obtenho

{"error":"Internal Server Error","error_description":"Unexpected error while processing client request"}

Edit: resolvido este bug, tinha de devolver a hash do PDF em base64. 

Edited by bioshock
Posted
Em 11/11/2022 às 00:05, bioshock disse:

Ah certo, ok. 👍

E consegues passar para o endpoint sign/hash?

Eu estou a enviar algo deste género:

{
  "sad": "YWM0MDRjMjItMzRmNC00ZjA4LTljOTQtOTE0ZmU4YWIzNzIy",
  "hashes": [
    "\\x30\\x31\\x30\\x0d\\x06\\x09\\x60\\x86\\x48\\x01\\x65\\x03\\x04\\x02\\x01\\x05\\x00\\x04\\x20309a975f758e7b2f367fef62ea6b58bff2159d6697d665e83cd10fe6930ab0bc"
  ],
  "signAlgo": "1.2.840.113549.1.1.11",
  "clientData": {
    "processId": "..............",
    "clientName": "clientTest"
  },
  "credentialID": "............."
}

Mas obtenho

{"error":"Internal Server Error","error_description":"Unexpected error while processing client request"}

Para o signatures/signHash envio isto e funciona. Deve dar erro por causa da tua hash, acho que o prefix não pode ir da forma que tens.

{
  "clientData": {
    "clientName": "clientTest",
    "processId": "a015722c-456e-4abc-9efb-d774936ce749"
  },
  "credentialID": "f0c3aba7-11f2-4994-936d-2c68bd2cbf44",
  "hashes": [
    "MDEwDQYJYIZIAWUDBAIBBQAEILyv2oDRjRYGhF8FhFrdAP46Kd272FHm/xqnNfBKg8ES"
  ],
  "sad": "MGI5MWJkMTctNjBiNC00OGVkLWE4MDctOTk0ZjMyMWI3ZGE3",
  "signAlgo": "1.2.840.113549.1.1.11"
}

 

Posted
On 11/11/2022 at 12:29 AM, Nel said:

Para o signatures/signHash envio isto e funciona. Deve dar erro por causa da tua hash, acho que o prefix não pode ir da forma que tens.

{
  "clientData": {
    "clientName": "clientTest",
    "processId": "a015722c-456e-4abc-9efb-d774936ce749"
  },
  "credentialID": "f0c3aba7-11f2-4994-936d-2c68bd2cbf44",
  "hashes": [
    "MDEwDQYJYIZIAWUDBAIBBQAEILyv2oDRjRYGhF8FhFrdAP46Kd272FHm/xqnNfBKg8ES"
  ],
  "sad": "MGI5MWJkMTctNjBiNC00OGVkLWE4MDctOTk0ZjMyMWI3ZGE3",
  "signAlgo": "1.2.840.113549.1.1.11"
}

 

Editei o post, faltava-me o base64, já bomba. 

Posted
Em 11/11/2022 às 09:09, MiguelAl disse:

Podes-me dizer onde está esta notícia? Não consigo encontrar o despacho...

Pelo que percebi no vídeo (só vi 1 ou 2 minutos), o despacho só irá sair em Dezembro (supostamente).

Posted
Em 11/11/2022 às 00:46, bioshock disse:

Editei o post, faltava-me o base64, já bomba. 

Conseguiste fazer algum avanço com o PDF? Eu ainda não consegui nada de jeito!

Posted
On 11/11/2022 at 7:24 PM, Nel said:

Conseguiste fazer algum avanço com o PDF? Eu ainda não consegui nada de jeito!

  Sim consegui, já tenho isto a adicionar a assinatura & o documento adicionado. Estou a utilizar um serviço pago, não estou a utilizar TCPDF. Em breve vou partilhar aqui o código. Dá-me alguns dias, falta-me resolver a situação do Access Token, enviar o código para a SAFE/AMA e assim que for autorizado, coloco aqui. 👍

Estou só com dificuldades em obter o Access Token dinamicamente, mas acho que já sei porquê.

Posted

Estou a fazer testes e o que até há alguns pedidos a trás na chamada do endpoint "https://preprod.autenticacao.gov.pt/oauthresourceserver/api/AttributeManager" me devolvia:

algo contendo o accessToken, refresToken e oauthToken

passou a devolver:

"value":"{\"error\":\"Requested signature account already exists\",\"error_description\":\"Account already exists for citizen signatureAccountKeyAlias: BIxxxxxxxxyyyyyyyyyzzzzzzzz\"}"

Qual o motivo para tal?

 

Neste momento já está a devolver  accessToken, refresToken e oauthToken.

Pretendo agora invocar o endpoint "https://preprod.autenticacao.gov.pt/credentials/info", no entanto não sei quais os tokens a usar, nomeadamente no header "SAFEAuthorization" e "Authorization", bem como no parametro "processId".

Alguém já passou por esta fase?

Abraço

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.