Jump to content
cjulio

Utilizar Webservices da AT

Recommended Posts

albertosilva
6 horas atrás, General disse:

ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

 
 
 
 
 

Chamou-me a atenção esta dupla atribuição do valor à mesma propriedade, mas que não tem nada a ver com o problema.

Share this post


Link to post
Share on other sites
General
2 minutes ago, albertosilva said:

Chamou-me a atenção esta dupla atribuição do valor à mesma propriedade, mas que não tem nada a ver com o problema.

Obrigada nem tinha reparado nisso!

Share this post


Link to post
Share on other sites
car4321
10 minutos atrás, General disse:

Olá muito Obrigado pelo feedback.

Eu fiz alteração mas o erro persiste. :(

 

A página de testes da AT reproduz o mesmo erro.

Também testei agora e dá esse erro (em modo teste).

Devem dar por isso um dia destes.

Share this post


Link to post
Share on other sites
General
8 hours ago, General said:
//++++++++++++++++++++++++
            //Importação do certificado
            X509Certificate2 certCP = new X509Certificate2();
            certCP.Import(CaminhoChavePublica);
            // Chave Pública
            String Kpub = certCP.PublicKey.Key.ToXmlString(false);


            // Geração da chave simétrica 128 Bits (AES)
            var keyBytes = new byte[16];
            AesCryptoServiceProvider rijndaelCipher = new AesCryptoServiceProvider();
            rijndaelCipher.Mode = CipherMode.ECB;
            rijndaelCipher.Padding = PaddingMode.PKCS7;
            rijndaelCipher.KeySize = 128;
            rijndaelCipher.BlockSize = 128;
            rijndaelCipher.Key = keyBytes;
            rijndaelCipher.IV = keyBytes;
            rijndaelCipher.GenerateKey();

            //------------------------------------------------------------------------------------------------------------------------------------------------
            //H.2. - Nonce (String - Base64)
            //------------------------------------------------------------------------------------------------------------------------------------------------
            // Chave simétrica do pedido
            Byte[] Ks = rijndaelCipher.Key;
            // Função que cifra da chave simétrica com o algoritmo RSA utilizando a chave pública do sistema de autênticação (Kpub)
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            RSA.FromXmlString(Kpub);
            Byte[] Chave = RSA.Encrypt(Ks, false);

            // Chave simétrica convertida em Base64
            Nonce = Convert.ToBase64String(Chave);
            //------------------------------------------------------------------------------------------------------------------------------------------------

            //------------------------------------------------------------------------------------------------------------------------------------------------
            //H.2. - Nonce TOC (String - Base64)
            //------------------------------------------------------------------------------------------------------------------------------------------------
            // Chave simétrica do pedido
            rijndaelCipher.GenerateKey();
            Byte[] Ks1 = rijndaelCipher.Key;
            // Função que cifra da chave simétrica com o algoritmo RSA utilizando a chave pública do sistema de autênticação (Kpub)
            RSACryptoServiceProvider RSA1 = new RSACryptoServiceProvider();
            RSA.FromXmlString(Kpub);
            Byte[] Chave1 = RSA.Encrypt(Ks1, false);

            // Chave simétrica convertida em Base64
            tocNonce = Convert.ToBase64String(Chave1);
            //------------------------------------------------------------------------------------------------------------------------------------------------


            //------------------------------------------------------------------------------------------------------------------------------------------------
            //H.3. - Password (String - Base64)
            //------------------------------------------------------------------------------------------------------------------------------------------------
            // Fluxo de memória da senhaPF
            MemoryStream msSenhaPF = new MemoryStream();
            // Função que cifra a SenhaPF utilizando o algoritmo AES, Modelo ECB, PKCS5Padding e a chave simétrica do pedido Ks
            CryptoStream csSenhaPF = new CryptoStream(msSenhaPF, rijndaelCipher.CreateEncryptor(Ks, rijndaelCipher.IV), CryptoStreamMode.Write);
            using (StreamWriter swSenhaPF = new StreamWriter(csSenhaPF))
            {
                swSenhaPF.Write(SenhaPF);
            }
            // Senha das finanças convertida em Base64
            Password = Convert.ToBase64String(msSenhaPF.ToArray());

            // Data de criação em Timestamp
            Created = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd\'T\'HH:mm:ss.fff\'Z\'");

            // Geração do DIGEST
            // Concatenação dos array's bytes da Ks + Created + SenhaPF
            byte[] bytesNonce = Ks;
            byte[] bytesCreated = Encoding.UTF8.GetBytes(Created);
            byte[] bytesPassword = Encoding.UTF8.GetBytes(SenhaPF);

            byte[] digestInput = new byte[bytesNonce.Length + bytesCreated.Length + bytesPassword.Length];
            Array.Copy(bytesNonce, 0, digestInput, 0, bytesNonce.Length);
            Array.Copy(bytesCreated, 0, digestInput, bytesNonce.Length, bytesCreated.Length);
            Array.Copy(bytesPassword, 0, digestInput, bytesNonce.Length + bytesCreated.Length, bytesPassword.Length);

            GenerateDigest DigestGt = new GenerateDigest();
            byte[] digestInput1 = GenerateDigest.cypherCredentialBuffer(Ks, DigestGt.buildPasswordDigest(Ks, Created, SenhaPF));

            // Digest Convertido em Base64
            Digest = Convert.ToBase64String(digestInput1);
            //------------------------------------------------------------------------------------------------------------------------------------------------

            //------------------------------------------------------------------------------------------------------------------------------------------------
            //H.3. - Password TOC (String - Base64)
            //------------------------------------------------------------------------------------------------------------------------------------------------
            // Fluxo de memória da senhaPF
            MemoryStream msSenhaPF1 = new MemoryStream();
            // Função que cifra a SenhaPF utilizando o algoritmo AES, Modelo ECB, PKCS5Padding e a chave simétrica do pedido Ks
            CryptoStream csSenhaPF1 = new CryptoStream(msSenhaPF1, rijndaelCipher.CreateEncryptor(Ks1, rijndaelCipher.IV), CryptoStreamMode.Write);
            using (StreamWriter swSenhaPF1 = new StreamWriter(csSenhaPF1))
            {
                swSenhaPF1.Write(senhaToc);
            }
            // Senha das finanças convertida em Base64
            tocPassword = Convert.ToBase64String(msSenhaPF1.ToArray());

            // Geração do DIGEST
            // Concatenação dos array's bytes da Ks + Created + SenhaPF
            byte[] bytesNonce1 = Ks1;
            byte[] bytesCreated1 = Encoding.UTF8.GetBytes(Created);
            byte[] bytesPassword1 = Encoding.UTF8.GetBytes(senhaToc);

            byte[] digestInput2 = new byte[bytesNonce1.Length + bytesCreated1.Length + bytesPassword1.Length];
            Array.Copy(bytesNonce1, 0, digestInput2, 0, bytesNonce1.Length);
            Array.Copy(bytesCreated1, 0, digestInput2, bytesNonce1.Length, bytesCreated1.Length);
            Array.Copy(bytesPassword1, 0, digestInput2, bytesNonce1.Length + bytesCreated1.Length, bytesPassword1.Length);

            GenerateDigest DigestGt1 = new GenerateDigest();
            byte[] digestInput3 = GenerateDigest.cypherCredentialBuffer(Ks1, DigestGt.buildPasswordDigest(Ks1, Created, senhaToc));

            // Digest Convertido em Base64
            tocDigest = Convert.ToBase64String(digestInput3);
            //------------------------------------------------------------------------------------------------------------------------------------------------

            //------------------------------------------------------------------------------------------------------------------------------------------------
            //H.4. - Created (String - Base64)
            //------------------------------------------------------------------------------------------------------------------------------------------------


            // Fluxo de memória da Created
            MemoryStream msDataCriacao = new MemoryStream();
            // Função que cifra a Data de sistema utilizando o algoritmo AES, Modelo ECB, PKCS5Padding e a chave simétrica do pedido Ks
            CryptoStream csDataCriacao = new CryptoStream(msDataCriacao, rijndaelCipher.CreateEncryptor(Ks, rijndaelCipher.IV), CryptoStreamMode.Write);
            using (StreamWriter swDataCriacao = new StreamWriter(csDataCriacao))
            {
                swDataCriacao.Write(Created);
            }
            // Data de sistema Convertido em Base64
            DataCriacaoEncriptada = Convert.ToBase64String(msDataCriacao.ToArray());

A geração do Digest eu criei uma classe em Java (Cópia do source da AT) e converti para DLL. Pode ser algum problema neste código se puderem dar uma vista de olhos agradeço.

Share this post


Link to post
Share on other sites
Samuel

Bom dia,

Os certificados para o ambiente de testes estão expirados. Eram válidos até dia 26.
Fiz o download neste momento, e continuam a estar os antigos. 
Sabem se os novos certificados foram disponibilizados de outra forma ou devo abrir um ticket com a AT?

Obrigado.

Share this post


Link to post
Share on other sites
Jorge Ferreira

Bom dia,

Comecei a ter o erro Rejected:   |  Codigo: 10  |  Erro: Validade da credencial expirada(2020-05-28T10:44:30Z)  |  Tentativas Restantes: -1

Mas a minha chave só expira a 30/09/2020.

Alguém está a ter algo parecido?

Obrigado.

Share this post


Link to post
Share on other sites
jorang
10 minutos atrás, Jorge Ferreira disse:

Bom dia,

Comecei a ter o erro Rejected:   |  Codigo: 10  |  Erro: Validade da credencial expirada(2020-05-28T10:44:30Z)  |  Tentativas Restantes: -1

Mas a minha chave só expira a 30/09/2020.

Alguém está a ter algo parecido?

Obrigado.

Isso acontece normalmente quando a hora do servidor/pc não está sincronizada com a do observatório.

  • Vote 1

Share this post


Link to post
Share on other sites
ArturRibeiro

Bom dia,

nós estamos com erro mas no ambiente de testes

O Certificado expirou

"A new test certificate has been issued, valid until 26th May 2020"

 

obg

Share this post


Link to post
Share on other sites
Samuel

Sim, é o mesmo erro que estamos a ter no ambiente de testes.
O que acaba por ser lógico...
O que é menos lógico é não ter certificados atualizados na página da AT

Share this post


Link to post
Share on other sites
albertosilva
Em 27/05/2020 às 11:36, albertosilva disse:

Caros colegas,

Desde ontem que os nossos clientes estão a obter o erro 100353 (Connection lost) na comunicação de documentos de transporte à AT. A comunicação é feita a partir de equipamentos Windows Mobile com .NET Compact Framework, usando a libraria SecureBlackBox e o código que na altura partilhei.

A minha questão é, estão a par de alguma alteração recente que possa provocar esta questão, como  AT apassar a exigir uma verão específica de TLS? Já coloquei também a questão à AT, mas não sei quanto tempo demorarão a responder.

Os nossos testes em Windows completo e Android, recorrendo a outras librarias, funcionam sem esse erro, com os mesmos certificados.

Em relação a este problema que verificámos a partir de terça-feira passada, recebemos da AT a resposta que continuam a suportar TLS 1.0, 1.1 e 1.2, não tendo havido alterações do lado deles. Depois de contactarmos o produtor da libraria, e tendo conhecimento de outro produtor de software nacional para a mesma plataforma utilizando o mesmo componente e com o mesmo problema desde a mesma data, atualizámos a libraria SecureBlackBox para uma versão posterior e ajustámos algumas propriedades no sentido de limitar as versões de TLS a negociar com o servidor.A ter em conta que forçar TLS 1.2 pode provocar timeouts na comunicação a partir de equipamentos com características mais modestas, pelo que até que passe a ser um requisito da AT, não é necessário forçar essa versão.

Share this post


Link to post
Share on other sites
bugFree

Alguém está a ter erros de comunicação com os Webservices de Documentos de Transporte?

Dá-me o erro abaixo, mas tenho a certeza que o meu certificado está válido, só expira em 2021.

(60, 'SSL certificate problem: certificate has expired')

 


What's better: Coding solo or as part of a team?

A team means you have to fix someone else's bugs. Coding solo means you have to write all the bugs yourself.

Share this post


Link to post
Share on other sites
Bas
9 horas atrás, bugFree disse:

Alguém está a ter erros de comunicação com os Webservices de Documentos de Transporte?

Dá-me o erro abaixo, mas tenho a certeza que o meu certificado está válido, só expira em 2021.

(60, 'SSL certificate problem: certificate has expired')

 

Provavelmente terá sido isto:

https://calnetweb.berkeley.edu/calnet-technologists/incommon-sectigo-certificate-service/addtrust-external-root-expiration-may-2020

Share this post


Link to post
Share on other sites
oalves

Boa tarde a todos
Desde uns dias para trás, não tenho conseguido retomar qualquer resposta da parte da AT na comunicação do webservice, seja em testes ou produção, seja faturas ou documentos de transporte.
Do que confirmei, os certificados estão válidos, alguém faz ideia do que possa ser?
Faço a comunicação via PHP + SOAP, e não houve qualquer alteração de código do meu lado.

Share this post


Link to post
Share on other sites
albertosilva
1 minuto atrás, oalves disse:

não houve qualquer alteração de código do meu lado

Essa é a história das nossas vidas!

Sem dizer que tipo de erro está a obter, se erros mais genéricos ou mais específicos de entre os que a AT devolve na comunicação será difícil obter ajuda concreta para o seu caso.

Share this post


Link to post
Share on other sites
oalves

O código mantém-se intacto desde a última alteração (Março) @albertosilva
A questão é mesmo essa, não estou a obter qualquer tipo de resposta da AT, o resultado vem em branco, sem nada.

Share this post


Link to post
Share on other sites
albertosilva
3 minutos atrás, oalves disse:

O código mantém-se intacto desde a última alteração (Março) @albertosilva
A questão é mesmo essa, não estou a obter qualquer tipo de resposta da AT, o resultado vem em branco, sem nada.

Qual o status code da resposta, 200?

Share this post


Link to post
Share on other sites
oalves

quando faço o $result = $client->__doRequest($str,$soapAction,"envioDocumentoTransporte",2,0);
o conteúdo do $result é NADA mesmo @albertosilva

Share this post


Link to post
Share on other sites
albertosilva
1 minuto atrás, oalves disse:

quando faço o $result = $client->__doRequest($str,$soapAction,"envioDocumentoTransporte",2,0);
o conteúdo do $result é NADA mesmo @albertosilva

Lamento não poder ajudar, não sei como em PHP possam fazer troubleshoot a essa situação. 

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.