Jump to content

Utilizar Webservices da AT


cjulio
Go to solution Solved by thoga31,

Recommended Posts

Olá grbabus

Para encriptar os campos password, nonce e created tens que usar o a chave pública da AT fornecido como ficheiro .cer e não o certificado .pfx.

Na primeira linha do teu código tens isso asteriscado e pelos vistos já esteve correcto e depois alteraste. Neste caso, não precisas da pass do certificado de testes das financas.

Deve ser q coisa assim:

Dim CaminhoChavePublica As String = "c:\chave\certo.cer"
	 ' Variaveis a encriptar
	 'xxx Dim PassFinancas As String = "TESTEwebservice"
	 Dim DataCriacao As String = Date.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.ff") & "Z"
	 ' Carregar chave pública
	 Dim certCP As New X509Certificate2
	 certCP.Import(CaminhoChavePublica)
	 Dim ChavePublica As String = certCP.PublicKey.Key.ToXmlString(False)
	 ...

Verifica e diz qq coisa.

obrigado pmmachado , aquele certificado eu exportei pelo TestesWebServices.pfx já testei aqui com vc me disse , mas continua a dar o mesmo erro !

Edited by grbabus
Link to comment
Share on other sites

Exatamente isso, vou esperar para ver não sei qual o prazo para isso , mas afecta o projecto que entreguei ao meu cliente que vê aqui a falhar!!! , lol quem resolver ajude-nos !!

Olá grbabus e a quem interessar,

Então é assim e relativamente ao erro

<?xml version="1.0" encoding="UTF-8"?>

-<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/>-<SOAP-ENV:Body>-<SOAP-ENV:Fault><faultcode>8 </faultcode><faultstring>Rejected: | Codigo: 8 | Erro: Nonce: Não foi possível decifrar o campo | Tentativas Restantes: -1</faultstring><detail>fews.gdcontfsimpostosqua</detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

em ambiente de produção, ou seja, endereço definitivo. Coloquei a questão ao pessoal da AT e a resposta foi esta:

> Agradecemos a informação fornecida, e informamos que a ligação feita ao URL https://servicos.portaldasfinancas.gov.pt:400/fews/faturas só está permitida com base em certificado digital.

> O certificado digital que deve utilizar para autorizar a comunicação é extraído do ficheiro 503303461.cer que lhe enviámos com base no vosso pedido CSR.

> A chave pública utilizada, "ChavePublicaAT.cer", serve para a cifra necessária na password (quer em testes quer em ambiente de produção).

Posto isto, tudo para mim está a funcionar ao fim de 2 longos meses.

Cumprimentos a todos.

Carlos Matos

Carlos Matos 💪

Link to comment
Share on other sites

Opa obrigado pela resposta, chegou ontem o certificado do cliente o mesmo me enviou eu instalei na minha maquina e agora quando uso no código da o seguinte erro: A ligação subjacente foi fechada: Erro inesperado ao enviar. lol por essa eu não esperava!!, preciso fazer algo de especial com o certificado ou e só instalar na máquina e apontar um directoria onde ele está na maquina?

Link to comment
Share on other sites

Opa obrigado pela resposta, chegou ontem o certificado do cliente o mesmo me enviou eu instalei na minha maquina e agora quando uso no código da o seguinte erro: A ligação subjacente foi fechada: Erro inesperado ao enviar. lol por essa eu não esperava!!, preciso fazer algo de especial com o certificado ou e só instalar na máquina e apontar um directoria onde ele está na maquina?

Pois eu também gostaria de saber quais os passos para usar o certificado, pois a mim dá-me o seguinte erro "unable to use client certificate (no key found or wrong pass phrase?)". Se alguém poder ajudar agradeço, pois é o meu primeiro trabalho na empresa e já estou atrasado na entrega. Estou a programar em PHP.

Abraço

Link to comment
Share on other sites

Caros,

Estou a programar o modulo de envio de facturas em java e estou a receber um erro EOFException (na verdade o servidor fecha a conecção TCP e as libraries do lado do cliente publicam esse erro) na fase de handshake depois de cliente e servidor concordarem com o modo de cifra a usar na comunicação encriptada que neste caso é TLS_RSA_WITH_AES_128_CBC_SHA.

Seguindo o protocolo SSL após as fases de troca e validação de certificados e definição da chave secreta para encriptação da comunicação que aqui não incluo por ser demasiado extenso, o cliente executa um teste com sucesso usando a nova cifra e envia os dados de teste para o servidor de modo a que este possa repetir o mesmo teste e assim garantir que ambas as partes estão em condições de iniciar uma comunicação cifrada. O cliente faz correctamente o teste de encriptação, passa os dados de teste para o servidor e este fecha então a conecção por razões desconhecidas.

Aqui segue a ultima parte do log SSL:

O cliente envia uma confirmação para o servidor validando que conhecemos a chave privada correspondente ao certificado do cliente enviado....

* CertificateVerify

[write] MD5 and SHA1 hashes: len = 262

<dados binarios>

main, WRITE: TLSv1 Handshake, length = 262

[Raw write]: length = 267

<dados binarios>

O cliente comunica ao servidor que vai mudar o modo de encriptação para a nova cifra negociada e acordada entre ambas as partes. Daqui para a frente todas as mensagens trocadas serão encriptadas com essa cifra(TLS_RSA_WITH_AES_128_CBC_SHA).

main, WRITE: TLSv1 Change Cipher Spec, length = 1

[Raw write]: length = 6

0000: 14 03 01 00 01 01

... a troca de cifra é enviada com sucesso

..Finished

É enviada pelo cliente uma mensagem de Finished para validar que a comunicação funciona bem.

verify_data: { 221, 96, 47, 110, 19, 170, 244, 8, 37, 152, 160, 40 }

O cliente faz o teste encriptando os dados com sucesso..

[write] MD5 and SHA1 hashes: len = 16

0000: 14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28 .....`/n....%..(

Padded plaintext before ENCRYPTION: len = 48

0000: 14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28 .....`/n....%..(

0010: 10 7F 85 11 EC 6D 5D ED 21 70 27 F4 DC 23 C0 9B .....m].!p'..#..

0020: A7 6F C2 80 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B .o..............

main, WRITE: TLSv1 Handshake, length = 48

...e envia os dados de teste para o servidor por forma a que o servidor faça o mesmo teste e confirme que a comunicação encriptada pode ser usada (53 bytes = 48 do teste + 5 do header).

[Raw write]: length = 53

0000: 16 03 01 00 30 1C 17 08 0F 49 C9 6A 7A 8B 8C 48 ....0....I.jz..H

0010: BA 57 2D CB 06 46 1E 65 61 7C 5F 74 F2 08 AB 12 .W-..F.ea._t....

0020: 91 47 72 8C 8F 84 0A CB D7 29 E2 FD 84 B2 FD 9E .Gr......)......

0030: 47 DC 13 60 B4 G..`.

... e o servidor fecha a conecção dando origem a um erro EOFException[/b]

main, received EOFException: error

main, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed

connection during handshake

%% Invalidated: [session-1, TLS_RSA_WITH_AES_128_CBC_SHA]

main, SEND TLSv1 ALERT: fatal, description = handshake_failure

Padded plaintext before ENCRYPTION: len = 32

0000: 02 28 BC 65 1A CA 68 87 79 84 5F 64 16 F5 28 72 .(.e..h.y._d..(r

0010: F7 8A 69 72 93 D8 09 09 09 09 09 09 09 09 09 09 ..ir............

main, WRITE: TLSv1 Alert, length = 32

[Raw write]: length = 37

0000: 15 03 01 00 20 0D 9A 35 18 B7 98 4B 7B AF 82 4E .... ..5...K...N

0010: 1A EE 7D AC 5D D5 49 05 4E 74 B9 77 E4 CD 87 61 ....].I.Nt.w...a

0020: 23 03 5C 9C 7E #...

main, called closeSocket()

main, called close()

main, called closeInternal(true)

Não consigo entender qual a causa do problema nem como posso programaticamente influenciar o resultado. Forcei o uso de outras cifras suportadas por cliente e servidor como seja o SSL_RSA_WITH_RC4_128_MD5 escrevendo uma classe que extende a SSLSocketFactory mas o erro mantém-se exactamente igual.

Alguma ideia sobre como resolver este problema? Estará a causa do lado do servidor da AT?

Link to comment
Share on other sites

Opa obrigado pela resposta, chegou ontem o certificado do cliente o mesmo me enviou eu instalei na minha maquina e agora quando uso no código da o seguinte erro: A ligação subjacente foi fechada: Erro inesperado ao enviar. lol por essa eu não esperava!!, preciso fazer algo de especial com o certificado ou e só instalar na máquina e apontar um directoria onde ele está na maquina?

O certificado de que falas é o ficheiro .cer que te enviaram após submeteres o CSR?

Não sei em que sistema trabalhas mas no Windows, tens que gerar o certificado com extensão .pfx, de modo a que o Windows o reconheça, instalá-lo (o .pfx) e a seguir usares este na tua ligação em que efetuas o pedido.

Se quiseres o comando de como gerares o .pfx, diz que eu digo-te.

Caros,

Estou a programar o modulo de envio de facturas em java e estou a receber um erro EOFException (na verdade o servidor fecha a conecção TCP e as libraries do lado do cliente publicam esse erro) na fase de handshake depois de cliente e servidor concordarem com o modo de cifra a usar na comunicação encriptada que neste caso é TLS_RSA_WITH_AES_128_CBC_SHA.

Seguindo o protocolo SSL após as fases de troca e validação de certificados e definição da chave secreta para encriptação da comunicação que aqui não incluo por ser demasiado extenso, o cliente executa um teste com sucesso usando a nova cifra e envia os dados de teste para o servidor de modo a que este possa repetir o mesmo teste e assim garantir que ambas as partes estão em condições de iniciar uma comunicação cifrada. O cliente faz correctamente o teste de encriptação, passa os dados de teste para o servidor e este fecha então a conecção por razões desconhecidas.

Aqui segue a ultima parte do log SSL:

O cliente envia uma confirmação para o servidor validando que conhecemos a chave privada correspondente ao certificado do cliente enviado....

*
CertificateVerify

[write] MD5 and SHA1 hashes: len = 262

<dados binarios>

main, WRITE: TLSv1 Handshake, length = 262

[Raw write]: length = 267

<
dados binarios>

O cliente comunica ao servidor que vai mudar o modo de encriptação para a nova cifra negociada e acordada entre ambas as partes. Daqui para a frente todas as mensagens trocadas serão encriptadas com essa cifra(TLS_RSA_WITH_AES_128_CBC_SHA).

main, WRITE: TLSv1 Change Cipher Spec, length = 1

[Raw write]: length = 6

0000: 14 03 01 00 01 01

... a troca de cifra é enviada com sucesso

..Finished

É enviada pelo cliente uma mensagem de Finished para validar que a comunicação funciona bem.

verify_data: { 221, 96, 47, 110, 19, 170, 244, 8, 37, 152, 160, 40 }

O cliente faz o teste encriptando os dados com sucesso..

[write] MD5 and SHA1 hashes: len = 16

0000: 14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28 .....`/n....%..(

Padded plaintext before ENCRYPTION: len = 48

0000: 14 00 00 0C DD 60 2F 6E 13 AA F4 08 25 98 A0 28 .....`/n....%..(

0010: 10 7F 85 11 EC 6D 5D ED 21 70 27 F4 DC 23 C0 9B .....m].!p'..#..

0020: A7 6F C2 80 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B .o..............

main, WRITE: TLSv1 Handshake, length = 48

...e envia os dados de teste para o servidor por forma a que o servidor faça o mesmo teste e confirme que a comunicação encriptada pode ser usada (53 bytes = 48 do teste + 5 do header).

[Raw write]: length = 53

0000: 16 03 01 00 30 1C 17 08 0F 49 C9 6A 7A 8B 8C 48 ....0....I.jz..H

0010: BA 57 2D CB 06 46 1E 65 61 7C 5F 74 F2 08 AB 12 .W-..F.ea._t....

0020: 91 47 72 8C 8F 84 0A CB D7 29 E2 FD 84 B2 FD 9E .Gr......)......

0030: 47 DC 13 60 B4 G..`.

... e o servidor fecha a conecção dando origem a um erro EOFException

main, received EOFException: error

main, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed

connection during handshake

%% Invalidated: [session-1, TLS_RSA_WITH_AES_128_CBC_SHA]

main, SEND TLSv1 ALERT: fatal, description = handshake_failure

Padded plaintext before ENCRYPTION: len = 32

0000: 02 28 BC 65 1A CA 68 87 79 84 5F 64 16 F5 28 72 .(.e..h.y._d..(r

0010: F7 8A 69 72 93 D8 09 09 09 09 09 09 09 09 09 09 ..ir............

main, WRITE: TLSv1 Alert, length = 32

[Raw write]: length = 37

0000: 15 03 01 00 20 0D 9A 35 18 B7 98 4B 7B AF 82 4E .... ..5...K...N

0010: 1A EE 7D AC 5D D5 49 05 4E 74 B9 77 E4 CD 87 61 ....].I.Nt.w...a

0020: 23 03 5C 9C 7E #...

main, called closeSocket()

main, called close()

main, called closeInternal(true)

Não consigo entender qual a causa do problema nem como posso programaticamente influenciar o resultado. Forcei o uso de outras cifras suportadas por cliente e servidor como seja o SSL_RSA_WITH_RC4_128_MD5 escrevendo uma classe que extende a SSLSocketFactory mas o erro mantém-se exactamente igual.

Alguma ideia sobre como resolver este problema? Estará a causa do lado do servidor da AT?

Estás a trabalhar com o endereço de testes ou de produção?

Instalaste o certificado?

Estás a enviá-lo na ligação?

Qual o endereço que estás a usar?

Se estás em ambiente de produção, tens que gerar o ficheiro .pfx (certificado) a partir do .cer que te enviaram.

Carlos Matos 💪

Link to comment
Share on other sites

O certificado de que falas é o ficheiro .cer que te enviaram após submeteres o CSR?

Não sei em que sistema trabalhas mas no Windows, tens que gerar o certificado com extensão .pfx, de modo a que o Windows o reconheça, instalá-lo (o .pfx) e a seguir usares este na tua ligação em que efetuas o pedido.

Se quiseres o comando de como gerares o .pfx, diz que eu digo-te.

Estás a trabalhar com o endereço de testes ou de produção?

Instalaste o certificado?

Estás a enviá-lo na ligação?

Qual o endereço que estás a usar?

Se estás em ambiente de produção, tens que gerar o ficheiro .pfx (certificado) a partir do .cer que te enviaram.

Opa estou chegando lá fiz o procedimento com o openssl para gerar o pfx (não sei se está certo), agora quando envio da o seguinte erro Pedido abortado: Não foi possível criar um canal seguro SSL/TLS. se puderes posta ai o comando para gerar o pfx obrigado.

Cumps

Link to comment
Share on other sites

O certificado de que falas é o ficheiro .cer que te enviaram após submeteres o CSR?

Não sei em que sistema trabalhas mas no Windows, tens que gerar o certificado com extensão .pfx, de modo a que o Windows o reconheça, instalá-lo (o .pfx) e a seguir usares este na tua ligação em que efetuas o pedido.

Se quiseres o comando de como gerares o .pfx, diz que eu digo-te.

Estás a trabalhar com o endereço de testes ou de produção?

Instalaste o certificado?

Estás a enviá-lo na ligação?

Qual o endereço que estás a usar?

Se estás em ambiente de produção, tens que gerar o ficheiro .pfx (certificado) a partir do .cer que te enviaram.

Obrigado pela resposta.

Estou a trabalhar com o endereço de testes.

Para a criação da conecção SSL uso a keystore "Testes Web services.pfx" e para a validação do certificado que é enviado pelo servidor não uso a truststore do sistema que no meu caso é "C:\Program Files\Java\jdk1.7.0_11\jre\lib\security\cacerts" mas sim um ficheiro jks designado por truststore que vem incluido com as sources do programa de exemplo publicado no site e que basicamente inclui varios certificados da Administração Tributaria. Para a encriptação dos campos estou a usar os certificados SA incluidos num keystore designado por saPubKey.jks que vem com o codigo fonte de exemplo. Este ficheiro inclui 2 certificados sapubkey.testes e sapubkey.prod que são usados pela referida aplicação de exemplo para usar nos ambientes de Teste e PRD. Estou a usar a chave publica do certificado sapubkey.testes para encriptar o campo da chave simetrica tal como vem no codigo de exemplo.

Repara que na fase em que dá o erro ainda não foi enviada a mensagem soap pelo que a haver um erro qualquer na encriptação dos campos seria reportado após a fase de handshake em que o cliente e o servidor estão a negociar a forma de comunicação. Quanto à qualidade dos certificados nas fases anteriores de handshaking que eu não inclui integralmente no post por ser muito extenso, o cliente e o servidor trocam certificados com sucesso.

Estou a usar o endereço https://servicos.portaldasfinancas.gov.pt:700/fews/faturas

Edited by jlmsilva
Link to comment
Share on other sites

Opa estou chegando lá fiz o procedimento com o openssl para gerar o pfx (não sei se está certo), agora quando envio da o seguinte erro Pedido abortado: Não foi possível criar um canal seguro SSL/TLS. se puderes posta ai o comando para gerar o pfx obrigado.

Cumps

Utiliza este endereço para criares o .pfx

https://www.sslshopper.com/ssl-converter.html

Obrigado pela resposta.

Estou a trabalhar com o endereço de testes.

Para a criação da conecção SSL uso a keystore "Testes Web services.pfx" e para a validação do certificado que é enviado pelo servidor não uso a truststore do sistema que no meu caso é "C:\Program Files\Java\jdk1.7.0_11\jre\lib\security\cacerts" mas sim um ficheiro jks designado por truststore que vem incluido com as sources do programa de exemplo publicado no site e que basicamente inclui varios certificados da Administração Tributaria. Para a encriptação dos campos estou a usar os certificados SA incluidos num keystore designado por saPubKey.jks que vem com o codigo fonte de exemplo. Este ficheiro inclui 2 certificados sapubkey.testes e sapubkey.prod que são usados pela referida aplicação de exemplo para usar nos ambientes de Teste e PRD. Estou a usar a chave publica do certificado sapubkey.testes para encriptar o campo da chave simetrica tal como vem no codigo de exemplo.

Repara que na fase em que dá o erro ainda não foi enviada a mensagem soap pelo que a haver um erro qualquer na encriptação dos campos seria reportado após a fase de handshake em que o cliente e o servidor estão a negociar a forma de comunicação. Quanto à qualidade dos certificados nas fases anteriores de handshaking que eu não inclui integralmente no post por ser muito extenso, o cliente e o servidor trocam certificados com sucesso.

Estou a usar o endereço https://servicos.portaldasfinancas.gov.pt:700/fews/faturas

Verifica se o certificado que estás a usar não é o que expirou a 31.12.2012. Existe um outro que expira a 31.06.2013.

Carlos Matos 💪

Link to comment
Share on other sites

Utiliza este endereço para criares o .pfx

https://www.sslshopper.com/ssl-converter.html

Verifica se o certificado que estás a usar não é o que expirou a 31.12.2012. Existe um outro que expira a 31.06.2013.

Para quê criar um pfx se o ficheiro já está em .pfx? Ou a chave publica também tem de ser em pfx? No meu

caso que programo em PHP só aceita PEM.

Pessoal ontem estive na sessão de esclarecimento da ASSOFT dada na AT

e eles assumem muita falta de informação mas parece que vão actualizar manuais e dar mais apoio.

Os emails que eles não responderam até agora devem de enviar novamente para que eles respondam.

As facturas via webservice devem ser enviadas até 25 de Fevereiro e poderá haver alterações no WSDL

e em outros assuntos.

Abraço a todos e fica a informação

Link to comment
Share on other sites

Boa tarde Cu5co,

Tinhas toda a razão, tenho 2 ficheiros "testesWebservices.pfx" e "testes web services.pfx" e estava a usar o errado que caducou e que vem com o programa de teste, ultima versão.

Agora já comunico com o webservice e estou a ter um erro "Nonce: Não foi possível decifrar o campo" porque provavelmente também estou a usar o certificado errado apesar de ter validado e esses estarem no prazo de validade. Está visto que não me posso fiar no programa de demonstração.

Obrigado

Link to comment
Share on other sites

Boa tarde Cu5co,

Tinhas toda a razão, tenho 2 ficheiros "testesWebservices.pfx" e "testes web services.pfx" e estava a usar o errado que caducou e que vem com o programa de teste, ultima versão.

Agora já comunico com o webservice e estou a ter um erro "Nonce: Não foi possível decifrar o campo" porque provavelmente também estou a usar o certificado errado apesar de ter validado e esses estarem no prazo de validade. Está visto que não me posso fiar no programa de demonstração.

Obrigado

Boas jlmsilva

Essa erro pode ter a ver não com o certificado mas sim com a maneira como cifras o campo,

digo isto porque ontem na sessão de esclarecimento eles falaram sobre isso e que usam uma fórmula

para decifrar a cifra e senão tiver de acordo é possível que dê esse erro e parece que é o que está

a dar mais problemas, são mesmo as cifras.

A fórmula que usam é algo do género: Nonce=Base64(Ckaes,ecb,pkcs5(SenhaAF)).

Abraço

Link to comment
Share on other sites

lol onde está esse arquivo ChavePublicaAT.cer? eu não recebi isso só recebi o TestesWebServices.pfx!!, continuo com o problema de encriptação do campo nonce (erro 8): já recebi o certificado definitivo das finanças e o transformei em pfx mesmo assim da o mesmo erro acredito que seja na encriptação por isso coloco a função que estou usando para encriptar em vb.net:

Public Sub encriptSenhas()
 Dim CaminhoChavePublica As String = "P:\natural\503834327.pfx" '"p:\natural\503834327.cer"
 ' Variaveis a encriptar
 Dim PassFinancas As String = "natural" ' "TESTEwebservice"
 Dim DataCriacao As String = Date.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.ff") & "Z"
 ' Carregar chave pública
 Dim certCP As New X509Certificate2
 certCP.Import(CaminhoChavePublica, PassFinancas, X509KeyStorageFlags.DefaultKeySet)
 Dim ChavePublica As String = certCP.PublicKey.Key.ToXmlString(False)
 Dim aleatorios As New Random()

 Dim ChaveSimetrica(15) As Byte
 'Dim ChaveSimetrica As Byte() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 14, 15, 16}
 'ChaveSimetrica = sal
 aleatorios.NextBytes(ChaveSimetrica)
 ' Inserir Chave Simetrica nos parametros de encriptação
 Dim rijn As SymmetricAlgorithm = SymmetricAlgorithm.Create()
 rijn.Key = ChaveSimetrica
 rijn.IV = ChaveSimetrica
 rijn.Mode = CipherMode.ECB
 rijn.Padding = PaddingMode.PKCS7


 ' Encriptar password das financas
 Dim msPassFinancas As New MemoryStream
 Dim csPassFinancas As New CryptoStream(msPassFinancas, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write)
 Using swPassFinancas As New StreamWriter(csPassFinancas)
	 swPassFinancas.Write(PassFinancas)
 End Using


 ' Encriptar data de criação
 Dim msDataCriacao As New MemoryStream
 Dim csDataCriacao As New CryptoStream(msDataCriacao, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write)
 Using swDataCriacao As New StreamWriter(csDataCriacao)
	 swDataCriacao.Write(DataCriacao, 0, DataCriacao)
	 csDataCriacao.FlushFinalBlock()
 End Using
 ' Converter de bytes para string
 Dim PassFinancasEncriptada As String = System.Convert.ToBase64String(msPassFinancas.ToArray())
 encryptPass = PassFinancasEncriptada
 Dim DataCriacaoEncriptada As String = System.Convert.ToBase64String(msDataCriacao.ToArray())
 encryptDate = DataCriacaoEncriptada
 ' Encriptar a chave simetrica com o algoritmo RSA e com a chave pública
 Dim AlgRSA As New RSACryptoServiceProvider
 AlgRSA.FromXmlString(ChavePublica)
 Dim Chave() As Byte = AlgRSA.Encrypt(ChaveSimetrica, False)

 Dim ChaveSimetricaEncriptada As String = System.Convert.ToBase64String(Chave)
 rsaPublicKey = ChaveSimetricaEncriptada


End Sub

me ajudem !!

Link to comment
Share on other sites

Boas pessoal,

Para quem está a programar em PHP podem-me ajudar e dizer-me se o que estou a fazer está bem?

Posto aqui o código para ver se me conseguem ajudar.

public function setXML($xml)
{
	$this->xml = $xml;


}


public function setHeaders($action)
{
	$this->headers = array(
	 'Content-type: text/xml;charset="utf-8"',
	 'Accept: text/xml',
	 'Cache-Control: no-cache',
	 'Pragma: no-cache',
		'SOAPAction: "' . $action . '"',
	 'Content-length: '. strlen($this->xml),
	);
}

public function process($url)
{
	$soap = curl_init();


	curl_setopt($soap, CURLOPT_URL, "http://info.portaldasfinancas.gov.pt/NR/rdonlyres/02357996-29FC-4F11-9F1D-6EA2B9210D60/0/factemiws.wsdl");
	//curl_setopt($soap, CURLOPT_CAPATH, '');
	//curl_setopt($soap, CURLOPT_CAINFO,  '');
	curl_setopt($soap, CURLOPT_SSLCERT ,  "C:\wwwroot\www-php\projects\foxfact\TestesWebServices.pem" );
	curl_setopt($soap, CURLOPT_SSLKEY ,  "C:\wwwroot\www-php\projects\foxfact\TestesWebServices.pem" );
	curl_setopt($soap, CURLOPT_SSLCERTPASSWD ,  "TESTEwebservice" );
	curl_setopt($soap, CURLOPT_SSLVERSION, 3);
	curl_setopt($soap, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($soap, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($soap, CURLOPT_CONNECTTIMEOUT, 20);
	curl_setopt($soap, CURLOPT_TIMEOUT,		15);
	curl_setopt($soap, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($soap, CURLOPT_POST,		   true);
	curl_setopt($soap, CURLOPT_POSTFIELDS,	 $this->xml);
	curl_setopt($soap, CURLOPT_HTTPHEADER,	 $this->headers);

	$result = curl_exec($soap);

	if (curl_errno($soap) > 0) {
		$result = array('errocurl' => curl_errno($soap), 'msgcurl' => curl_error($soap));
		echo curl_error($soap);
		// $result = false;
	}

	curl_close($soap);

	return $result;

}
}
Link to comment
Share on other sites

Boa tarde Cu5co,

Tinhas toda a razão, tenho 2 ficheiros "testesWebservices.pfx" e "testes web services.pfx" e estava a usar o errado que caducou e que vem com o programa de teste, ultima versão.

Agora já comunico com o webservice e estou a ter um erro "Nonce: Não foi possível decifrar o campo" porque provavelmente também estou a usar o certificado errado apesar de ter validado e esses estarem no prazo de validade. Está visto que não me posso fiar no programa de demonstração.

Obrigado

Bom dia,

só recebi um ficheiro pfx "Testes Web services.pfx", acompanhado pela chave pública "ChavePublicaAT.cer". O certificado expirou a 31-12-2012. Como se obtém então o novo ficheiro pfx, que só expira a 31-06-2013?

Obrigada

Link to comment
Share on other sites

lol onde está esse arquivo ChavePublicaAT.cer? eu não recebi isso só recebi o TestesWebServices.pfx!!, continuo com o problema de encriptação do campo nonce (erro 8): já recebi o certificado definitivo das finanças e o transformei em pfx mesmo assim da o mesmo erro acredito que seja na encriptação por isso coloco a função que estou usando para encriptar em vb.net:

Public Sub encriptSenhas()
 Dim CaminhoChavePublica As String = "P:\natural\503834327.pfx" '"p:\natural\503834327.cer"
 ' Variaveis a encriptar
 Dim PassFinancas As String = "natural" ' "TESTEwebservice"
 Dim DataCriacao As String = Date.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.ff") & "Z"
 ' Carregar chave pública
 Dim certCP As New X509Certificate2
 certCP.Import(CaminhoChavePublica, PassFinancas, X509KeyStorageFlags.DefaultKeySet)
 Dim ChavePublica As String = certCP.PublicKey.Key.ToXmlString(False)
 Dim aleatorios As New Random()

 Dim ChaveSimetrica(15) As Byte
 'Dim ChaveSimetrica As Byte() = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 14, 15, 16}
 'ChaveSimetrica = sal
 aleatorios.NextBytes(ChaveSimetrica)
 ' Inserir Chave Simetrica nos parametros de encriptação
 Dim rijn As SymmetricAlgorithm = SymmetricAlgorithm.Create()
 rijn.Key = ChaveSimetrica
 rijn.IV = ChaveSimetrica
 rijn.Mode = CipherMode.ECB
 rijn.Padding = PaddingMode.PKCS7


 ' Encriptar password das financas
 Dim msPassFinancas As New MemoryStream
 Dim csPassFinancas As New CryptoStream(msPassFinancas, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write)
 Using swPassFinancas As New StreamWriter(csPassFinancas)
	 swPassFinancas.Write(PassFinancas)
 End Using


 ' Encriptar data de criação
 Dim msDataCriacao As New MemoryStream
 Dim csDataCriacao As New CryptoStream(msDataCriacao, rijn.CreateEncryptor(rijn.Key, rijn.IV), CryptoStreamMode.Write)
 Using swDataCriacao As New StreamWriter(csDataCriacao)
	 swDataCriacao.Write(DataCriacao, 0, DataCriacao)
	 csDataCriacao.FlushFinalBlock()
 End Using
 ' Converter de bytes para string
 Dim PassFinancasEncriptada As String = System.Convert.ToBase64String(msPassFinancas.ToArray())
 encryptPass = PassFinancasEncriptada
 Dim DataCriacaoEncriptada As String = System.Convert.ToBase64String(msDataCriacao.ToArray())
 encryptDate = DataCriacaoEncriptada
 ' Encriptar a chave simetrica com o algoritmo RSA e com a chave pública
 Dim AlgRSA As New RSACryptoServiceProvider
 AlgRSA.FromXmlString(ChavePublica)
 Dim Chave() As Byte = AlgRSA.Encrypt(ChaveSimetrica, False)

 Dim ChaveSimetricaEncriptada As String = System.Convert.ToBase64String(Chave)
 rsaPublicKey = ChaveSimetricaEncriptada


End Sub

me ajudem !!

O ficheiro ChavePublicaAT.cer veio por mail num zip junto com o TestesWebservices.pfx (o ficheiro actualizado não tem espaços no nome) em resposta ao pedido enviado para

asi-psws@at.gov.pt.

Link to comment
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.