Jump to content
cjulio

Utilizar Webservices da AT

Recommended Posts

Javier Vila

Olá
Eu não posso fazer isso funcionar. Estou usando o Keystore Explorer
Eu adicionei as cadeias de certificados de "Editar cadeia de certificados". Eles são os 2 pem que deixaram ontem na DIGITA. Então adicionei os arquivos 3 pem do portalfinanzas de "import trusted certificate". Eu queimo o pfx e não funciona, ainda não funciona. Estou usando um aplicativo no .NET que sempre funcionou. O que estou fazendo de errado? Estou seguindo as etapas indicadas, mas do Keystore Explorer ....

Share this post


Link to post
Share on other sites
desconfiado
19 horas atrás, ei99045 disse:

Sim, é isso. A solução que mantenho também sempre funcionou sem alterações em todas as trocas de certificado da AT, excepto esta.

A mesma coisa comigo. Nunca tive que alterar nada nas alterações ou renovações de certificado do portal da AT. Desta vez não funciona. Parece-me problema do portal.

Até porque o certificado que foi alterado/renovado é o certificado do dominio *.portaldasfinancas.pt que é o certificado usado no SSL do portal para permitir acesso seguro via HTTPS. Não deveria afectar nada na comunicação dos webservices.

Share this post


Link to post
Share on other sites
rukako

Estou a criar o request assim(VB.NET):

ServiceAction = https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/  

fileName = X:\599999999.PFX (certificado pedido à AT)  

password = xxxxxx

 

Dim request As HttpWebRequest = DirectCast(WebRequest.Create(requestUriString), HttpWebRequest)

request.Headers.Add("SOAPAction", ServiceAction)

Dim certificate As New X509Certificate2

certificate.Import(fileName, password, X509KeyStorageFlags.DefaultKeySet)

request.ClientCertificates.Add(certificate)

request.Method = "POST"

request.ContentType = "text/xml; charset=utf-8"

request.Accept = "text/xml"

 

Extrai do DGITA_Issuing_CA2.pen em dois ficheiros tal como as instruções do ei99045.

Depois, abri o .pfx no KeyStore Explorer  e "Edit Certificate Chain" > "Append Certificado" a adicionei o primeiro pen extraído anteriormente e de seguida o segundo.

E continuo com o mesmo erro :( The underlying connection was closed

Share this post


Link to post
Share on other sites
rukako
29 minutos atrás, joaosraposo disse:

Boa tarde a todos,

Do nosso lado estamos a utilizar o soap client em PHP e a solução que encontrámos passou pela combinação dos seguintes três certificados:

  • .pem do cliente (599999999.pem)
  • DGITA_Issuing_CA2.pem
  • portaldasfinancasgovpt.pem 

Combinámos os três certificados realizando o copy/past dos certificados DGITA_Issuing_CA2.pem e portaldasfinancasgovpt.pem para dentro do ficheiro .pem do cliente (599999999.pem).


Utilizando o ficheiro 599999999.pem, com os três certificados combinados passámos a comunicar com sucesso.

Obrigado à todos ( @ei99045 , @Nuno Silva , @Sergio. , @João Januário, @jorang e outros) com as vossas várias contribuições que nos ajudaram a encontrar a solução.

 

Onde esta o portaldasfinancasgovpt.pem ?

Share this post


Link to post
Share on other sites
Nuno Silva (@si27645)
5 minutes ago, rukako said:

Onde esta o portaldasfinancasgovpt.pem ?

Na email da AT ;)

Share this post


Link to post
Share on other sites
joaosraposo
9 minutos atrás, rukako disse:

Onde esta o portaldasfinancasgovpt.pem ?

Recebemos esse certificado na sexta feira da parte da tarde.

 

Entretanto editei a minha resposta anterior para incluir essa informação.

Edited by joaosraposo

Share this post


Link to post
Share on other sites
Nuno Silva (@si27645)
1 hour ago, rukako said:

Estou a criar o request assim(VB.NET):

ServiceAction = https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/  

fileName = X:\599999999.PFX (certificado pedido à AT)  

password = xxxxxx

 

Dim request As HttpWebRequest = DirectCast(WebRequest.Create(requestUriString), HttpWebRequest)

request.Headers.Add("SOAPAction", ServiceAction)

Dim certificate As New X509Certificate2

certificate.Import(fileName, password, X509KeyStorageFlags.DefaultKeySet)

request.ClientCertificates.Add(certificate)

request.Method = "POST"

request.ContentType = "text/xml; charset=utf-8"

request.Accept = "text/xml"

 

Extrai do DGITA_Issuing_CA2.pen em dois ficheiros tal como as instruções do ei99045.

Depois, abri o .pfx no KeyStore Explorer  e "Edit Certificate Chain" > "Append Certificado" a adicionei o primeiro pen extraído anteriormente e de seguida o segundo.

E continuo com o mesmo erro :( The underlying connection was closed

Boas,

 

Não devias, .net, faz o seguinte, instala os dois Ca e o certificado de autenticação no windows e faz a chamada com a app como estava, é suposto funcionar, se tens dúvidas se estão bem instalados abre no browser o endpoint de produção, é suposto teres um erro 500 mas tens de conseguir a ligação SSL, aqui garantes os Ca's e o certificado de autenticação.

Nuno Silva

Share this post


Link to post
Share on other sites
rukako
1 minuto atrás, joaosraposo disse:

Recebemos esse certificado na sexta feira da parte da tarde.

 

Entretanto editei a minha resposta para incluir essa informação.

Pois eu recebi dois emails mas nenhum tinha anexo. Sera possivel alguem parrilhar?

Share this post


Link to post
Share on other sites
arkanoid

Já agora, precisei também de acrescentar à firewall acesso a:

crt.usertrust.com

Bem haja a esta comunidade!

Share this post


Link to post
Share on other sites
Jose Guerreiro
32 minutos atrás, Nuno Silva (@si27645) disse:

Boas,

 

Não devias, .net, faz o seguinte, instala os dois Ca e o certificado de autenticação no windows e faz a chamada com a app como estava, é suposto funcionar, se tens dúvidas se estão bem instalados abre no browser o endpoint de produção, é suposto teres um erro 500 mas tens de conseguir a ligação SSL, aqui garantes os Ca's e o certificado de autenticação.

Nuno Silva

Nuno,

Pode facultar quais são os dois CA e qual o certificado de autenticação no windows?

Obrigado..

 

Share this post


Link to post
Share on other sites
josevcosta
1 hora atrás, joaosraposo disse:

Boa tarde a todos,

Do nosso lado estamos a utilizar o soap client em PHP e a solução que encontrámos passou pela combinação dos seguintes três certificados:

  • .pem do cliente (599999999.pem)
  • DGITA_Issuing_CA2.pem
  • portaldasfinancasgovpt.pem

Combinámos os três certificados realizando o copy/past dos certificados DGITA_Issuing_CA2.pem e portaldasfinancasgovpt.pem para dentro do ficheiro .pem do cliente (599999999.pem).


Utilizando o ficheiro 599999999.pem, com os três certificados combinados passámos a comunicar com sucesso.

 

Obrigado à todos ( @ei99045 , @Nuno Silva , @Sergio. , @João Januário, @jorang e outros) com as vossas várias contribuições que nos ajudaram a encontrar a solução.

 

Nota: No seguinte link podem aceder aos dois ficheiros pem que refiro acima (https://drive.google.com/drive/folders/1maTSqtDWcoAYjHcFBUGJYRpiJbrmpTcg?usp=sharing)

João

A tua explicação ajudou-me a perceber o que me faltava para ter o meu curl a funcionar.

Obrigado.

  • Vote 1

Share this post


Link to post
Share on other sites
Nuno Bagulho Marques
5 horas atrás, desconfiado disse:

O que estão a sugerir é alterar o certificado que a ASI enviou quando efectuamos o pedido. Mas segundo o email deles esse certificado não sofre alteração.

E porque é que, segundo eles, a alteração do certificado deles foi concluída na 5ºf e os problemas só começaram na 6ºf?

Eu ainda acho que o problema está do lado deles e como é fim de semana não têm ninguém de plantão para resolver o problema.

Mas claro, 2ºf vai ser bonito. Os clientes todos a ligarem porque a comunicação não está a funcionar e a culpa é sempre do nosso software.

 

Boa noite

Tenho acompanhado esta discussão, com toda a atenção e parece-me o seguinte: 

quem já teve essa experiência sabe que quando implementamos uma ligação segura (SSL) temos de mencionar o certificado que nos foi atribuído e a cadeia de certificação. portanto, eu acho que a AT vai detetar essa falha e corrigir. ou então, deve documentar quais os novos procedimentos. Eu voltei a disponibilizar, no meu software, a criação de um ficheiro SAF-T para comunicar à AT. Só irei fazer alterações depois de uma tomada de posição da AT.

Share this post


Link to post
Share on other sites
iSilva
36 minutes ago, Nuno Bagulho Marques said:

Boa noite

Tenho acompanhado esta discussão, com toda a atenção e parece-me o seguinte: 

quem já teve essa experiência sabe que quando implementamos uma ligação segura (SSL) temos de mencionar o certificado que nos foi atribuído e a cadeia de certificação. portanto, eu acho que a AT vai detetar essa falha e corrigir. ou então, deve documentar quais os novos procedimentos. Eu voltei a disponibilizar, no meu software, a criação de um ficheiro SAF-T para comunicar à AT. Só irei fazer alterações depois de uma tomada de posição da AT.

Acompanho a tua lógica ;)

Share this post


Link to post
Share on other sites
Nuno Silva (@si27645)
3 minutes ago, Nuno Bagulho Marques said:

Olá

Decidi tentar essa abordagem e fiz a combinação dos PEM

Obtenho o mesmo resultado

 NSS error -8179 (SEC_ERROR_UNKNOWN_ISSUER)
* Peer's Certificate issuer is not recognized.

Há alguma ordem para combinar os PEM? pareceu-me tudo correto.

.net ou java?

Consegues motrar o resultado do debug com o openssl?

Exemplo:

https://stackoverflow.com/questions/17203562/openssl-s-client-cert-proving-a-client-certificate-was-sent-to-the-server

 

Share this post


Link to post
Share on other sites
bioshock

Pessoal do PHP, já tenho a funcionar tanto em SOAP como cURL, seguindo as sugestões aqui da malta. A versão em SOAP é positiva para quem estiver com problemas no cURL com o erro PR_END_OF_FILE_ERROR.

Tenho neste momento um servidor a funcionar com cURL e outro com SOAP.

Para versão do cURL aceder aqui: https://www.portugal-a-programar.pt/forums/topic/57734-utilizar-webservices-da-at/?do=findComment&comment=615478
Versão SOAP:

ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
ini_set('default_socket_timeout', 5);

/*
 * Para fazerem download do ficheiro 'documentosTransporte.wsdl':
 *
 * 1) Aceder https://faturas.portaldasfinancas.gov.pt/
 * 2) Entrar na área "Produtores de Software" 
 * 3) Entrar na área "Testar Webservice"
 * 4) Clicar em "Obter WSDL" na linha "Documentos de Transporte"
 */
$wsdl 	= 'documentosTransporte.wsdl';
$action = 'https://servicos.portaldasfinancas.gov.pt:401/sgdtws/documentosTransporte';
/*
 * Juntar o conteúdo de 3 ficheiros .PEM no mesmo ficheiro, seguindo esta ordem:
 * 
 * EmpresaAutora.pem 
 * DGITA_Issuing_CA2.pem 
 * portaldasfinancasgovpt.pem 
 */
$pem	= 'EmpresaAutoraCombined.pem';
$xml 	= '<?xml version="1.0" encoding="utf-8" standalone="no"?> ...';

$client = new SoapClient($wsdl, array
(
	'local_cert' 			=> $pem,
	'trace'					=> TRUE,
	'encoding'				=> 'utf-8',
	'soap_version' 			=> SOAP_1_2,
	'stream_context'		=> stream_context_create(['ssl' => ['verify_peer' => false, 'verify_peer_name' => false]])
));

$result = $client->__doRequest($xml, $action, 'documentoTransporte', 2, 0);	

 

  • Vote 1

Share this post


Link to post
Share on other sites
marcolopes

Querem saber a melhor? nos emails enviados pela AT, é digo o seguinte:

Quote

Para tal a AT irá alterar amanhã durante manhã o certificado SSL nos portos de testes (700, 701,702,705 e 709 ) para que cada produtor de software possa testar a continuidade do funcionamento dos seus produtos, contendo já estes endereços o novo certificado SSL.

Recomendamos que se valide a cadeia de certificação, conforme o exemplo indicado no “Código Fonte da aplicação em Java Applet, o qual pode ser obtido através da ligação: https://faturas.portaldasfinancas.gov.pt/testarLigacaoWebService.action

3 inconsistências!!!

1) Se a plataforma de testes foi actualizada, e o método usado até agora funciona (pela minha parte funciona com um PERMISSIVE TRUST STORE), presumo que a plataforma de PRODUÇÃO tenha de reagir da mesma forma! (o que não está a contecer segundo diversos relatos aqui no tópico)

2) O Código Fonte da aplicação em Java Applet mais recente (FACTEMIPFCLI-1.7.5-0037) NEM SEQUER inicializa uma TRUST STORE!!! Nem "permissive" nem nada que se pareça!!! (código para Facturas e Transportes)

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, "TESTEwebservice".toCharArray());

        SSLContext sslContext = SSLContext.getInstance("TLS");
        
        // adicionar um Trust Store que aceita ligacao SSl sem validar o certificado
//        sslContext.init(kmf.getKeyManagers(), new TrustManager[] {new PermissiveTrustStore()}, null);
        
    	sslContext.init(kmf.getKeyManagers(), null, null);

3) USANDO o código da AT, o sistema nem sequer comunica!

E agora? Em que ficamos?

Que salgalhada de todo o tamanho!!!!

Edited by marcolopes
  • Vote 1

The simplest explanation is usually the correct one

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

Share this post


Link to post
Share on other sites
Nuno Silva (@si27645)
12 minutes ago, marcolopes said:

Querem saber a melhor? nos emails enviados pela AT, é digo o seguinte:

3 inconsistências!!!

1) Se a plataforma de testes foi actualizada, e o método usado até agora funciona (pela minha parte funciona com um PERMISSIVE TRUST STORE), presumo que a plataforma de PRODUÇÃO tenha de reagir da mesma forma! (o que não está a contecer segundo diversos relatos aqui no tópico)

2) O Código Fonte da aplicação em Java Applet mais recente (FACTEMIPFCLI-1.7.5-0037) NEM SEQUER inicializa uma TRUST STORE!!! Nem "permissive" nem nada que se pareça!!! (código para Facturas e Transportes)


        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, "TESTEwebservice".toCharArray());

        SSLContext sslContext = SSLContext.getInstance("TLS");
        
        // adicionar um Trust Store que aceita ligacao SSl sem validar o certificado
//        sslContext.init(kmf.getKeyManagers(), new TrustManager[] {new PermissiveTrustStore()}, null);
        
    	sslContext.init(kmf.getKeyManagers(), null, null);

3) USANDO o código da AT, o sistema nem sequer comunica!

E agora? Em que ficamos?

Que salgalhada de todo o tamanho!!!!

Faz sentido, mas a pergunta aqui é:

queres aplicar o Workaround como lhe chamaste ou vai mesmo esperar pela AT, ou podes?

 

Share this post


Link to post
Share on other sites
marcolopes
1 minute ago, Nuno Silva (@si27645) said:

Faz sentido, mas a pergunta aqui é:

queres aplicar o Workaround como lhe chamaste ou vai mesmo esperar pela AT, ou podes?

 

o meu "workaround" será aplicar uma TRUST STORE com o CERTIFICADO enviado pela AT (portaldasfinancasgovpt.crt)

Funciona em testes! Mas com uma permissive TRUST STORE também funciona (portanto, não quer dizer grande coisa!)

				// indica um conjunto de certificados confiaveis para estabelecer a ligacao SSL
				TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
				tmf.init(tsCertificate.getKeyStore());
				sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

agora, embrulhar no certificado do PRODUTOR de SW, o certificado enviado (portaldasfinancasgovpt.crt) juntamente com outro que nem sequer sei onde o foram desenterrar, neste momento, não...

  • Vote 1

The simplest explanation is usually the correct one

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

Share this post


Link to post
Share on other sites
Nuno Silva (@si27645)
2 minutes ago, marcolopes said:

o meu "workaround" será aplicar uma TRUST STORE com o CERTIFICADO enviado pela AT (portaldasfinancasgovpt.crt)

Funciona em testes! Mas com uma permissive TRUST STORE também funciona (portanto, não quer dizer grande coisa!)


				// indica um conjunto de certificados confiaveis para estabelecer a ligacao SSL
				TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
				tmf.init(tsCertificate.getKeyStore());
				sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

agora, embrulhar no certificado do PRODUTOR de SW, o certificado enviado (portaldasfinancasgovpt.crt) juntamente com outro que nem sequer sei onde o foram desenterrar, neste momento, não...

O endpoint de testes funciona mesmo com o código antigo, com bypass ou trustStore.

Por isso n é exemplo nem pode ser considerado como padrão e foi o erro 1 da AT.

Se é assim, conta como correu amanhã.

 

Boa sorte com isso 

Edited by Nuno Silva (@si27645)

Share this post


Link to post
Share on other sites
marcolopes
6 minutes ago, Nuno Silva (@si27645) said:

O endpoint de testes funciona mesmo com o código antigo, com bypass ou trustStore.

Por isso n é exemplo nem pode ser considerado como padrão e foi o erro 1 da AT.

Se é assim, conta como correu amanhã.

 

Boa sorte com isso 

sim... mas quando o próprio CÓDIGO que AT indica como exemplo de IMPLEMENTAÇÃO nem sequer funciona, algo vai muito mal...


The simplest explanation is usually the correct one

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

Share this post


Link to post
Share on other sites
CrominhO
1 hora atrás, Nuno Silva (@si27645) disse:

(...)

Se é assim, conta como correu amanhã.

 

Boa sorte com isso 

@Nuno Silva (@si27645) em primeiro lugar não é amanhã, é hoje, porque alguns de nós têm clientes que trabalham ao Fim de semana, 

em 2º lugar, eu sei que o @marcolopes é rígido, mas ele tem razão. Podes dar as voltas que quiseres, ele tem razão

Andamos TODOS a fazer Corte e Costura,  quando é a AT que está mal. Mais, com este corte e costura, grande parte de nós tem o sistema a funcionar e não fez o mais importante, reclamar junto da AT que a cadeia não está a funcionar, então como irão eles arranjar ??? 

A menos que aches normal andar a fazer Copy Paste de chaves e certificados que nem sequer aparece no manual técnico???  

Edited by CrominhO
  • Vote 1

As mentes humanas são realmente um local estranho!

Share this post


Link to post
Share on other sites
jj87
5 horas atrás, joaosraposo disse:

Boa tarde a todos,

Do nosso lado estamos a utilizar o soap client em PHP e a solução que encontrámos passou pela combinação dos seguintes três certificados:

  • .pem do cliente (599999999.pem)
  • DGITA_Issuing_CA2.pem
  • portaldasfinancasgovpt.pem

Combinámos os três certificados realizando o copy/past dos certificados DGITA_Issuing_CA2.pem e portaldasfinancasgovpt.pem para dentro do ficheiro .pem do cliente (599999999.pem).


Utilizando o ficheiro 599999999.pem, com os três certificados combinados passámos a comunicar com sucesso.

 

Obrigado à todos ( @ei99045 , @Nuno Silva , @Sergio. , @João Januário, @jorang e outros) com as vossas várias contribuições que nos ajudaram a encontrar a solução.

 

Nota: No seguinte link podem aceder aos dois ficheiros pem que refiro acima (https://drive.google.com/drive/folders/1maTSqtDWcoAYjHcFBUGJYRpiJbrmpTcg?usp=sharing)

Obrigado, esta solução funcionou.

Num editor de texto, juntei ao meu certificado (meuNIF.cer que está em ASCII base64) os ficheiros 

  • DGITA_Issuing_CA2.pem
  • portaldasfinancasgovpt.pem 

E depois gerei outro pfx:

openssl pkcs12 -export -in meuNIF.cer -inkey meuNIF.key -out meuNIF.pfx

 

Share this post


Link to post
Share on other sites
Javier Vila

Olá
Eu sou a uncia persiona que permanece que não funciona? Meu aplicativo é .NET e tenho um PFX com a cadeia de certificação. E eu não posso fazer isso funcionar, nem por meus meios nem pelo que eu li neste magnífico fórum. Tem alguém na minha situação e você pode me ajudar?

Share this post


Link to post
Share on other sites
desconfiado

Eu já enviei um email aos tipos da ASI. Enviar coisas pelo eBalcão é anedota.

Vou aguardar que digam alguma coisa ou corrijam o problema.

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.