Jump to content

Recommended Posts

Posted (edited)

Bom dia,
Recebi esses certificados
51483XXX.cer
ChaveCifraPublicaAT2025.cer
PublicChainCA2.p7b

Como faço para gerar o .pfx? Não tenho o .key para gerar .pfx

Obrigado!

Edited by Jorgeb
Posted
Em 04/11/2024 às 14:00, Jorgeb disse:

Bom dia,
Recebi esses certificados
51483XXX.cer
ChaveCifraPublicaAT2025.cer
PublicChainCA2.p7b

Como faço para gerar o .pfx? Não tenho o .key para gerar .pfx

Obrigado!

Boa tarde,

Quando geraste o teu certificado SSL, foram gerados 2 ficheiros: 51483XXX.csr e 51483XXX.key,

Enviaste para a AT o 51483XXX.csr portanto ainda deves ter o respectivo 51483XXX.key do teu lado.

 

Posted

Boa tarde,

Vor repetir de outra forma, se seguiste as instruções no comando para gerar o teu certificado SSL há 2 outputs : "51483XXX.csr"  e "51483XXX.key",

Tens ambos os "51483XXX.csr" e "51483XXX.key" do teu lado, na tua máquina, são teus, ninguém te vai enviar.

Já usaste o teu "51483XXX.csr" para enviar a AT, agora utiliza o teu "51483XXX.key" para completar o processo.

  • Vote 1
Posted
Em 06/11/2024 às 19:40, Jorgeb disse:

Pode gerar o . pfx para mim?
obrigado a todos

Este certificado é exclusivamente vosso/empresa, daí terem a .key e respectiva password do vosso lado.

Transmitir os mesmos a terceiros não parece boa ideia.

Posted (edited)
Em 07/11/2024 às 14:39, antseq disse:

Este certificado é exclusivamente vosso/empresa, daí terem a .key e respectiva password do vosso lado.

Transmitir os mesmos a terceiros não parece boa ideia.

Eu gerei os PFXs, (sim, tenho mais de uma empresa) e executo o WS para obter os ATCUD que nas maioria das vezes dá  erro de autorização erro 1116.

Estou a gerar os ATCUDs na força bruta, ou seja,  tenta diversas vezes ao dia até que gere todas as chaves.. 

Se as vezes aceita minha conexão e gera os ATCUDS, fica a pergunta:  Por que as vezes autentica no servidor da AT e algumas vezes não?

Estou a usar a data do observatório nacional de Lisboa, seria a única diferença entre as chamadas. 

 

Edited by Daniel Xisla
Posted
Em 12/11/2024 às 14:42, Daniel Xisla disse:

Eu gerei os PFXs, (sim, tenho mais de uma empresa) e executo o WS para obter os ATCUD que nas maioria das vezes dá  erro de autorização erro 1116.

Estou a gerar os ATCUDs na força bruta, ou seja,  tenta diversas vezes ao dia até que gere todas as chaves.. 

Se as vezes aceita minha conexão e gera os ATCUDS, fica a pergunta:  Por que as vezes autentica no servidor da AT e algumas vezes não?

Estou a usar a data do observatório nacional de Lisboa, seria a única diferença entre as chamadas. 

Não percebo como alguém pode usar "força bruta", "diversas vezes ao dia" até que "gere todas as chaves"!?

1) Quantas séries ainda tens sem ATCUD? 10000000000? 

2) A "força bruta" não estará a repetir o mesmo "Nonce" em todas as chamadas? [Não se pode repetir "Nonce"s]

3) Muita gente tem a mania de forçar a data do observatório em vez de usar a data do sistema (ESTANDO esta última minimamente sincronizada com a hora legal). Ao menos os segundos da "hora" variam entre as chamadas ou é "força bruta" centenas de pedidos com a mesma data/hora?

 

Posted
Em 12/11/2024 às 18:13, antseq disse:

Não percebo como alguém pode usar "força bruta", "diversas vezes ao dia" até que "gere todas as chaves"!?

1) Quantas séries ainda tens sem ATCUD? 10000000000? 

2) A "força bruta" não estará a repetir o mesmo "Nonce" em todas as chamadas? [Não se pode repetir "Nonce"s]

3) Muita gente tem a mania de forçar a data do observatório em vez de usar a data do sistema (ESTANDO esta última minimamente sincronizada com a hora legal). Ao menos os segundos da "hora" variam entre as chamadas ou é "força bruta" centenas de pedidos com a mesma data/hora?

 

1) Simples,  os números de documentos eram formados por [TipoDoc+ano+departamento + Nr Sequencial] , temos uns 60 tipos de documentos e 13 empresas. Nem todos os documentos são necessários criar ATCUD, Cada empresa tem vários departamentos. 

Sim, poderia ter criado um ATCUD para TipoDoc+Ano+empresa, mas preferiram manter o padrão conforme os números de documentos. Assim preciso gerar 13 certificados e gerar ATCUDs para as diversas empresas, documentos e seus departamentos.

2 e 3) Se fosse assim, a primeira chamada era para autenticar na AT e gerar meu ATCUD.
Antes de atualizar os Certificados funcionava relativamente bem, mas com este novo cerificado preciso executar várias vezes, já tenho uma boa parte criada.

No ano passado, foram todos criados em uma tarde!

 

 

 

 

Posted
Em 12/11/2024 às 21:47, Daniel Xisla disse:

1) Simples,  os números de documentos eram formados por [TipoDoc+ano+departamento + Nr Sequencial] , temos uns 60 tipos de documentos e 13 empresas. Nem todos os documentos são necessários criar ATCUD, Cada empresa tem vários departamentos. 

Sim, poderia ter criado um ATCUD para TipoDoc+Ano+empresa, mas preferiram manter o padrão conforme os números de documentos. Assim preciso gerar 13 certificados e gerar ATCUDs para as diversas empresas, documentos e seus departamentos.

2 e 3) Se fosse assim, a primeira chamada era para autenticar na AT e gerar meu ATCUD.
Antes de atualizar os Certificados funcionava relativamente bem, mas com este novo cerificado preciso executar várias vezes, já tenho uma boa parte criada.

No ano passado, foram todos criados em uma tarde!

Tenho algo semelhante Empresas x Filiais x Terminais x Tipos de documentos e nenhum problema em comunicar apenas 1, múltiplos por Terminal, múltiplos por Filial, múltiplos por Empresa. Até os dispomos em grelha, multiselecção, no envio e a medida que são comunicados (e sem erro) podemos ver os ATCUDs a serem preenchidos na grelha em tempo real.

Nunca tive erros... ou dá erro de conexão e não segue nada.. ou se envia o 1o os seguintes também seguem com sucesso.

Nunca tive de usar a abordagem de "força bruta"... simplesmente segue 1, segue 1, segue 1, segue 1, ..., segue N e resultam em sucesso.

Cada envio é distinto, sem qualquer optimização para "força bruta", sem qualquer reaproveitamento de valores ou variáveis do envio anterior.

Posted
Em 13/11/2024 às 15:06, antseq disse:

Tenho algo semelhante Empresas x Filiais x Terminais x Tipos de documentos e nenhum problema em comunicar apenas 1, múltiplos por Terminal, múltiplos por Filial, múltiplos por Empresa. Até os dispomos em grelha, multiselecção, no envio e a medida que são comunicados (e sem erro) podemos ver os ATCUDs a serem preenchidos na grelha em tempo real.

Nunca tive erros... ou dá erro de conexão e não segue nada.. ou se envia o 1o os seguintes também seguem com sucesso.

Nunca tive de usar a abordagem de "força bruta"... simplesmente segue 1, segue 1, segue 1, segue 1, ..., segue N e resultam em sucesso.

Cada envio é distinto, sem qualquer optimização para "força bruta", sem qualquer reaproveitamento de valores ou variáveis do envio anterior.

Não sei o porquê te incomodou tanto o termo "força bruta".

Faço exatamente igual, envio um a um e no final,  volta ao processo de enviar um a um novamente até que todos tenham o número associado. 

Ao invés de falar sobre o terno, não seria melhor tentar me ajudar a entender o porquê e evitar que ocorra este problema? 

 

Qual linguagem usas? Estou a usar C#. Posso enviar alguns trechos, como a criação do Nonce. busca da data, envio do xml. 

Posted

A mim não me incomoda em nada. Só referi o termo, ao contrário do entendido por forma de realmente ajudar (não entendido).

Explico...

Por “força bruta” assumo, à bruta, muitas (em quantidade) tentativas, forçadas a torto-e-a-direito, sem olhar a meios, o mais rápido possível até dar.

Ao contrário do “normal”, pensado, planeado, envio, resposta OK ou NOK, volto a repetir, sim/não/talvez, o operador decide quando/manual?, automático?, espera algum tempo?

Portanto (ajuda), não sei se no início por teres tido um azar dos azares de ocorrerem vários erros, saíste (por vias das circunstâncias) do caminho “normal” para outro de “força bruta” e dadas as características do mesmo (rápido, tentar-tentar-tentar-até dar, atalhando/reaproveitando algo entre tentativas, etc, etc, etc) não terá ficado alguma ponta solta que causa o grande número de rejeições e/ou derivado ao “azar” inicial.

Consegues gerar algum tipo de “LOG”, tipo:

13-11-2024 17:40:10 | request | created: ?????????????, nonce: ??????????????
13-11-2024 17:40:12 | response | fail motivo ???????? ou success

Ou mais detalhado a ver se há alguma lógica nas rejeições?
[penso que a informação ???????? acima não é confidencial]

Posted
Em 13/11/2024 às 17:47, antseq disse:

Por “força bruta” assumo, à bruta, muitas (em quantidade) tentativas, forçadas a torto-e-a-direito, sem olhar a meios, o mais rápido possível até dar.

Ao contrário do “normal”, pensado, planeado, envio, resposta OK ou NOK, volto a repetir, sim/não/talvez, o operador decide quando/manual?, automático?, espera algum tempo?

Eu acho que "força bruta" não é necessáriamente à bruta, pode muito bem ser pensado e planeado. Eu explico.

Temos que pensar que quem está do lado do servidor, se vê algum IP a entrar e a tentar registar em pouco tempo muitas dezenas ou até centenas de séries, pode considerar isso como um ataque e bloquear aquele IP.

No meu caso, como acho que quase toda a gente, quando alguém cria uma série nova, são registados todos os pares "Série"/"Tipo de documento interno", o que resulta em algumas dezenas de pedidos em questão de segundos. Se a empresa tiver vários estabelecimentos, cada um com a respetiva série, será isso vezes o número de estabelecimentos, mas nunca ouvi falar de alguém ter sido bloqueado.

O problema foi gerado pela AT quando desenhou o serviço. Na minha opinião só deveria receber a série e o ATCUD devia ter, além do Código da série e do Número do documento, também o Tipo de documento interno, tal como no InvoiceNo.

Posted
Em 14/11/2024 às 09:49, americob disse:

Eu acho que "força bruta" não é necessáriamente à bruta, pode muito bem ser pensado e planeado. Eu explico.

Temos que pensar que quem está do lado do servidor, se vê algum IP a entrar e a tentar registar em pouco tempo muitas dezenas ou até centenas de séries, pode considerar isso como um ataque e bloquear aquele IP.

No meu caso, como acho que quase toda a gente, quando alguém cria uma série nova, são registados todos os pares "Série"/"Tipo de documento interno", o que resulta em algumas dezenas de pedidos em questão de segundos. Se a empresa tiver vários estabelecimentos, cada um com a respetiva série, será isso vezes o número de estabelecimentos, mas nunca ouvi falar de alguém ter sido bloqueado.

O problema foi gerado pela AT quando desenhou o serviço. Na minha opinião só deveria receber a série e o ATCUD devia ter, além do Código da série e do Número do documento, também o Tipo de documento interno, tal como no InvoiceNo.

Concordo consigo que poderia identificar como um ataque!!!

MAS,  se fosse isso te pergunto:

   - Colocas uma parada entre uma solicitação e outra? Quantos ATCUDs tu solicitas no fim do ano? Tenho 1800 a serem solicitadas, coloca uma parada de quantos segundos? 

   -  Se executasse em modo DEBUG não deveria aceitar? Quando recebi os certificados, fiz UM PFX  para testes, não havia nenhuma execução anterior há dias. Tentei enviar e deu erro, tentei várias vezes em modo Debug, a cada tentativa tentava :  Ou gerava novamente um PFX, ou gerava PFX com  OPENSSL diferente, tentava somente 1  por vez e NADA! Depois de várias tentativas, coloquei o processo a executar e vários foram criados. Não há lógica.

Mesmo antes de trocar os certificados, quando alguém criava um documento, as vezes ficava tentando durante dias. Imagina, enviava UM DOCUMENTO de hora em hora, isso não pode ser considerado um ataque, as vezes gerava de primeira, às vezes 10 tentativas, às vezes 2 .. Sem um padrão 

    - Se fosse assim, os primeiros a serem enviados, TODOS deveriam ser gerados. 

 

Eu ainda acredito que estou a fazer algo errado, ou algum parâmetro que estou usando parâmetro errado na solicitação .

Segue a parte do código que eu julgo que possa dar algum erro, Alguém tem um código em C# que funcione a 100% ? Se for diferente do meu código pode compartilhar? 

Esse código já gerou todas as chaves de 2 anos. 

 

                    postData = xmlParaSolicitarNovaChave(info, dtPrevisaoInicio);
                    request = (HttpWebRequest)HttpWebRequest.Create(Consts.ATCUD_URL);
                    request.AllowAutoRedirect = true;
                    request.ClientCertificates = new X509CertificateCollection();
                    request.Headers.Add("SOAPAction", "http://at.gov.pt");
                    cert = new X509Certificate2();
                    certPFX = Convert.FromBase64String(info.certPFX);
                    cert.Import(certPFX, info.passwordPFX, X509KeyStorageFlags.DefaultKeySet);
                    request.ClientCertificates.Add(cert);
                    request.Method = "POST";
                    request.ContentType = "text/xml; charset=utf-8";
                    request.Accept = "text/xml";
                    TraceLog.WriteError(postData);
                    request.ProtocolVersion = HttpVersion.Version10;

                    byteArray = Encoding.UTF8.GetBytes(postData);
                    request.ContentLength = byteArray.Length;
                    string responseFromServer = "";
                    dataStream = request.GetRequestStream();
                    dataStream.Write(byteArray, 0, byteArray.Length);
                    dataStream.Close();
                    response = (HttpWebResponse)request.GetResponse();
                    dataStream = response.GetResponseStream();
                    reader = new StreamReader(dataStream);
                    responseFromServer = reader.ReadToEnd();
                    reader.Close();
                    dataStream.Close();
                    response.Close();
                    cert = null;
                    reader = null;
                    request = null;
                    response = null;
                    GC.Collect();

 

 

 

 

 

 

        private static string GenerateNonce(string publicKey)
        {
            var certificado = new X509Certificate2();            
            certificado.Import(Encoding.ASCII.GetBytes(publicKey));

            //if (Encryptor == null)
            CreateEncryptor();
            using (var RSA = new RSACryptoServiceProvider())
            {
                string PublicKey = certificado.PublicKey.Key.ToXmlString(false);
                RSA.FromXmlString(PublicKey);
                return Convert.ToBase64String(RSA.Encrypt(SymmetricKey, false));
            }
        }
        private static string EncryptBytes(byte[] toCypher)
        {
            //if (Encryptor == null) 
                CreateEncryptor();
            using (var ms = new MemoryStream())
            {
                using (var cryptoStream = new CryptoStream(ms, Encryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(toCypher, 0, toCypher.Length);
                    cryptoStream.FlushFinalBlock();
                    return Convert.ToBase64String(ms.ToArray());
                }
            }
        }

        public static ATEncryptorReturn Sign(string PasswordPlain, DateTime dataCriacao, string publicKey)
        {
            CreateEncryptor(); //Gerar a Chave

            ATEncryptorReturn retorno = new ATEncryptorReturn();

            retorno.Password = EncryptBytes(PasswordPlain.ToBytes()); //<wss:Password 
            retorno.Created = EncryptBytes(dataCriacao.ToString("yyyy-MM-ddTHH:mm:ss.fffZ").ToBytes()); //<wss:Created
            var DigetBytes = SymmetricKey.Concat(retorno.Created.ToBytes()).Concat(PasswordPlain.ToBytes()).ToArray();
            retorno.Digest = EncryptBytes(CalcSHA1(DigetBytes));
            retorno.Nonce = GenerateNonce(publicKey);
            return retorno;

        }

 

Posted
Em 15/11/2024 às 11:35, Daniel Xisla disse:

Esse código já gerou todas as chaves de 2 anos. 

o que é que faz o teu "CreateEncryptor()"? porque "create" tantas vezes?
Sign
- CreateEncryptor(); //Gerar a Chave
- retorno.Password = EncryptBytes -> CreateEncryptor()
- retorno.Created  = EncryptBytes -> CreateEncryptor()
- retorno.Digest = EncryptBytes -> CreateEncryptor()
- retorno.Nonce = GenerateNonce -> CreateEncryptor()

Posted
Em 15/11/2024 às 11:47, antseq disse:

o que é que faz o teu "CreateEncryptor()"? porque "create" tantas vezes?
Sign
- CreateEncryptor(); //Gerar a Chave
- retorno.Password = EncryptBytes -> CreateEncryptor()
- retorno.Created  = EncryptBytes -> CreateEncryptor()
- retorno.Digest = EncryptBytes -> CreateEncryptor()
- retorno.Nonce = GenerateNonce -> CreateEncryptor()

Fiz duas alterações e melhorou,  estou em modo debug, leva uns 10 segundos entre uma requisição e outra. 

Está uma média 1 retorno com sucesso e  2 ou 3 com erro, estranho que a mensagem é a mesma, mas o código mudou, agora é 1112 e antes  1116

<faultcode>1112</faultcode>
<faultstring>Erro de Autenticacao/Autorizacao - Pedido do Cliente </faultstring>

 

Alterações que eu fiz:

 

        private static string EncryptBytes(byte[] toCypher)
        {
            if (Encryptor == null)          <-- Não sei o porquê, mas esta linha estava comentada!
                CreateEncryptor();
 

  public static ATEncryptorReturn Sign(string PasswordPlain, DateTime dataCriacao, string publicKey)
  {
     if (Encryptor == null)          <-- Não sei o porquê, mas esta linha estava comentada!
          CreateEncryptor(); //Gerar a Chave

      ATEncryptorReturn retorno = new ATEncryptorReturn();

      retorno.Password = EncryptBytes(PasswordPlain.ToBytes()); //<wss:Password 

 

request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.Accept = "text/xml";
request.ProtocolVersion = HttpVersion.Version11; // Estava Version10

 

 

 

 

 

@antseq  O que faz o EncryptBytes 

        private static string EncryptBytes(byte[] toCypher)
        {
            if (Encryptor == null) 
                CreateEncryptor();
            using (var ms = new MemoryStream())
            {
                using (var cryptoStream = new CryptoStream(ms, Encryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(toCypher, 0, toCypher.Length);
                    cryptoStream.FlushFinalBlock();
                    return Convert.ToBase64String(ms.ToArray());
                }
            }
        }


    private static void CreateEncryptor()
      {
          /* 
           * Gerar chave simétrica
           */
          var rnd = new Random();
          rnd.NextBytes(SymmetricKey);
          var cryptoAlgorithm = SymmetricAlgorithm.Create();
          cryptoAlgorithm.Key = SymmetricKey;
          cryptoAlgorithm.IV = SymmetricKey;
          cryptoAlgorithm.Mode = CipherMode.ECB;
          Encryptor = cryptoAlgorithm.CreateEncryptor(cryptoAlgorithm.Key, cryptoAlgorithm.IV);
      }
 

 

 

Posted (edited)

Olá,

Usei C# para desenvolver a ferramenta de comunicação das séries.

Hoje, porque tive feedback de alguns clientes que não estavam a conseguir comunicar as séries para 2025, testei no meu pc e obtenho o mesmo erro que me reportaram:

Mais alguém está com dificuldades?

 

[LENOVO-PC 2024-11-15 13:20:49] [ERR]    at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(HttpRequestException requestException, HttpRequestMessage request, HttpAbortReason abortReason)
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpClientRequestChannel.HttpClientChannelAsyncRequest.SendRequestAsync(Message message, TimeoutHelper timeoutHelper)
   at System.ServiceModel.Channels.RequestChannel.RequestAsync(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.RequestAsyncInternal(Message message, TimeSpan timeout)
   at System.Runtime.TaskHelpers.WaitForCompletionNoSpin[TResult](Task`1 task)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(MethodCall methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(MethodInfo targetMethod, Object[] args)
   at generatedProxy_1.consultarSeries(consultarSeriesRequest)
   at Service_ATCUD.SeriesWSClient.Service_ATCUD.SeriesWS.consultarSeries(consultarSeriesRequest request) in C:\Projetos\SeriesATCUD\Connected Services\Service_ATCUD\Reference.cs:line 880
   at Service_ATCUD.SeriesWSClient.consultarSeries(String serie, String tipoSerie, String classeDoc, String tipoDoc, String codValidacaoSerie, DateTime dataRegistoDe, DateTime dataRegistoAte, String estado, String meioProcessamento) in C:\Projetos\SeriesATCUD\Connected Services\Service_ATCUD\Reference.cs:line 895
   at Sigma.SeriesATCUD.classes.GestaoSeriesWS.ExecutaOperacao() in C:\Projetos\SeriesATCUD\classes\GestaoSeriesWS.cs:line 56

 

Edited by TaDificil

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.