Jump to content
cjulio

Utilizar Webservices da AT

Recommended Posts

Nuno Silva
21 hours ago, marcolopes said:

Eu acho que não deviamos misturar alhos com bugalhos...

Exportei o CER para uma KEYSTORE e adicionei-a a uma TRUST STORE de validação no código...  Não mexi no certificado do produtor (PFX)

para já passa em testes...

Sim, é o que faz sentido, mas no meu caso n estava a funcionar.

Basicamente a entidade que me pede ajuda tem os SO's em versões antigas e ando sempre na luta com versões, neste momento está a correr em 1.6, podia ser pior, depois partilha aqui os teus resultados.

 

 

Reflectindo sobre isto na realidade este ajuste não é assim tão errado.

Quando usamos um certificado devemos garantir que é identificável e que o root ca é válido.

Agora porque deixaram de ter os ca's do lado deles n sei.

 

Para quem anda às cabeçadas, o teste básico e não tem tempo para meias medidas, que instale os ca's no PC que está a enviar. Irá funcionar mas é uma martelada ao nível do Thor

Edited by Nuno Silva

Share this post


Link to post
Share on other sites
Nuno Silva
4 minutes ago, Silva Gomes said:

Boas, 
queria gerir isto a baixo, mas dentro do java... podes ajudar?



 

"inserir estes certificados no pfx do cliente que é usado para se autenticar no serviço" -> é correr o comando seguinte para os dois ficheiros produzidos no passo anterior, substituindo os caminhos e password da keystore do certificado cliente.
keytool -importcert -noprompt -alias DGITA_Issuing_CA21 -file /path/to/DGITA_Issuing_CA2.pem.1 -keystore ClientCertificate-prod.p12 -storepass <password keystore>
keytool -importcert -noprompt -alias DGITA_Issuing_CA22 -file /path/to/DGITA_Issuing_CA2.pem.2 -keystore ClientCertificate-prod.p12 -storepass <password keystore>

"Usar o truststore com os novos certificados e ficou a funcionar." -> é adicionar os certificados à truststore cacerts da JVM que estiver a ser usado, por exemplo assim:

keytool -import -alias portaldasfinancas1 -keystore /path/to/jre/lib/security/cacerts -file /path/to/portaldasfinancas1.der
keytool -import -alias portaldasfinancas1 -keystore /path/to/jre/lib/security/cacerts -file /path/to/portaldasfinancas2.der
keytool -import -alias portaldasfinancas1 -keystore /path/to/jre/lib/security/cacerts -file /path/to/portaldasfinancas3.der

 

 

Boas, fiquei perdido,

isto são operações para prepares o trutStore e o PFX, podes partilhar parte do código onde inicias o SSL?

Basicamente se estiveres a usar o trustStore só tens de o atualizar e não precisas de mexer no código.

Share this post


Link to post
Share on other sites
Silva Gomes
3 minutos atrás, Nuno Silva disse:

Boas, fiquei perdido,

isto são operações para prepares o trutStore e o PFX, podes partilhar parte do código onde inicias o SSL?

Basicamente se estiveres a usar o trustStore só tens de o atualizar e não precisas de mexer no código.

Olá,

tenho assim:
KeyStore ks = KeyStore.getInstance("pkcs12"); 

InputStream input = this.getClass().getClassLoader().getResource(this.certName).openStream(); ks.load(input, this.certPass.toCharArray());

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

SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new PermissiveTrustStore()}, null);

Share this post


Link to post
Share on other sites
marcolopes
Just now, Silva Gomes said:

Olá,

tenho assim:
KeyStore ks = KeyStore.getInstance("pkcs12"); 

InputStream input = this.getClass().getClassLoader().getResource(this.certName).openStream(); ks.load(input, this.certPass.toCharArray());

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

SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new PermissiveTrustStore()}, null);

A mim não funciona, porque eu importo para a KEYSTORE com um ALIAS... mas tenho classes feitas por mim para gerir KEYSTORE, portanto, sem stress...

keytool -importcert -noprompt -alias "portaldasfinancas" -file portaldasfinancasgovpt.crt -keystore TrustStoreAT.jks -storepass 123456

 


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
58 minutes ago, Silva Gomes said:

Olá,

tenho assim:
KeyStore ks = KeyStore.getInstance("pkcs12"); 

InputStream input = this.getClass().getClassLoader().getResource(this.certName).openStream(); ks.load(input, this.certPass.toCharArray());

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

SSLContext sslContext = SSLContext.getInstance("TLSv1");
sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new PermissiveTrustStore()}, null);

Ok, faz sentido,

 

Tive de mudar de 

sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new PermissiveTrustStore()}, null);

Para

 KeyStore Ss = KeyStore.getInstance("JKS");

Ss.load ((this.getClass().getClassLoader().getResourceAsStream("truststore")),pwd.toCharArray());
 TrustManagerFactory TS = TrustManagerFactory.getInstance("SunX509");
  TS.init(Ss);
  sslContext.init(KSM.getKeyManagers(),TS.getTrustManagers(), null);

 

Mudas de bypass para usares a trustStore.

 

Vê se faz sentido

 

 

Não consigo responder a mensagens tb.

si27645@protonmail.com

Edited by Nuno Silva
  • Vote 1

Share this post


Link to post
Share on other sites
ei99045
38 minutos atrás, pmmachado disse:

Uma questão:

Para gerar "nosso" certificado utilizamos o comando

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

para criar o .pfx que vamos utilizar na autenticação. Julgo que esse certificado não tem a cadeia completa no certificado.

O que estás a dizer  é inserir os certificados da cadeia completa no "nosso" certificado e depois utilizar esse para autenticação?

Tenho uma solução desenvolvida em .net desde 2013 que até sexta sempre funcionou, mesmo nos outros anos em que a AT alterou o certificado ... e neste momento nada comunica.

Abc

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

Share this post


Link to post
Share on other sites
marcolopes
17 minutes ago, Nuno Silva said:

Ok, faz sentido,

 

Tive de mudar de 

sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new PermissiveTrustStore()}, null);

Para

 KeyStore Ss = KeyStore.getInstance("JKS");

Ss.load ((this.getClass().getClassLoader().getResourceAsStream("truststore")),pwd.toCharArray());
 TrustManagerFactory TS = TrustManagerFactory.getInstance("SunX509");
  TS.init(Ss);
  sslContext.init(KSM.getKeyManagers(),TS.getTrustManagers(), null);

Mudas de bypass para usares a trustStore.

Vê se faz sentido

Exacto... mas isso sem misturar nada no PFX do produtor, certo??

alterei o código para lidar com ambas as situações... se calhar o código antigo até funciona... mas pelo sim pelo não, está pronto para testes na segunda-feira.

			// Coloca o SSL socket factory no request context da ligacao a efetuar ao webservice
			KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
			kmf.init(swCertificate.getKeyStore(), swCertificate.password.toCharArray());

			SSLContext sslContext = SSLContext.getInstance("TLSv1"); // JAVA8 usa TLSv2
			if (tsCertificate==null){
				// adiciona um Trust Store que aceita ligacao SSL sem validar o certificado
				sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new PermissiveTrustStore()}, null);
			}else{
				// 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);
			}

 


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
18 minutes ago, marcolopes said:

Exacto... mas isso sem misturar nada no PFX do produtor, certo??

alterei o código para lidar com ambas as situações... se calhar o código antigo até funciona... mas pelo sim pelo não, está pronto para testes na segunda-feira.


			// Coloca o SSL socket factory no request context da ligacao a efetuar ao webservice
			KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
			kmf.init(swCertificate.getKeyStore(), swCertificate.password.toCharArray());

			SSLContext sslContext = SSLContext.getInstance("TLSv1"); // JAVA8 usa TLSv2
			if (tsCertificate==null){
				// adiciona um Trust Store que aceita ligacao SSL sem validar o certificado
				sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new PermissiveTrustStore()}, null);
			}else{
				// 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);
			}

 

Não, Isto foi o que tentei no início, e depois perdi n tempo a perceber onde estava o meu problema.

Parei e pensei no cenário mais estúpido para explicar porque o certificado n estava a ser aceite na autenticação do lado deles, e foi tipo, será que removeram os Ca's do lado deles...

Por mais ridículo que pareça só funcionou depois de adicionar a cadeia completa ao Pfx.

Mas confirma, posso ter feito asneira :)

 

Por hj acabou :) " You have reached the maximum number of posts you can make per day."

 

TB n posso responder a Pm's, se for mesmo preciso si27645 protonmail :)

Edited by Nuno Silva
You have reached your posting limits. Please wait 24 hours and try again.

Share this post


Link to post
Share on other sites
Silva Gomes
28 minutos atrás, Nuno Silva disse:

Ok, faz sentido,

 

Tive de mudar de 

sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new PermissiveTrustStore()}, null);

Para

 KeyStore Ss = KeyStore.getInstance("JKS");

Ss.load ((this.getClass().getClassLoader().getResourceAsStream("truststore")),pwd.toCharArray());
 TrustManagerFactory TS = TrustManagerFactory.getInstance("SunX509");
  TS.init(Ss);
  sslContext.init(KSM.getKeyManagers(),TS.getTrustManagers(), null);

 

Mudas de bypass para usares a trustStore.

 

Vê se faz sentido

Olá Nuno, 

faz sentido.

Não posso fazer referencia dos certificados por aqui?

KeyStore Ss = KeyStore.getInstance("JKS");
Ss.setCertificateEntry();

 

Edited by Silva Gomes

Share this post


Link to post
Share on other sites
marcolopes
Just now, Nuno Silva said:

Não, Isto foi o que tentei no início, e depois perdi n tempo a perceber onde estava o meu problema.

Parei e pensei no cenário mais estúpido para explicar porque o certificado n estava a ser aceite na autenticação do lado deles, e foi tipo, será que removeram os Ca's do lado deles...

Por mais ridículo que pareça só funcionou depois de adicionar a cadeia completa ao Pfx.

Mas confirma, posso ter feito asneira :)

:\\\\\\ Isso é mais um "workaround" para um problema do lado da AT... não vou por aí... logo vejo no que isto vai dar...


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
Smig

Também já pus o meu funcionar com a mistura parva de certificados. Fica assim para segunda e depois vejo se há outra forma de fazer isto. 

Obrigado pelas pistas! É sempre divertido fazer serão no fim de semana por causa de uma partida da AT. Esses rapazes são muito brincalhões 😃

Share this post


Link to post
Share on other sites
CrominhO
Em 20/07/2019 às 01:19, CrominhO disse:

Pessoal o Certificado enviado ontem tem metade do tamanho do de 2018, alguem me confirma por favor? Acho que falta uma assinatura no Certificado. 

 

PS: ainda alguns dizem que a AT desenvolver uma APP não tem impacto nos Softwares.... Eles se trocarem uma chave, deixam logo aqui 30 ou 40 SHs a miar como eu e vocês, se alterarem no "deles", só o deles funciona.... LOL espero que a ERC pelo menos uma vez na vida faça algo de jeito 😕 

http://www.portugal-heat.com/at/certificados.jpg

https://www.xolphin.com/support/FAQ/Transition_from_Comodo_CA_to_Sectigo 

Brutal 😕 

Ontem (hoje de madrugada) quando comecei a mexer nisto, perguntei se podiam confirmar os Certificados, que o ultimo tinha metade do tamanho do anterior.

Agora já li que pessoal fez debug no openssl e que o certificado não estava correcto 😕 ... E se amanhã (segunda feira) a AT, por acaso, assim como quem não quer a coisa, disser que de facto o Certificado não estava correcto? voltamos a alterar tudo ? 😕

 

  • Vote 1

As mentes humanas são realmente um local estranho!

Share this post


Link to post
Share on other sites
pmmachado
1 hora 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.

Boas.

Acabei de conseguir comunicar 2 documentos em produção com o .pfx alterado (adicionei a cadeia de certificação como sugeriste com o KeyStore Explorer). Vamos ver se na segunda isto ainda funciona ... Senão vai sei o caos ...

Obrigado pela ajuda e como de costume este fórum continua a ser das melhores coisas que temos para sobreviver à nossa querida AT 🙂

  • Vote 1

Share this post


Link to post
Share on other sites
rolando_rocha

Bom dia,

Estou a começar a tratar do meu problema. Fiz em PHP. Depois de ver as vossas mensagens tenho uma dúvida. O único certificado que recebi da AT foi na sexta-feira e tem o nome de portaldasfinancasgovpt.pem. O certificado DGITA_Issuing_CA2 que têm utilizado onde foram buscar? Mesmo assim tenho algumas dúvidas como integro som os meus, uma vez que uso apensa os .pem

Alguém que tenha feita a comunicação em PHP e tenha usado o cURL?

Cumprimentos

Share this post


Link to post
Share on other sites
Smig
47 minutos atrás, rolando_rocha disse:

Bom dia,

Estou a começar a tratar do meu problema. Fiz em PHP. Depois de ver as vossas mensagens tenho uma dúvida. O único certificado que recebi da AT foi na sexta-feira e tem o nome de portaldasfinancasgovpt.pem. O certificado DGITA_Issuing_CA2 que têm utilizado onde foram buscar? Mesmo assim tenho algumas dúvidas como integro som os meus, uma vez que uso apensa os .pem

Alguém que tenha feita a comunicação em PHP e tenha usado o cURL?

Cumprimentos

Vê o post do Sergio. na página 318(?). Já está em formato pem, mas se precisares de converter, acho que o KeyStore Explorer faz isso facilmente. Se não suponho que seja só encontrar o comando openssl apropriado. Depois na página seguinte tens dois exemplos de duas pessoas em PHP + cURL que dizem que funciona.

Edited by Smig

Share this post


Link to post
Share on other sites
hhccruz

Bom dia,

Também recebi os certificados. Estou a criar o request assim:

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"

Completamente perdido. Nunca foi necessário alterar nada.

 Alguém sabe o que é necessário fazer? 

 

Obrigado,

Share this post


Link to post
Share on other sites
joaofrsousa
12 hours ago, pmmachado said:

Boas.

Acabei de conseguir comunicar 2 documentos em produção com o .pfx alterado (adicionei a cadeia de certificação como sugeriste com o KeyStore Explorer). Vamos ver se na segunda isto ainda funciona ... Senão vai sei o caos ...

Obrigado pela ajuda e como de costume este fórum continua a ser das melhores coisas que temos para sobreviver à nossa querida AT 🙂

Boa tarde, peço desculpa pela minha ignorância, mas como exactamente se adiciona esta cadeia de certificação ? Pode nos facultar um exemplo prático ou uma referência. Obrigado.

Share this post


Link to post
Share on other sites
joaofrsousa
1 hour ago, hhccruz said:

Bom dia,

Também recebi os certificados. Estou a criar o request assim:


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"

Completamente perdido. Nunca foi necessário alterar nada.

 Alguém sabe o que é necessário fazer? 

 

Obrigado,

Boas, estamos exatamente na mesma situação. Pelo que percebi existe uma solução adicionando os certificados na cadeia da nossa certificação. Agora não sei detalhar exatamente o procedimento, alguém pode esclarecer ? Obrigado.

Share this post


Link to post
Share on other sites
Smig
2 minutos atrás, joaofrsousa disse:

Boas, estamos exatamente na mesma situação. Pelo que percebi existe uma solução adicionando os certificados na cadeia da nossa certificação. Agora não sei detalhar exatamente o procedimento, alguém pode esclarecer ? Obrigado.

O ei99045 tem instruções detalhadas na página anterior.

Share this post


Link to post
Share on other sites
Jose Guerreiro

Ola boa a tarde...

Desde já obrigado pelas digas/soluções e parabens a quem já conseguiu por a funcionar.

Infelizmente comigo está mesmo complicado :( 

O que fiz foi o seguinte:

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.

Quando se abre os detalhes final do .pfx fico com a seguinte cadeia

DGITA ROOT CA

     +    DGITA Issusing CA 2

         + NIF

 

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

Podem ajudar!?

Obrigado

 

Share this post


Link to post
Share on other sites
joaofrsousa
29 minutes ago, Jose Guerreiro said:

Ola boa a tarde...

Desde já obrigado pelas digas/soluções e parabens a quem já conseguiu por a funcionar.

Infelizmente comigo está mesmo complicado :( 

O que fiz foi o seguinte:

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.

Quando se abre os detalhes final do .pfx fico com a seguinte cadeia

DGITA ROOT CA

     +    DGITA Issusing CA 2

         + NIF

 

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

Podem ajudar!?

Obrigado

 

Segui exatamente este procedimento acima e também não tive sucesso. O que não está correto ? Obrigado.

Share this post


Link to post
Share on other sites
rukako
23 horas atrás, Jose Guerreiro disse:

Ola boa a tarde...

Infelizmente está mesmo complicado :(

Também procuramos alguma ajuda para aplicação em .NET... isto na segunda feira vai ser bonito vai…. :(

Abraço

 

Pois tambem estou a procura para o .NET e ainda nao consegui. rrrrr

Share this post


Link to post
Share on other sites
Smig
36 minutos atrás, Jose Guerreiro disse:

Ola boa a tarde...

Desde já obrigado pelas digas/soluções e parabens a quem já conseguiu por a funcionar.

Infelizmente comigo está mesmo complicado :( 

O que fiz foi o seguinte:

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.

Quando se abre os detalhes final do .pfx fico com a seguinte cadeia

DGITA ROOT CA

     +    DGITA Issusing CA 2

         + NIF

 

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

Podem ajudar!?

Obrigado

 

 

6 minutos atrás, joaofrsousa disse:

Segui exatamente este procedimento acima e também não tive sucesso. O que não está correto ? Obrigado.

É Java? No meu caso isso não chegou. Tive que adicionar o certificado enviado pela AT na truststore (cacerts por omissão).

Edit: e não usei o KeyStore Exporer mas não sei se faz diferença.

Edited by Smig

Share this post


Link to post
Share on other sites
desconfiado

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.

 

  • Vote 2

Share this post


Link to post
Share on other sites
josevcosta
Em 20/07/2019 às 14:12, jorang disse:

Confirmo que adicionando o parâmetro cacert com o certificado indicado, funciona - também nunca precisamos disto antes.
Obrigado Sérgio!

Também estou a usar o curl em linux mas, mesmo com o parâmetro "--cacert", não está a funcionar:

curl -X POST  https://servicos.portaldasfinancas.gov.pt:401/sgdtws/documentosTransporte -H "Content-Type:application/soap+xml; charset=utf-8" -H  https://servicos.portaldasfinancas.gov.pt/sgdtws/documentosTransporte/" --tlsv1 --cacert "cacert.pem" --cert "certificadoempresa.pem" --crlf -d @xxxSoap --max-time 15 > xxx.RESP 2>xxx.RESP.err

Podem validar o comando que estou a usar?

Obrigado pela ajuda.

 

Já está a funcionar.

A explicação, da página seguinte, do João Raposo deu-me a pista para conseguir ultrapassar o problema, ou seja, concatenar os 3 certificados.

cat certificadoempresa.pem DGITA_Issuing_CA2.pem portaldasfinancasgovpt.pem > cacert.pem

Edited by josevcosta

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.