Jorgeb Posted November 4, 2024 at 02:00 PM Report #633643 Posted November 4, 2024 at 02:00 PM (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 November 4, 2024 at 02:01 PM by Jorgeb
antseq Posted November 4, 2024 at 04:48 PM Report #633644 Posted November 4, 2024 at 04:48 PM 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.
Jorgeb Posted November 5, 2024 at 01:03 AM Author Report #633645 Posted November 5, 2024 at 01:03 AM Bem tarde, Eles só me deram esses 3 arquivos quando enviei o .SCR, mas não sei como gerar o .key Obrigado
antseq Posted November 5, 2024 at 12:15 PM Report #633647 Posted November 5, 2024 at 12:15 PM 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. 1 Report
Jorgeb Posted November 6, 2024 at 02:13 PM Author Report #633652 Posted November 6, 2024 at 02:13 PM Obrigado, Aí eu tenho o .key Qual seria o comando correto para gerar o .pfx?
antseq Posted November 6, 2024 at 02:50 PM Report #633653 Posted November 6, 2024 at 02:50 PM salvo erro, deverá ser este: openssl pkcs12 -export -in "51483XXX.cer" -inkey "51483XXX.key" -out "51483XXX.pfx" [vai pedir a [TUA] password para concluir o processo] 1 Report
Jorgeb Posted November 6, 2024 at 07:40 PM Author Report #633654 Posted November 6, 2024 at 07:40 PM Pode gerar o . pfx para mim? obrigado a todos
antseq Posted November 7, 2024 at 02:39 PM Report #633655 Posted November 7, 2024 at 02:39 PM 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.
user Posted November 8, 2024 at 03:54 PM Report #633669 Posted November 8, 2024 at 03:54 PM Alguém andou a mentir no CV
Daniel Xisla Posted November 12, 2024 at 02:42 PM Report #633672 Posted November 12, 2024 at 02:42 PM (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 November 12, 2024 at 02:44 PM by Daniel Xisla
antseq Posted November 12, 2024 at 06:13 PM Report #633675 Posted November 12, 2024 at 06:13 PM 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?
Daniel Xisla Posted November 12, 2024 at 09:47 PM Report #633676 Posted November 12, 2024 at 09:47 PM 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!
antseq Posted November 13, 2024 at 03:06 PM Report #633677 Posted November 13, 2024 at 03:06 PM 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.
Daniel Xisla Posted November 13, 2024 at 03:14 PM Report #633678 Posted November 13, 2024 at 03:14 PM 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.
antseq Posted November 13, 2024 at 05:47 PM Report #633679 Posted November 13, 2024 at 05:47 PM 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]
americob Posted November 14, 2024 at 09:49 AM Report #633681 Posted November 14, 2024 at 09:49 AM 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.
Daniel Xisla Posted November 15, 2024 at 11:35 AM Report #633687 Posted November 15, 2024 at 11:35 AM 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; }
antseq Posted November 15, 2024 at 11:47 AM Report #633688 Posted November 15, 2024 at 11:47 AM 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()
Daniel Xisla Posted November 15, 2024 at 12:20 PM Report #633689 Posted November 15, 2024 at 12:20 PM 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); }
TaDificil Posted November 15, 2024 at 03:23 PM Report #633690 Posted November 15, 2024 at 03:23 PM (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 November 15, 2024 at 03:41 PM by TaDificil
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now