Jump to content

Recommended Posts

Posted (edited)
On 11/7/2022 at 7:52 PM, zeph said:

Tens de ter a Assinatura digital como atributo, logo claro que tive aprovação

Ora, mesmo após aprovação em pré-produção continua sem funcionar no meu caso. O erro retornado é o mesmo.

[
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/NIC', 'value' => '...', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/NomeProprio', 'value' => '...', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/NomeApelido', 'value' => '...', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/DataValidade', 'value' => '07-08-2031', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/DataNascimento', 'value' => '...', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/SAFE/createSignatureAccount?enterpriseNipc=....', 'value' => '{"error":"Bad Request","error_description":"No response found for this OAuthToken"}', 'state' => 'Available']
]

Sendo que o que estou a enviar é o seguinte:

https://preprod.autenticacao.gov.pt/oauth/askauthorization?client_id=[VALOR_RECEBIDO_NO_1º_EMAIL_AMA]&
scope=http://interop.gov.pt/MDC/Cidadao/NomeProprio%20
http://interop.gov.pt/MDC/Cidadao/NIC%20
http://interop.gov.pt/MDC/Cidadao/NomeProprio%20
http://interop.gov.pt/MDC/Cidadao/NomeApelido%20
http://interop.gov.pt/MDC/Cidadao/DataValidade%20
http://interop.gov.pt/MDC/Cidadao/DataNascimento%20
http://interop.gov.pt/SAFE/createSignatureAccount?enterpriseNipc=[NIF_EMPRESA_TESTES]
	&email=[EMAIL_EMPRESA_TESTES]
    &expirationDate=2022-12-24
    &signaturesLimit=450000
	&creationClientName=[NOME_SOFT_FACTURACAO]
    &response_type=token

EDIT:

Ok, parece que tinha de "Adicionar um certificado" e agora está em pendente, vou ter de aguardar novamente 😒, será que é autorizado automaticamente ou tenho de enviar outro email?

EDIT 2:

O certificado parece que entretanto foi automaticamente activado, mas o problema persiste.

Edited by bioshock
Posted
On 11/9/2022 at 1:51 AM, bioshock said:

Ora, mesmo após aprovação em pré-produção continua sem funcionar no meu caso. O erro retornado é o mesmo.

[
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/NIC', 'value' => '...', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/NomeProprio', 'value' => '...', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/NomeApelido', 'value' => '...', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/DataValidade', 'value' => '07-08-2031', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/MDC/Cidadao/DataNascimento', 'value' => '...', 'state' => 'Available'],
    ['name' => 'http://interop.gov.pt/SAFE/createSignatureAccount?enterpriseNipc=....', 'value' => '{"error":"Bad Request","error_description":"No response found for this OAuthToken"}', 'state' => 'Available']
]

Sendo que o que estou a enviar é o seguinte:

https://preprod.autenticacao.gov.pt/oauth/askauthorization?client_id=[VALOR_RECEBIDO_NO_1º_EMAIL_AMA]&
scope=http://interop.gov.pt/MDC/Cidadao/NomeProprio%20
http://interop.gov.pt/MDC/Cidadao/NIC%20
http://interop.gov.pt/MDC/Cidadao/NomeProprio%20
http://interop.gov.pt/MDC/Cidadao/NomeApelido%20
http://interop.gov.pt/MDC/Cidadao/DataValidade%20
http://interop.gov.pt/MDC/Cidadao/DataNascimento%20
http://interop.gov.pt/SAFE/createSignatureAccount?enterpriseNipc=[NIF_EMPRESA_TESTES]
	&email=[EMAIL_EMPRESA_TESTES]
    &expirationDate=2022-12-24
    &signaturesLimit=450000
	&creationClientName=[NOME_SOFT_FACTURACAO]
    &response_type=token

EDIT:

Ok, parece que tinha de "Adicionar um certificado" e agora está em pendente, vou ter de aguardar novamente 😒, será que é autorizado automaticamente ou tenho de enviar outro email?

EDIT 2:

O certificado parece que entretanto foi automaticamente activado, mas o problema persiste.

Envia email para eles. Parece-me que há aí algum problema com a conta

Posted (edited)
On 11/9/2022 at 8:45 AM, zeph said:

Envia email para eles. Parece-me que há aí algum problema com a conta

Havia duas anomalias:

  1. Não estava a utilizar $ mas sim & no URL
  2. Faltava-me o campo que me tinhas dito enterpriseAdditionalInfo

Neste momento já não dá erro, mas o valor devolvido no parâmetro createSignatureAccount é vazio. Aqui acredito que entra aquela história de "tens de esperar 15 segundos para validar se está disponível". Bem, eu espero 30 segundos antes de validar e dá-me sempre vazio o atributo.

Se chamar este endpoint várias vezes após 30 segundos (ou mais) https://preprod.autenticacao.gov.pt/OAuthResourceServer/Api/AttributeManager?token={$token}&authenticationContextId={$authenticationContextId} devolve-me sempre o mesmo resultado.

Edited by bioshock
  • Vote 1
Posted

Asério que complicação 🤣

Alguém me consegue ilucidar?

Posted
Em 09/11/2022 às 18:29, bioshock disse:

Asério que complicação 🤣

Alguém me consegue ilucidar?

Pois parece que é a forma mais rápida. Nunca consegui obter o accesstoken por essa via.

Posted (edited)
Em 29/10/2022 às 07:22, laboss disse:

Depois de meteres o container da assinatura e basicamente isso, o código não consigo passar pois é da empresa, mas é basicamente isto

https://stackoverflow.com/questions/54559547/external-signing-pdf-with-itext

Não usei essa lib usei devexpress mas a muita gente a usar essa

Isto significa que não necessitamos dos certificados dados pelo credentials/info?

Apenas teremos de juntar ao PDF a hash dada pelo signatures/signHash?

Edited by Nel
Posted (edited)
On 10/27/2022 at 3:30 PM, laboss said:
  1. Geras o PDF sem assinatura
  2. Geras o Hash do PDF em SHA-256
    • Aqui tens de ter cuidado porque já tens de ter o container da assinatura no PDF, se não quando meteres o hash deles no PDF tb vais meter o container e já não fica válido
  3. Invocas o serviço para pedir autorização assinar
    • Aqui vais ter de enviar o hash gerado no passo 2
  4. O passo 3 devolve um SAD (Basicamente é um ID com a autorização)
  5. Invocas o serviço de assinatura com o SAD  e com os hash novamente
  6. O serviço vai-te devolver a assinatura do teu HASH que basicamente é um novo HASH
  7. Tens de colocar o HASH recebido embebido no PDF  (No container que criaste ao gerar o 1º HASH)

Traduzido:

  1. Hash PDF
  2. Chamar endpoint /v2/credentials/authorize com o hash do ponto 1
  3. Chamar endpoint /v2/signatures/signHash com o hash do ponto 1 + sad do ponto 2

O ponto 3. devolve isto (exemplo do Swagger):

{
  "signatures": [
    "IYvX1BRxWFV6uTUgYoeleKoToFM0c1A6vguAmtVaLDdaof9MaTtS7nIVEGR2aMwKZLrDwrhVv/GCdacdJYEpj7RinsW8UJ36Z/oAw7sigi8bnof4ScRgXJDzG4F63M91i//Vd49RHZxpFKjq/33xnSQf76KL8ypZ3Tr2bH4uF9IpVPWOMIvuwG8vS2c8KMwq7eDQTHKFRSWzTszdh88xvzjhi7C1dgHwPFsdmrsYneF0VgqG4Cq2Jt2gKV8+a4GpeLq8QE/ZQ2kWj4BLWkNG6tAoZdUSAXVxsvl2IOiZUz71tryhifnlXZB4I5GV0Htgnp1vzwue+uJOHIk+3Zvwx34nXkJ/zdTkDPEqGIeWdbDshukQOASPvAA/Qv24uRmCZ9EEVqxuHp6glrud9wobgSIGJUuFvWqHYl2IXyfcGUet+MLgk4pVU5siy91FdI16SdM/VSjldr8NCQHbxwM00cLXkSFDSXkP8igPlP2q3YIuV0g/MmWLAgBHSZU8fAWE",
    "PN85YMZS2O27ZrzcABwnoRCTxAhHqrPcgjzvP0zMHuwfBgrQcHj6GauDAo5XjT7IwrnY5hUdO2Hj6CMvTncAVZX9loZPjC3UsQdwGbiR1LIfrkDZwdbwMDqxpkYgueUaF00gAEZk/kl5MbaOtV3En5Mc8GYmWnG9L37yIhjelvCdEyhUXEVD6tzBuW+SXlP5C9NcrDugwGisSvsAzvv+ahjWeKmr9F3a5Wou0/2nUW6sB6vi6KqXuxqHPVBpgOgiQqJcE4qGA6W1pR0k7MRCIqlMCCfRSQiHIHxKu0+84M/djIIaTG3WzKL4HlBCmZFrToAA4+q5mbPujqWhFDWRmb1RPpnvY1R+vW6FWosAduODN4Rfg4+nPAuFbnRz1yW4fao0kUqUQWML5ItT9rFw2jBnODxwLFZyuouQH1WHbUznDvDoA6TKhwvpXHHdfPWlq659wyRLlJOQHWDuqgnByhTWvVz3Co9jmWyb+rHBT1M0h34WFIIrSIHyf9a4iXxJ"
  ]
}

O que é para fazer com o valor das signatures?

Edited by bioshock
Posted
On 11/9/2022 at 8:06 PM, Nel said:

Isto significa que não necessitamos dos certificados dados pelo credentials/info?

Apenas teremos de juntar ao PDF a hash dada pelo credentials/info?

A única coisa, pelo que percebo, que precisas do endpoint credentials/info é do valor do campo algo, pois precisas de enviar este valor no endpoint v2/signatures/signHash.

Posted

Percisas dos certificados para colocar dentro do PDF, eles só vão dar o hash assinado tens que embutir dentro do PDF o hash. O retorno do método signHash é apenas o hash que vais ter de colocar no PDF

https://stackoverflow.com/questions/65325998/external-signing-pdf-with-itextsharp-signdeferred-invalid-signature-problem

 

Eu crio as contas pelo software amanhã posso tentar ver os passos ao certo

Posted
On 11/9/2022 at 10:05 PM, laboss said:

Percisas dos certificados para colocar dentro do PDF, eles só vão dar o hash assinado tens que embutir dentro do PDF o hash. O retorno do método signHash é apenas o hash que vais ter de colocar no PDF

https://stackoverflow.com/questions/65325998/external-signing-pdf-with-itextsharp-signdeferred-invalid-signature-problem

Eu crio as contas pelo software amanhã posso tentar ver os passos ao certo

Tens razão, a documentação diz e cito:

Quote

(...) Neste passo, o Software de Faturação deve construir o documento assinado, juntando, ao documento original, a hash assinada do documento e os certificados obtidos no método credentials/info. Na construção do(s) documento(s) assinado(s) é recomendado que o Software de Faturação utilize LongTerm Validation (LTV)

Mas sabes-me responder ali à situação das assinaturas? Qual destas?

  1. É para pegar no valor do campo signatures, juntar-lhe o certificado e adicionar ao PDF
  2. É para pegar no valor do campo hash do ficheiro, juntar-lhe o certificado e adicionar ao PDF 

Pelo que consigo perceber, é para criar um certificado on-the-fly?

Posted (edited)
On 11/9/2022 at 10:31 PM, bioshock said:

Tens razão, a documentação diz e cito:

Mas sabes-me responder ali à situação das assinaturas? Qual destas?

  1. É para pegar no valor do campo signatures, juntar-lhe o certificado e adicionar ao PDF
  2. É para pegar no valor do campo hash do ficheiro, juntar-lhe o certificado e adicionar ao PDF 

Pelo que consigo perceber, é para criar um certificado on-the-fly?

A certificate chain é para juntares depois  ao documento. Não sei o que queres dizer com "on-the-fly" nesta situação, mas não vais criar nenhum certificado. Vais usar a chain.

O @laboos disse tudo lá em cima.

 

1 - Crias um container de assinatura vazio, e sacas o hash

2- Pegas no hash gerado acima, e fazes um pedido para a AMA para te assinar esse hash

3 - Juntas o hash assinado ao pdf

 

Para mim, esta foi uma das partes mais dificeis. Tive mesmo de bater com a cabeça, mas no fim, fica tudo mais claro.

No meu caso, eu crio um pdf temporário só para sacar o container vazio e depois crio outro com o pdf assinado final.  Tive de fazer assim, porque se usasse o mesmo pdf, dizia que o "documento estava corrompido".

Exemplo flow completo com conta:

1 - Abrir um janela com o url oauth

  

https://preprod.autenticacao.gov.pt/oauth/askauthorization?client_id=xpto&
redirect_uri=url_onde_vou_interceptar_o_access_token&
scope=http://interop.gov.pt/MDC/Cidadao/NomeProprio%20
http://interop.gov.pt/MDC/Cidadao/NIC%20
http://interop.gov.pt/MDC/Cidadao/DocType%20
http://interop.gov.pt/MDC/Cidadao/DocNumber%20
http://interop.gov.pt/MDC/Cidadao/NomeProprio%20
http://interop.gov.pt/MDC/Cidadao/NomeApelido%20
http://interop.gov.pt/MDC/Cidadao/DataValidade%20
http://interop.gov.pt/MDC/Cidadao/DataNascimento%20
http://interop.gov.pt/SAFE/createSignatureAccount?enterpriseNipc=500000000
	$enterpriseAdditionalInfo=Estabelecimento_avenida_xpto_lagos[isto é para um mesmo cidadão criar várias contas para o mesmo NIF, sendo a chave BI/passport + NIF +esta informação adicional ]
	$email=j.santos@itbase.pt
	$signaturesLimit=1000
	$creationClientName=clientTest
&response_type=token

 

 

2-  POST com o access token para https://preprod.autenticacao.gov.pt/oauthresourceserver/api/AttributeManager

[Esperar 15 seg]

3 - GET para https://preprod.autenticacao.gov.pt/oauthresourceserver/api/AttributeManager com o contextID (chamada anterior) +  access token e obter o bearer token e refresh token 

4 - POST https://pprsafe.autenticacao.gov.pt/credentials/list com o token do passo 3 (para obter o credentialID)

5 - POST https://pprsafe.autenticacao.gov.pt/credentials/info para obter  a chain de certificados

6 - POST https://pprsafe.autenticacao.gov.pt/v2/credentials/authorize para obter um "Ok, podes prosseguir" 

7 - GET https://pprsafe.autenticacao.gov.pt/credentials/authorize/verify com o processID do ponto 6 (Hoje, isto não te vai funcionar... Eles estão com problemas nestes novos métodos). Aqui recebes o SAD

8 - POST  https://pprsafe.autenticacao.gov.pt/v2/signatures/signHash para obter um "Ok, podes obter a assinatura".

9 -  https://pprsafe.autenticacao.gov.pt/signatures/signHash/verify com o processID do método anterior. Aqui é devolvida a hash assinada.

 

Penso que não me esqueci de nada.

 

PS: Vais chamar o signHash com o container vazio e é te retornado o hash assinado que irás colocar no pdf final.


 

 

 

 

Edited by zeph
  • Vote 1
  • Thanks 1
Posted
Em 10/11/2022 às 09:00, zeph disse:

A certificate chain é para juntares depois  ao documento. Não sei o que queres dizer com "on-the-fly" nesta situação, mas não vais criar nenhum certificado. Vais usar a chain.

O @laboos disse tudo lá em cima.

 

1 - Crias um container de assinatura vazio, e sacas o hash

2- Pegas no hash gerado acima, e fazes um pedido para a AMA para te assinar esse hash

3 - Juntas o hash assinado ao pdf

 

Para mim, esta foi uma das partes mais dificeis. Tive mesmo de bater com a cabeça, mas no fim, fica tudo mais claro.

No meu caso, eu crio um pdf temporário só para sacar o container vazio e depois crio outro com o pdf assinado final.  Tive de fazer assim, porque se usasse o mesmo pdf, dizia que o "documento estava corrompido".

 

 

 

 

Exatamente o que eu fiz é mesmo isso. Para a criação de conta faço assim:

  1. Chamada ao URL de autenticação com os respetivos scopes
    • Recebo o token de auth
  2. Espero 15 segundos (muito importante)
  3. Recolho os dados na conta no endpoint OAuthResourceServer/Api/AttributeManager
  4. Espero 2 segundos (se não fizer isto 80% das vezes não são retornados os dados)
  5. Recolho os dados da conta no endpoint OAuthResourceServer/Api/AttributeManager?token={Token}&authenticationContextId={authenticationContextId}
  6. Se não receber dados tento 5 vezes desde o passo 2
  • Thanks 1
Posted
Em 10/11/2022 às 09:44, zeph disse:

@laboss, Já agora, adicionaste LTV aos documentos? Se sim, que provider usaste?

 

Alguém esta a implementar um PHP?

Quando vcs falam em "1 - Crias um container de assinatura vazio, e sacas o hash", em que consiste mesmo isto? 

Posted

Sim adicionei.

 

Usei este: http://timestamp.entrust.net/TSS/RFC3161sha2TS

Mas encontrei estes quando andei a pesquisar.

            //TSAServer = "http://aatl-timestamp.globalsign.com/tsa/aohfewat2389535fnasgnlg5m23";
            //TSAServer = "http://tsa.quovadisglobal.com/TSS/HttpTspServer";
            //TSAServer = "http://timestamp.entrust.net/TSS/RFC3161sha2TS";
            //TSAServer = "https://freetsa.org/tsr"
            //TSAServer = "http://ts.cartaodecidadao.pt/tsa/server"

  • Vote 2
Posted
On 11/10/2022 at 10:19 AM, laboss said:

Sim adicionei.

 

Usei este: http://timestamp.entrust.net/TSS/RFC3161sha2TS

Mas encontrei estes quando andei a pesquisar.

            //TSAServer = "http://aatl-timestamp.globalsign.com/tsa/aohfewat2389535fnasgnlg5m23";
            //TSAServer = "http://tsa.quovadisglobal.com/TSS/HttpTspServer";
            //TSAServer = "http://timestamp.entrust.net/TSS/RFC3161sha2TS";
            //TSAServer = "https://freetsa.org/tsr"
            //TSAServer = "http://ts.cartaodecidadao.pt/tsa/server"

Mas esses tsa's são free? E se forem down ? 😛

Posted

São free, se forem down fica sem LTV, a do cartão do cidadão tem uns limites estúpidos

 

Serviço de Selos Temporais: Configurar um serviço de selos temporais personalizado.

A aplicação permite seleccionar uma servidor diferente para a obtenção de selos temporais, uma vez que o servidor por defeito do Cartão do Cidadão (http://ts.cartaodecidadao.pt/tsa/server) tem um limite máximo de 20 pedidos em cada período de 20 minutos que se podem efectuar. Se este valor for excedido o serviço será bloqueado durante 24 horas, sem prejuízo de outras consequências em caso de repetição de situações de bloqueio. (para mais informações sobre o serviço de selo temporal/timestamps do Cartão do Cidadão, consulte a página https://pki.cartaodecidadao.pt).

in https://amagovpt.github.io/docs.autenticacao.gov/user_manual.html

  • Vote 1
Posted (edited)
On 11/10/2022 at 9:00 AM, zeph said:

1 - Crias um container de assinatura vazio, e sacas o hash

2- Pegas no hash gerado acima, e fazes um pedido para a AMA para te assinar esse hash

3 - Juntas o hash assinado ao pdf

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

On 11/10/2022 at 9:00 AM, zeph said:

7 - GET https://pprsafe.autenticacao.gov.pt/credentials/authorize/verify com o processID do ponto 6 (Hoje, isto não te vai funcionar... Eles estão com problemas nestes novos métodos). Aqui recebes o SAD

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
On 11/10/2022 at 10:13 AM, Nel said:

Alguém esta a implementar um PHP?

Quando vcs falam em "1 - Crias um container de assinatura vazio, e sacas o hash", em que consiste mesmo isto? 

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.

Edited by bioshock
Posted (edited)
On 11/10/2022 at 12:58 PM, bioshock said:

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.

Esses métodos v2 não funcionam.. Estão a devolver o status 500. Já falei com eles desde que lançaram esses novos métodos e ainda estão a aguardar resolução.

Não sei se já lançaram para produção.

 

O que podes fazer para testar, é usar os antigos (deprecados): /credentials/authorize e /signatures/signHash, respectivamente.  Estes em principio, vão funcionar até Junho de 2023

Edited by zeph

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.