Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

cjulio

Utilizar Webservices da AT

Recommended Posts

Solskajer
26 minutos atrás, iSilva disse:

Boa tarde!

Alguém com problemas na comunicação dos documentos?

Confirmo. De norte a sul do país está a dar erro 33.

Share this post


Link to post
Share on other sites
iSilva
5 minutes ago, Solskajer said:

Confirmo. De norte a sul do país está a dar erro 33.

Pois, as entregas do IRS rebentam com o sistema dos moços 😁

Share this post


Link to post
Share on other sites
ArturRibeiro

também estamos com problemas desde as 15:30h aproximadamente

Share this post


Link to post
Share on other sites
Solskajer
Agora, iSilva disse:

Pois, as entregas do IRS rebentam com o sistema dos moços 😁

Pois, hoje é o primeiro dia de entrega do IRS... mentira 🤣 Nem entregas o IRS, nem fazes mais nada na AT.

Share this post


Link to post
Share on other sites
Felipe K

Olá, estou desenvolvendo a comunicação com a AT.

Atualmente estou usando o NIF 599999993/37 para testes, usando o endereço

https://servicos.portaldasfinancas.gov.pt:701/sgdtws/documentosTransporte

tenho o retorno da AT como "OK". 

Estou tentando pesquisar no link abaixo mas o documento não aparece na consulta.

https://faturas.portaldasfinancas.gov.pt/DocTransporte/consultarDocsTransp.action

Alguém sabe me dizer onde posso consultar este documento de teste?

 

Share this post


Link to post
Share on other sites
PauloDuarte

Boa Tarde,

Um cliente meu está tendo bastante dificuldades em comunicar guias de transporte no ambiente de testes

Eles utilizam um produto middleware da Oracle que utilza um application server weblogic para fazer o handshake. 

Basicamente  os certificados estão guardados em keystores do próprio weblogic.

Na keystore demotrust (ssl store) , adicionei todos os certificados que extrai do pfx de testes e na demoidentity adicionei a chave privada que tambem extrai do pfx de testes, uma vez que o weblogic não suporta ficheiros .pfx

 

Verifiquei no fórum que existe um certificado emitido pela "COMODO" que é necessário instalar. Alguém me sabe dizer se este certificado tem que ser instalado na trust store? Já agora , como é que consigo obter esse ceritficado? Ná pagina onde se fazem os downloads do certificados não consigo encontrar nenhum certificado emitido por esta entidade.  EDIT Verifiquei que o cliente já tem este certificado INSTALADO na sua keystore

 

Depois de analisar os ssl logs consigo perceber que o nosso servidor confia no servidor da AT, uma vez que tenho nos logs que foi encontrado um "trusted certificate"

** ClientHello, TLSv1.2
RandomCookie:  GMT: 1537440430 bytes = { 117, 12, 199, 177, 196, 115, 8, 242, 142, 115, 16, 223, 132, 130, 174, 203, 23, 112, 150, 152, 218, 202, 27, 136, 230, 48, 162, 92 }
Session ID:  {}
Cipher Suites: [TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
Compression Methods:  { 0 }
Extension elliptic_curves, curve names: {secp256r1, sect163k1, sect163r2, secp192r1, secp224r1, sect233k1, sect233r1, sect283k1, sect283r1, secp384r1, sect409k1, sect409r1, secp521r1, sect571k1, sect571r1, secp160k1, secp160r1, secp160r2, sect163r1, secp192k1, sect193r1, sect193r2, secp224k1, sect239k1, secp256k1}
Extension ec_point_formats, formats: [uncompressed]
Extension signature_algorithms, signature_algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA224withECDSA, SHA224withRSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA
Extension server_name, server_name: [type=host_name (0), value=servicos.portaldasfinancas.gov.pt]
***

 

Found trusted certificate:
[
[
  Version: V3
  Subject: CN=COMODO RSA Organization Validation Secure Server CA, O=COMODO CA Limited, L=Salford, ST=Greater Manchester, C=GB
  Signature Algorithm: SHA384withRSA, OID = 1.2.840.113549.1.1.12

  Key:  Sun RSA public key, 2048 bits
  modulus: 23364367789036248764590828559588945800909566501163552850831319026372050621561141974867931129224289911597268001113115319922107502170172386798023552044795591961279900983716424910423503821711700982244292822879352157001097904621813115928692278219697856090754314902955943857790735148714110025435709131947757760267515265061518866212636001729393009489201641719809777246465916057529290521495765725771731634778646123645562584934347526131342668094157399273643290137423132170132315316173819420457265551254978415915289520899948162548523911781373038947884090061597540073867393017150592856570521601968313241771358805248224596500073
  public exponent: 65537
  Validity: [From: Wed Feb 12 00:00:00 GMT 2014,
               To: Sun Feb 11 23:59:59 GMT 2029]
  Issuer: CN=COMODO RSA Certification Authority, O=COMODO CA Limited, L=Salford, ST=Greater Manchester, C=GB
  SerialNumber: [    36825e7f b5a48193 7ef6d173 6bb93ca6]

Certificate Extensions: 8
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
  [
   accessMethod: caIssuers
   accessLocation: URIName: http://crt.comodoca.com/COMODORSAAddTrustCA.crt

   accessMethod: ocsp
   accessLocation: URIName: http://ocsp.comodoca.com
]

 

O problema parece estar relacionado com a nossa autentição quando é feito o server hello:

Inicio do Server Hello:

ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', READ: TLSv1.2 Handshake, length = 85
*** ServerHello, TLSv1.2
RandomCookie:  GMT: 2083778171 bytes = { 45, 234, 212, 68, 66, 254, 210, 127, 247, 74, 123, 82, 141, 50, 57, 131, 54, 48, 236, 43, 229, 121, 70, 34, 14, 222, 58, 152 }
Session ID:  {124, 52, 238, 123, 45, 234, 212, 68, 66, 254, 210, 127, 247, 74, 123, 82, 141, 50, 57, 131, 54, 48, 236, 43, 229, 121, 70, 34, 14, 222, 58, 152}
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256
Compression Method: 0
Extension server_name, server_name: 
Extension renegotiation_info, renegotiated_connection: <empty>

 

Certificate request:

*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withRSA, Unknown (hash:0x6, signature:0x2), SHA512withECDSA, SHA384withRSA, Unknown (hash:0x5, signature:0x2), SHA384withECDSA, SHA256withRSA, Unknown (hash:0x4, signature:0x2), SHA256withECDSA, SHA224withRSA, Unknown (hash:0x3, signature:0x2), SHA224withECDSA, SHA1withRSA, SHA1withDSA, SHA1withECDSA
Cert Authorities:
<Empty>
[read] MD5 and SHA1 hashes:  len = 42
0000: 0D 00 00 26 03 01 02 40   00 1E 06 01 06 02 06 03  ...&...@........
0010: 05 01 05 02 05 03 04 01   04 02 04 03 03 01 03 02  ................
0020: 03 03 02 01 02 02 02 03   00 00                    ..........
*** ServerHelloDone
[read] MD5 and SHA1 hashes:  len = 4
0000: 0E 00 00 00                                        ....
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>

 

Acho que a chave do meu problema está nesta mensagem de erro:

 

Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>

 

Alguem me consegur explicar que certificado o servidor está á espera que enviemos?

 

Depois no tenho tenho o erro final de handshake o seguinte erro:weblogic.kernel.Default (self-tuning)', handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed

 

** ClientKeyExchange, RSA PreMasterSecret, TLSv1.2
[write] MD5 and SHA1 hashes:  len = 269
0000: 0B 00 00 03 00 00 00 10   00 01 02 01 00 AE 7C E2  ................
0010: B8 E9 27 36 09 86 F5 50   8F EE 51 31 E6 1D 3F 35  ..'6...P..Q1..?5
0020: 50 05 7E 21 0B D7 01 9C   D0 FE 20 2B 8F 57 C7 C6  P..!...... +.W..
0030: 19 EE B3 BD 33 22 35 F3   F8 EC F7 6D 98 C5 A7 51  ....3"5....m...Q
0040: 98 7F 61 24 39 AD 43 76   C5 94 C9 EF 38 D8 B0 2A  ..a$9.Cv....8..*
0050: 8B EC C7 A6 F5 4A 19 FC   DF 70 58 41 F0 CA 8E 3E  .....J...pXA...>
0060: FF 4A B0 ED 8D BE 25 ED   99 9B 41 34 EF 09 DD 00  .J....%...A4....
0070: 2B A4 11 3B 85 60 7A 13   E1 C1 B5 2A D8 22 DB 60  +..;.`z....*.".`
0080: 5C 62 E9 4A 53 B2 88 E6   30 F7 0C 38 06 84 90 2E  \b.JS...0..8....
0090: 5F 49 36 67 FF D0 9A 08   09 6C C1 E7 6C 09 D2 E6  _I6g.....l..l...
00A0: 91 76 BA 32 9F 06 D6 0F   49 DC A9 74 17 D7 D7 5C  .v.2....I..t...\
00B0: 90 FE 79 E4 E5 30 D0 EC   D2 D5 A5 8B 76 74 D5 30  ..y..0......vt.0
00C0: EC A7 4C 1A F5 E7 7A 99   E0 05 63 4C 8B 90 88 6D  ..L...z...cL...m
00D0: 6E 64 63 89 C2 AB 25 BB   53 0A 76 3F 44 CA 2E EA  ndc...%.S.v?D...
00E0: 42 A2 5D 7C 21 23 34 92   28 80 C2 00 24 99 60 2C  B.].!#4.(...$.`,
00F0: 29 6B 50 2A A2 09 C3 FE   FE E2 E2 C1 B9 F8 6E 73  )kP*..........ns
0100: 2D 5B 17 4B B6 15 DC 3C   1F 75 95 16 0D           -[.K...<.u...
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', WRITE: TLSv1.2 Handshake, length = 269
[Raw write]: length = 274
0000: 16 03 03 01 0D 0B 00 00   03 00 00 00 10 00 01 02  ................
0010: 01 00 AE 7C E2 B8 E9 27   36 09 86 F5 50 8F EE 51  .......'6...P..Q
0020: 31 E6 1D 3F 35 50 05 7E   21 0B D7 01 9C D0 FE 20  1..?5P..!...... 
0030: 2B 8F 57 C7 C6 19 EE B3   BD 33 22 35 F3 F8 EC F7  +.W......3"5....
0040: 6D 98 C5 A7 51 98 7F 61   24 39 AD 43 76 C5 94 C9  m...Q..a$9.Cv...
0050: EF 38 D8 B0 2A 8B EC C7   A6 F5 4A 19 FC DF 70 58  .8..*.....J...pX
0060: 41 F0 CA 8E 3E FF 4A B0   ED 8D BE 25 ED 99 9B 41  A...>.J....%...A
0070: 34 EF 09 DD 00 2B A4 11   3B 85 60 7A 13 E1 C1 B5  4....+..;.`z....
0080: 2A D8 22 DB 60 5C 62 E9   4A 53 B2 88 E6 30 F7 0C  *.".`\b.JS...0..
0090: 38 06 84 90 2E 5F 49 36   67 FF D0 9A 08 09 6C C1  8...._I6g.....l.
00A0: E7 6C 09 D2 E6 91 76 BA   32 9F 06 D6 0F 49 DC A9  .l....v.2....I..
00B0: 74 17 D7 D7 5C 90 FE 79   E4 E5 30 D0 EC D2 D5 A5  t...\..y..0.....
00C0: 8B 76 74 D5 30 EC A7 4C   1A F5 E7 7A 99 E0 05 63  .vt.0..L...z...c
00D0: 4C 8B 90 88 6D 6E 64 63   89 C2 AB 25 BB 53 0A 76  L...mndc...%.S.v
00E0: 3F 44 CA 2E EA 42 A2 5D   7C 21 23 34 92 28 80 C2  ?D...B.].!#4.(..
00F0: 00 24 99 60 2C 29 6B 50   2A A2 09 C3 FE FE E2 E2  .$.`,)kP*.......
0100: C1 B9 F8 6E 73 2D 5B 17   4B B6 15 DC 3C 1F 75 95  ...ns-[.K...<.u.
0110: 16 0D                                              ..
SESSION KEYGEN:
PreMaster Secret:
0000: 03 03 7C 03 88 B7 2B 20   EC 21 C0 D5 C3 CE 41 4F  ......+ .!....AO
0010: 02 11 C1 27 26 DA 53 D9   00 28 DE A9 A7 52 88 50  ...'&.S..(...R.P
0020: FA 14 A1 CE 47 37 87 C7   41 75 D8 9B E1 7A AC 2A  ....G7..Au...z.*
CONNECTION KEYGEN:
Client Nonce:
0000: 5C A3 7B AE 75 0C C7 B1   C4 73 08 F2 8E 73 10 DF  \...u....s...s..
0010: 84 82 AE CB 17 70 96 98   DA CA 1B 88 E6 30 A2 5C  .....p.......0.\
Server Nonce:
0000: 7C 34 EE 7B 2D EA D4 44   42 FE D2 7F F7 4A 7B 52  .4..-..DB....J.R
0010: 8D 32 39 83 36 30 EC 2B   E5 79 46 22 0E DE 3A 98  .29.60.+.yF"..:.
Master Secret:
0000: D6 98 01 29 6D AE 20 F7   E0 CA 05 25 B1 28 97 D7  ...)m. ....%.(..
0010: 95 3A E1 86 5A 09 37 FC   76 60 A6 1E EF 2E 4C 71  .:..Z.7.v`....Lq
0020: 46 76 C9 F9 1D 92 DE 99   96 EC F0 D6 2C 5B 24 3E  Fv..........,[$>
Client MAC write Secret:
0000: 55 DE 1E D5 80 06 C6 DF   6F FC A6 A1 BE 8E DA 4C  U.......o......L
0010: 40 82 EF 0E 51 E2 9B 45   83 00 55 B4 1C 70 CA C8  @...Q..E..U..p..
Server MAC write Secret:
0000: B4 7D 28 14 2C A5 39 FA   00 29 E9 B6 04 7E 4F 53  ..(.,.9..)....OS
0010: C8 75 98 69 CE 0A B6 1E   60 20 B0 9B EA 65 9A E0  .u.i....` ...e..
Client write key:
0000: B0 1B D0 5A 04 DF F8 7B   63 F7 73 A8 59 FD 0F C6  ...Z....c.s.Y...
Server write key:
0000: 71 31 62 10 E8 03 06 59   92 75 BA 3E 05 55 B7 08  q1b....Y.u.>.U..
... no IV derived for this protocol
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', WRITE: TLSv1.2 Change Cipher Spec, length = 1
[Raw write]: length = 6
0000: 14 03 03 00 01 01                                  ......
*** Finished
verify_data:  { 178, 36, 139, 228, 93, 237, 138, 11, 69, 46, 124, 90 }
***
[write] MD5 and SHA1 hashes:  len = 16
0000: 14 00 00 0C B2 24 8B E4   5D ED 8A 0B 45 2E 7C 5A  .....$..]...E..Z
Padded plaintext before ENCRYPTION:  len = 80
0000: CD 6D DD 4A B9 C2 52 07   29 E0 39 93 B5 75 4E 81  .m.J..R.).9..uN.
0010: 14 00 00 0C B2 24 8B E4   5D ED 8A 0B 45 2E 7C 5A  .....$..]...E..Z
0020: E7 0C 6B 8A B9 11 2E 52   63 20 0F 8E CC 32 DC 87  ..k....Rc ...2..
0030: 31 F4 05 62 3C C5 23 31   45 75 48 5A F5 0E B7 AE  1..b<.#1EuHZ....
0040: 0F 0F 0F 0F 0F 0F 0F 0F   0F 0F 0F 0F 0F 0F 0F 0F  ................
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', WRITE: TLSv1.2 Handshake, length = 80
[Raw write]: length = 85
0000: 16 03 03 00 50 99 0F 1E   FF C7 BB D7 C4 1F 02 17  ....P...........
0010: 31 A1 3F 2C 29 E1 B0 C8   94 01 7E 13 DB 73 75 AC  1.?,)........su.
0020: EA EF 0D E7 14 6A 99 83   D3 61 31 9A 7D 10 67 2F  .....j...a1...g/
0030: 9C 03 87 07 C2 D8 23 7D   7D 6C AC 77 BB 29 E0 93  ......#..l.w.)..
0040: 9E A0 72 EF 2B 5A 74 A4   7D 39 B8 D3 F9 CA 3A 74  ..r.+Zt..9....:t
0050: A9 57 D9 14 9D                                     .W...
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', received EOFException: error
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
%% Invalidated:  [Session-9, TLS_RSA_WITH_AES_128_CBC_SHA256]
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', SEND TLSv1.2 ALERT:  fatal, description = handshake_failure
Padded plaintext before ENCRYPTION:  len = 64
0000: 2C 4D 50 7F 5D AF 59 4B   88 8A 96 19 33 9B 42 CA  ,MP.].YK....3.B.
0010: 02 28 1E E8 01 09 E1 19   C6 1F 2F 7D 87 96 58 73  .(......../...Xs
0020: 13 E7 57 70 0A 4C BF 77   E4 98 15 CA 2E C2 04 C7  ..Wp.L.w........
0030: 70 36 0D 0D 0D 0D 0D 0D   0D 0D 0D 0D 0D 0D 0D 0D  p6..............
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', WRITE: TLSv1.2 Alert, length = 64
[Raw write]: length = 69
0000: 15 03 03 00 40 7E 63 04   10 E2 E3 B4 0D EF 07 1B  ....@.c.........
0010: B0 62 65 4F 89 3E CC E6   5A CC 20 DA 75 5C 88 FC  .beO.>..Z. .u\..
0020: 1E E7 70 99 9A 66 F6 4E   7C E4 73 99 EA 23 50 3C  ..p..f.N..s..#P<
0030: 40 30 F9 00 89 AB E4 EF   6B 5D 9C E9 14 6C 5D 53  @0......k]...l]S
0040: 2D 27 B0 F7 B3                                     -'...
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', called closeSocket()
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', called close()
[ACTIVE] ExecuteThread: '7' for queue: 'weblogic.kernel.Default (self-tuning)', called closeInternal(true)

 

 

 

 

 

 

Alguem me pode ajudar? 

 

Muito obrigado.

 

Edited by PauloDuarte

Share this post


Link to post
Share on other sites
abrito
Em 27/03/2019 às 16:15, eandrade disse:

Boas, sei que não é estritamente relacionado com os Webservices da AT, mas preciso de alguma ajuda.

Estou a tentar fazer scrape da página de Faturas de Consumidor, no site do e-fatura, mas estou a ter dificuldades em fazer o login através de request POST. Obviamente, este tipo de operação não é "oficial", e documentação nem ver. Os poucos comentários que encontrei aqui no fórum foram dando algumas luzes, mas já têm uns anos e estou a bater em paredes.

Comentários que encontrei sobre o assunto:

https://www.portugal-a-programar.pt/forums/topic/74808-e-fatura-login-e-obter-detalhes-dos-documentos-do-adquirente/

https://www.portugal-a-programar.pt/forums/topic/57734-utilizar-webservices-da-at/?page=255#comment-591157

Este último tem um Excel com macros que supostamente fariam o que pretende, mas o login também falha no Excel.

O que estou a fazer:

Segundo estes comentários, é necessário fazer 2 POST requests para obter o cookie denominado SINGLE_DOMAIN_SSO_COOKIE. A partir dai, desde que esse cookie esteja presente em requests futuros e não tenha expirado, é possível fazer qualquer tipo de request a partir do endereço. Até aqui tudo bem.

Os problemas começam quando tento fazer o primeiro request POST, ao URL https://www.acesso.gov.pt/jsp/loginRedirectForm.jsp (Nota: tudo isto é em C#). Ao preencher a propriedade ContentType do objecto HttpWebRequest com "application/x-www-form-urlencoded", qualquer tipo de request dá-me sempre error 500 (internal server error).

O formato deste primeiro POST é algo deste género: https://www.acesso.gov.pt/jsp/loginRedirectForm.jsp?path=painelAdquirente.action&partID=EFPF&username=XXXX&password=XXXX

Se retirar o parâmetro ContentType, a página devolve-me um HTML válido, que lá pelo meio diz:

"Por motivos de ordem técnica não nos é possível responder ao seu pedido. Por favor tente mais tarde."

Ou seja, muito possivelmente não está a aceitar o que lhe estou a enviar. Devolve-me um par de cookies, mas nada relevante e não o que preciso. O segundo pedido, se deixar o código chegar até lá e usando os cookies recebidos, devolve-me apenas um JSON a dizer "Sessão inválida", como seria de esperar.

Deixo aqui o código que pode ser relevante, se alguém quiser testar e consiga ajudar:


			string UrlLoginAT = @"https://www.acesso.gov.pt/jsp/loginRedirectForm.jsp?";
			string formParams = "path=painelAdquirente.action&partID=EFPF"
                + "&username=" + HttpUtility.UrlEncode(UserNif) 
                + "&password=" + HttpUtility.UrlEncode(PasswordAT);

            // Request Login
            try
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(UrlLoginAT);
                req.Method = "POST";
                //req.ContentType = "application/x-www-form-urlencoded";
                req.AllowAutoRedirect = false;
                req.CookieContainer = cookieContainer;
                req.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0";
                
                byte[] bytes = Encoding.UTF8.GetBytes(formParams);
                req.ContentLength = bytes.Length;

                Stream reqStream = req.GetRequestStream();
                reqStream.Write(bytes, 0, bytes.Length);
                reqStream.Close();

                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

                // Guardar os cookies da resposta
                cookieHeader = resp.Headers["Set-cookie"];
                loginCookies = resp.Cookies;
                
				// Ler conteúdo
                using (Stream resStream = resp.GetResponseStream())
                {
                    Encoding encoding = Encoding.GetEncoding(resp.CharacterSet);
                    StreamReader sr = new StreamReader(resStream, encoding);
                    pageSource = sr.ReadToEnd();
                    sr.Close();
                }
            }
            catch (Exception ex)
            {
                return;
            }

Se alguém tiver uma ideia de como resolver este embrulhada, sou todo ouvidos. Não tenho experiência a fazer scrape de páginas web, e a pouquíssima informação disponível está a ajudar muito pouco.

Cumprimentos.

 

EDIT:

Consegui descobrir o porquê de não estar a passar daqui. Faltava-me adicionar alguns parâmetros ao POST. Neste código em cima, tirem o comentário do req.ContentType, e alterem a declaração do formParams para:

string formParams = "partID=EFPF"
                + "&username=" + HttpUtility.UrlEncode(UserNif)
                + "&password=" + HttpUtility.UrlEncode(PasswordAT)
                + "&authVersion=1"
                + "&selectedAuthMethod=N";

Assim já autentica com sucesso. Estou a ter mais uns problemas no próximo request, mas deve ser algo mínimo que me está a escapar. Boa sorte para quem precisar, espero que isto seja útil.

PS: O HttpUtility é uma extensão disponível no NuGet Packet Manager, não é nativo.

mesmo com essa alteração dos params, esta longe de fazer a autenticação certa. Nem sei como esta a conseguir a autenticação. Os params estão pela ordem errada e faltam alguns parametros. Acho que não esta entendendo como funciona um servidor web html based. Consegue entender como funciona um get e um post? Se fizer um parse do response consegue os params necessários  para a autenticação. Falta um parametro importante o "_csrf" e esse é dinamico, todas as vezes que tenta fazer login no site ele é diferente.

A ordem dos parametros é a seguinte.

path=consultarDocumentosAdquirente.action
partID=EFPF
authVersion=1
_csrf= valor retornado pelo get da primeira pagina
selectedAuthMethod=N
username=username
password=password
sbmtLogin=Entrar

 

Share this post


Link to post
Share on other sites
eandrade
13 hours ago, abrito said:

mesmo com essa alteração dos params, esta longe de fazer a autenticação certa. Nem sei como esta a conseguir a autenticação. Os params estão pela ordem errada e faltam alguns parametros. Acho que não esta entendendo como funciona um servidor web html based. Consegue entender como funciona um get e um post? Se fizer um parse do response consegue os params necessários  para a autenticação. Falta um parametro importante o "_csrf" e esse é dinamico, todas as vezes que tenta fazer login no site ele é diferente.

A ordem dos parametros é a seguinte.


path=consultarDocumentosAdquirente.action
partID=EFPF
authVersion=1
_csrf= valor retornado pelo get da primeira pagina
selectedAuthMethod=N
username=username
password=password
sbmtLogin=Entrar

 

Boas, obrigado pela resposta. Sim, o post original, mesmo depois do meu edit, ainda tinha informações em falta. Entretanto também descobri que faltavam os tais parâmetros que fala, nomeadamente o authVersion e selectedAuthMethod.

Quando à ordem dos parâmetros, pelo menos no meu caso, não parece fazer diferença, ele aceitou com uma ordem diferente da que deixou aqui.

Sobre o _csrf, eu também pensei que fosse importante, e logicamente fazia sentido, mas consegui obter o token de autenticação mesmo sem o incluir nos parâmetros do post. Estranho, eu sei, mas o facto é que funciona correctamente.

Entretanto com algum esforço já consegui listar todas as faturas de consumidor e obter os detalhes de cada uma individualmente, para os casos em que é necessário. Esta é mesmo daquelas coisas em que faria completo sentido disponibilizar um webservice para tal, aliás, a própria lista de faturas já é disponibilizada em json com o pedido certo. Não me cabe na cabeça que não exista webservice para tal, mas enfim.

Share this post


Link to post
Share on other sites
CarlosA
3 minutes ago, eandrade said:

Boas, obrigado pela resposta. Sim, o post original, mesmo depois do meu edit, ainda tinha informações em falta. Entretanto também descobri que faltavam os tais parâmetros que fala, nomeadamente o authVersion e selectedAuthMethod.

Quando à ordem dos parâmetros, pelo menos no meu caso, não parece fazer diferença, ele aceitou com uma ordem diferente da que deixou aqui.

Sobre o _csrf, eu também pensei que fosse importante, e logicamente fazia sentido, mas consegui obter o token de autenticação mesmo sem o incluir nos parâmetros do post. Estranho, eu sei, mas o facto é que funciona correctamente.

Entretanto com algum esforço já consegui listar todas as faturas de consumidor e obter os detalhes de cada uma individualmente, para os casos em que é necessário. Esta é mesmo daquelas coisas em que faria completo sentido disponibilizar um webservice para tal, aliás, a própria lista de faturas já é disponibilizada em json com o pedido certo. Não me cabe na cabeça que não exista webservice para tal, mas enfim.

Boa tarde,

Há algum tempo questionei se alguém teria algum código em excel para este efeito. Não sou programador, sou um mero user, autodidata.

É possível partilhar este seu código?

Share this post


Link to post
Share on other sites
abrito
6 minutos atrás, eandrade disse:

Boas, obrigado pela resposta. Sim, o post original, mesmo depois do meu edit, ainda tinha informações em falta. Entretanto também descobri que faltavam os tais parâmetros que fala, nomeadamente o authVersion e selectedAuthMethod.

Quando à ordem dos parâmetros, pelo menos no meu caso, não parece fazer diferença, ele aceitou com uma ordem diferente da que deixou aqui.

Sobre o _csrf, eu também pensei que fosse importante, e logicamente fazia sentido, mas consegui obter o token de autenticação mesmo sem o incluir nos parâmetros do post. Estranho, eu sei, mas o facto é que funciona correctamente.

Entretanto com algum esforço já consegui listar todas as faturas de consumidor e obter os detalhes de cada uma individualmente, para os casos em que é necessário. Esta é mesmo daquelas coisas em que faria completo sentido disponibilizar um webservice para tal, aliás, a própria lista de faturas já é disponibilizada em json com o pedido certo. Não me cabe na cabeça que não exista webservice para tal, mas enfim.

Também existia o Json dos detalhes, mas pelos vistos violava o RDPG e tiveram que tirar. Agora pode extrair o Json da resposta na consulta de detalhes e prosseguir a vida normalmente.

Share this post


Link to post
Share on other sites
eandrade
52 minutes ago, CarlosA said:

Boa tarde,

Há algum tempo questionei se alguém teria algum código em excel para este efeito. Não sou programador, sou um mero user, autodidata.

É possível partilhar este seu código?

Boas, o código que fiz é em C# e para uma empresa, pelo que não o posso partilhar na integra. Se precisar de algum detalhe específico sobre como fazer algum passo posso ajudar, mas o máximo que poderei fazer é deixar funções soltas e dicas. A função que deixei na página anterior já tem praticamente tudo o que é necessário para obter o cookie de login necessário para fazer qualquer pedido seguinte. Veja também o post do utilizador abrito nesta página, que contém a informação que é preciso alterar em relação aos parâmetros, de resto, deverá estar 100% funcional.

Quanto ao Excel em si, eu encontrei este post https://www.portugal-a-programar.pt/forums/topic/57734-utilizar-webservices-da-at/?do=findComment&amp;comment=591958 de há uns anos que tem um ficheiro Excel já com bastante código feito. Pelo que consegui avaliar, os links de acesso estão desatualizados, mas de resto, parece-me que deveria funcionar (mas não conheço nem uso a linguagem de programação usada no Excel, por isso não posso confirmar!).

Boa sorte.

Edited by eandrade
Informação extra

Share this post


Link to post
Share on other sites
NunoTendais

Boas.

Estou a tentar fazer a ligação aos webservices de testes da AT para desenvolver um modulo para registo de contratos de arrendamentos e para a emissão de recibos de arrendamento em .NET.

Mas nunca consigo a autenticação no serviço, obtendo sempre o mesmo erro.

"An error occurred while making the HTTP request to https://servicos.portaldasfinancas.gov.pt:709/ws/arrendamento. This could be due to the fact that the server certificate is not configured properly with HTTP.SYS in the HTTPS case. This could also be caused by a mismatch of the security binding between the client and the server"

Estou a utilizar o certificado Chave Cifra Publica AT 2020.cer que a AT me enviou.

já vi algumas pessoas aqui a reportarem o mesmo problema em diferentes períodos, e tentei seguir algumas das soluções dadas no forum, mas nenhum funcionou. 

Alguém tem uma ideia de qual será o problema?

Obrigado pela ajuda

Edited by NunoTendais
Resolvido

Share this post


Link to post
Share on other sites
pc.cesar
Em 18/04/2013 às 17:23, AntonioPereira disse:

Boas sergio

Chave Simetrica - uma chave gerada aleatoriamente com 128 bits

password - cifrar password do subutilizador que crias no portal das finanças com a chave simetrica que geraste.

data - cifrares a data com o seguinte formato EX: 2013-01-01T19:20:30.45Z e cifrares com a chave simetrica

campo nonce - chave simetrica cifrada com o certificado que a at te enviou - ChavePublicaAT.cer

Tenho o codigo em PHP, interessa-te ?

 

O codigo php e/ou foxpro interssa-me, tens para fazer a consulta das faturas de compra para importar para a minha contabilidade??

Share this post


Link to post
Share on other sites
NunoTendais
Em 29/08/2018 às 12:11, MCAST76 disse:

Viva!

Relativamente ao webservice e-TaxFree, gostaria de saber se alguém consegue algum resultado, pois é-me sempre devolvido o erro: "Pedido do Cliente Rejeitado: Credenciais Inválidas".

Os restantes webservices funcionam devidamente, tanto em ambiente de testes como de produção.

Agradeço desde já.

Para o serviço de emissão de recibos de renda que esyou a desenvolver ta,bém estou sempre a receber este erro "Pedido do Cliente Rejeitado: Credenciais Inválidas". 

Sabes o que estaria a causar este erro?

 

Obrigado.

Share this post


Link to post
Share on other sites
marcolopes
2 hours ago, NunoTendais said:

Para o serviço de emissão de recibos de renda que estou a desenvolver também estou sempre a receber este erro "Pedido do Cliente Rejeitado: Credenciais Inválidas". 

Sabes o que estaria a causar este erro?

Obrigado.

Mesmo erro nos testes do e-TaxFree, mas presumo que seja porque o sistema não está a aceitar TESTES, pois colocando o NIF / username da AT, o retorno é:

Quote

<ReturnMessage>O NIF introduzido não consta no registo da base de dados da AT. Por favor confirme. [Quando preenchido, o valor do Número de Identificação Fiscal do Viajante (TaxRegistrationNumber), deve ser válido e existir na base de dados do Cadastro de Contribuintes da AT]</ReturnMessage>

 


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
tjcsantos
On 4/9/2019 at 7:05 PM, NunoTendais said:

Para o serviço de emissão de recibos de renda que esyou a desenvolver ta,bém estou sempre a receber este erro "Pedido do Cliente Rejeitado: Credenciais Inválidas". 

Sabes o que estaria a causar este erro?

 

Obrigado.

Também estou a obter a mesma mensagem de erro quando tento criar um novo contrato de arrendamento... tinha isto a funcionar (há 2 meses atrás) e agora que voltei a pegar neste projeto também me deparei com este erro: "Pedido do Cliente Rejeitado: Credenciais Inválidas".

Pergunto se poderá estar relacionado com a data/hora que segue no header dos pedidos SOAP? Com a alteração da hora (para a hora de Verão), a hora que segue atualmente nos meus pedidos SOAP tem menos 1 hora do que a hora real... embora eu tenha o sistema (Ubuntu) sincronizado com o Observatório Astronómico de Lisboa, creio que isto esteja certo porque a data/hora no pedido SOAP deve estar no formato UTC...

Alguém me sabe esclarecer sobre este assunto da hora?

Obrigado!

Share this post


Link to post
Share on other sites
marcolopes
11 minutes ago, tjcsantos said:

Também estou a obter a mesma mensagem de erro quando tento criar um novo contrato de arrendamento... tinha isto a funcionar (há 2 meses atrás) e agora que voltei a pegar neste projeto também me deparei com este erro: "Pedido do Cliente Rejeitado: Credenciais Inválidas".

Pergunto se poderá estar relacionado com a data/hora que segue no header dos pedidos SOAP? Com a alteração da hora (para a hora de Verão), a hora que segue atualmente nos meus pedidos SOAP tem menos 1 hora do que a hora real... embora eu tenha o sistema (Ubuntu) sincronizado com o Observatório Astronómico de Lisboa, creio que isto esteja certo porque a data/hora no pedido SOAP deve estar no formato UTC...

Alguém me sabe esclarecer sobre este assunto da hora?

Obrigado!

Não pode ser da hora... tenho os serviços sincronizados com OAL em UTC e o erro é o mesmo...


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

Não pode ser da hora... tenho os serviços sincronizados com OAL em UTC e o erro é o mesmo...

Obrigado!

Abri um ticket no portal das finanças... vamos ver quando é que me respondem...

Share this post


Link to post
Share on other sites
NunoTendais
11 horas atrás, tjcsantos disse:

Obrigado!

Abri um ticket no portal das finanças... vamos ver quando é que me respondem...

Também estou a aguardar uma resposta do portal das finanças ao ticket que criei sobre este erro. 

Quando responderem, deixo aqui a resposta deles, entretanto se encontrarem alguma solução avisem sff. 

Obrigado.

Share this post


Link to post
Share on other sites
tjcsantos
6 hours ago, NunoTendais said:

Também estou a aguardar uma resposta do portal das finanças ao ticket que criei sobre este erro. 

Quando responderem, deixo aqui a resposta deles, entretanto se encontrarem alguma solução avisem sff. 

Obrigado.

Responderam ao meu ticket dizendo que provavelmente estou a utilizar certificados desatualizados e enviaram-me os certificados atuais em anexo.

No entanto, esse não é o problema........ estou a utilizar os certificados corretos pelo que reabri o ticket e estou novamente a aguardar feedback.

Avisarei caso encontre solução...

Share this post


Link to post
Share on other sites
NunoTendais
8 minutos atrás, tjcsantos disse:

Responderam ao meu ticket dizendo que provavelmente estou a utilizar certificados desatualizados e enviaram-me os certificados atuais em anexo.

No entanto, esse não é o problema........ estou a utilizar os certificados corretos pelo que reabri o ticket e estou novamente a aguardar feedback.

Avisarei caso encontre solução...

Obrigado, 

Só comecei o desenvolvimento na semana passada, foi quando me enviaram os certificados. Não deve ser isso com certeza.

 

 

Share this post


Link to post
Share on other sites
tjcsantos
31 minutes ago, NunoTendais said:

Obrigado, 

Só comecei o desenvolvimento na semana passada, foi quando me enviaram os certificados. Não deve ser isso com certeza.

 

 

Subitamente isto começou a funcionar... não alterei nada... creio que eles terão arranjado o problema do lado deles (AT).

Uma vez que reabri o ticket onde mencionei que o problema não era dos certificados (conforme eles disseram) e mencionei também que não era o único programador a obter este erro (o que levantava a hipótese de o problema estar no ambiente de testes deles)... talvez eles tenham alterado alguma coisa do lado deles que tenha feito isto começar a funcionar.

Ainda não responderam ao ticket que eu reabri mas a minha app já está novamente a comunicar corretamente.

Edited by tjcsantos

Share this post


Link to post
Share on other sites
Castanha

Boa tarde,

alguém com problemas na comunicação de guias de transporte para a AT ? Estou a obter que o "Documento não foi enviado porque já foi enviado um documento com o mesmo número" o que não me parece de todo possivel.

Obrigado a todos.

Share this post


Link to post
Share on other sites
Vitor Pereira
8 minutos atrás, Castanha disse:

Boa tarde,

alguém com problemas na comunicação de guias de transporte para a AT ? Estou a obter que o "Documento não foi enviado porque já foi enviado um documento com o mesmo número" o que não me parece de todo possivel.

Obrigado a todos.

 

Tudo a funcionar a 100% ( verificado agora mesmo )

Share this post


Link to post
Share on other sites
Castanha
1 minuto atrás, Vitor Pereira disse:

 

Tudo a funcionar a 100% ( verificado agora mesmo )

Ok .... obrigado ;)

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

×

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.