Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Error WS - Sin respuesta. (https://www.clubdelphi.com/foros/showthread.php?t=96153)

iMia 10-03-2023 09:57:06

Error WS - Sin respuesta.
 
Buenas a todo@s...

Estoy teniendo un problema que me trae por el camino de la amargura....

En el en mensaje : https://www.clubdelphi.com/foros/sho...97&postcount=7 del hilo : https://www.clubdelphi.com/foros/showthread.php?t=95967 puse un ejemplo de utilización del servicio de validación de NIF/CIFs de la AEAT.

Me funciona perfectamente en muchos equipos que tengo en clientes, pero en varios de ellos no hay forma que funcione y me devuelve el error:

El documento XML debe tener un elemento de nivel superior
Line: 0

es decir no hay respuesta...

Me copio los datos en mi equipo (ejecutables, certificados etc... ) y funciona perfectamente...

No entiendo que puede estar pasando... ¿alguna pista?

gracias.

Casimiro Notevi 10-03-2023 10:15:17

A lo mejor si pones una copia del xml para que le echemos un vistazo, si es posible.
Normalmente, por lo que he visto en algunos casos, es porque no está bien estructurado.

Neftali [Germán.Estévez] 10-03-2023 13:14:05

Si has copiado los mismos ficheros en otro equipo, y la cosa no funciona, puede ser indicativo de que sea un problema de diferente configuración en los diferentes equipos.
Todo el tema de XML, según el código que estés utilizando, se apoya en DLLs y configuraciones del equipo (IE, protocolos,...)

Revisa y compara versiones del sistema operativo, versiones de protocolos,...

iMia 10-03-2023 16:46:04

Cita:

Empezado por Casimiro Notevi (Mensaje 550712)
A lo mejor si pones una copia del xml para que le echemos un vistazo, si es posible.
Normalmente, por lo que he visto en algunos casos, es porque no está bien estructurado.

pues no tengo respuesta... ese es el problema...

Capturo la respuesta así:

Al httpRio asigno el evento OnAfterExecute y lo defino así...

Código Delphi [-]
procedure TMainForm.HTTPOnAfterExecute(const MethodName: string; SOAPResponse: TStream);
var
  ts: TStringList;
begin
    SOAPResponse.Position := 0;
    ts := TStringList.Create;
    try
      ts.LoadFromStream(SOAPResponse);
      SOAPResponse.Size := 0;
      SOAPResponse.Position := 0;
      ts.SaveToStream(SOAPResponse);
      ts.saveToFile(ExtractFilePath(Application.ExeName) + ChangeFileExt(ExtractFileName(Application.ExeName), '.debug.respuesta.txt'));
    finally
      ts.Free;
    end;
end;

pero siempre está vacío...

Edito:

Cuando responde todo va bien y sí llego a capturar el mensaje de restuesta

Código:

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Body><VNifV2Sal:VNifV2Sal xmlns:VNifV2Sal="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV2Sal.xsd"><VNifV2Sal:Contribuyente><VNifV2Sal:Nif>XXXXXX</VNifV2Sal:Nif><VNifV2Sal:Nombre>XXXXX</VNifV2Sal:Nombre><VNifV2Sal:Resultado>IDENTIFICADO</VNifV2Sal:Resultado></VNifV2Sal:Contribuyente></VNifV2Sal:VNifV2Sal></env:Body></env:Envelope>

Casimiro Notevi 11-03-2023 18:54:32

Puede ser que no exista el nif que se esté consultando.

iMia 13-03-2023 10:25:41

Cita:

Empezado por Casimiro Notevi (Mensaje 550720)
Puede ser que no exista el nif que se esté consultando.


Buenos días Casimiro,
no, no es ese el problema...
Cuando no se identifica, si hay mensaje de respuesta, devuelve el mensaje de NO IDENTIFICADO.

Código Delphi [-]
B33333333CERES NO IDENTIFICADO

iMia 13-03-2023 11:21:40

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 550714)
Si has copiado los mismos ficheros en otro equipo, y la cosa no funciona, puede ser indicativo de que sea un problema de diferente configuración en los diferentes equipos.
Todo el tema de XML, según el código que estés utilizando, se apoya en DLLs y configuraciones del equipo (IE, protocolos,...)

Revisa y compara versiones del sistema operativo, versiones de protocolos,...


Creo que podría venir por aquí...

He conseguido llegar a que si ejecuto desde dentro del entorno de Delphi con un Run, funciona perfectamete, pero lanzando el ejecutable desde el propio S.O. , es cuando no hay respuesta...
Es como si el capicom o las librerias de openssl (libeay32.dll o ssleay32.dll) no fuesen las correctas: Desde Delphi está utilizando unas y desde el ejecutable, otras (o algo así) y no incluya bien el certificado o no sé exactamente qué pasa con la llamada y por eso no hay respuesta... pero por otra parte, cuando la llamada no es correcta, el servidor debería responder con error, pero es que no hay error, simplemente no hay respuesta...

iMia 13-03-2023 11:22:35

Cita:

Empezado por iMia (Mensaje 550724)
Buenos días Casimiro,
no, no es ese el problema...
Cuando no se identifica, si hay mensaje de respuesta, devuelve el mensaje de NO IDENTIFICADO.

Código:

<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Body><VNifV2Sal:VNifV2Sal xmlns:VNifV2Sal="http://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/burt/jdit/ws/VNifV2Sal.xsd"><VNifV2Sal:Contribuyente><VNifV2Sal:Nif>B33333333</VNifV2Sal:Nif><VNifV2Sal:Nombre>CERES </VNifV2Sal:Nombre><VNifV2Sal:Resultado>NO IDENTIFICADO</VNifV2Sal:Resultado></VNifV2Sal:Contribuyente></VNifV2Sal:VNifV2Sal></env:Body></env:Envelope>

He cambiado los tags para que se vea el mensaje.

Neftali [Germán.Estévez] 14-03-2023 09:44:00

Ahí en el menaje de respuesta tienes un "NO IDENTIFICADO"
Tendrías que saber a qué se refiere. Si es al certificado, si es por el DNI,...

Si está relacionado con librerías (SSL) deberías buscar en tu sistema a ver si tienes más de una versión. No sea que según desde dónde lo ejecutas te esté cogiendo unas u otras (path).

iMia 14-03-2023 11:39:51

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 550730)
Ahí en el menaje de respuesta tienes un "NO IDENTIFICADO"
Tendrías que saber a qué se refiere. Si es al certificado, si es por el DNI,...

Si está relacionado con librerías (SSL) deberías buscar en tu sistema a ver si tienes más de una versión. No sea que según desde dónde lo ejecutas te esté cogiendo unas u otras (path).

Siempre que hay una respuesta "NO IDENTIFICADO", es que la llamada (y certificado) es correcto... simplemente que el NIF que se consulta, es incorrecto o no corresponde con el nombre.

El tema de las DLL tampoco lo tengo claro, por que solo tengo unas... sigo con esta linea de investigación a ver si veo algo...

Gracias a todos por mirarlo y perder unos minutos a pensar en ello...

iMia 15-03-2023 11:30:51

Sigo con el tema DLLs...

Desde el entorno de programación funciona OK, pero desde el S.O. llamando al ejecutable no.

¿Es relamente problema de las dll's...? ni libeay32.dll ni ssleay32.dll son llamadas desde mi proceso (Ejecutable desde SO)

Hasta ahora pensaba utilizaba las dlls (libeay32.dll y ssleay32.dll) pero ahora creo que no las utiliza... por eso al copiar varias versiones de dll de libeay32 y ssleay32 junto al ejecutable, pasa de ellas...

¿No seran otras dlls?

P.D.: Cómo saber qué DLL se están llamando... (sea del SO o del entrono de programación)
desde liena de comandos: C:\Windows\System32\perfmon.exe /res -> Pestaña CPU y seleccionar el proceso y las dlls aparecen en el apartado "módulos Asociados"

vaya lio....

Neftali [Germán.Estévez] 15-03-2023 11:39:11

Cita:

Empezado por iMia (Mensaje 550752)
Hasta ahora pensaba utilizaba las dlls (libeay32.dll y ssleay32.dll) pero ahora creo que no las utiliza... por eso al copiar varias versiones de dll de libeay32 y ssleay32 junto al ejecutable, pasa de ellas...

Si estás usando las Indy (por ejemplo) sí usa esas DLL's. Si estás utilizando los componentes REST creo que no, porque hace uso de lo que tiene el sistema operativo.

iMia 15-03-2023 15:08:59

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 550754)
Si estás usando las Indy (por ejemplo) sí usa esas DLL's. Si estás utilizando los componentes REST creo que no, porque hace uso de lo que tiene el sistema operativo.

Sí, Sólo utilizo los componentes propios de Delphi y la librería CAPICOM

Estos son los uses del maiForm

Código Delphi [-]

uses
  // Windows API
  Winapi.Windows, Winapi.Messages, WinApi.WinInet,
  // PlaySound
  MMSystem,
  // System
  System.SysUtils, System.Variants, System.Classes, System.IniFiles, System.UITypes, System.Win.ComObj,
  // VCL
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.DBGrids, Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls, Vcl.Mask,
  // XML
  Xml.xmldom, Xml.XMLDoc, Xml.XMLIntf,
  // Data
  Data.DB, Bde.DBTables,
  // Rest - JSON
  REST.Json,
  // Soap
  Soap.SOAPHTTPClient, Soap.SOAPHTTPTrans, Soap.InvokeRegistry, Soap.Rio,
  // aeat NIF VAlidador
  VNifV21;

iMia 16-03-2023 09:23:34

Más pruebas...

He instalado Fiddler... un snifer de http, para ver las comunicaciones....

Si lo hago ejecutando la app desde el SO, Fiddler detecta el request: a sede.agenciatributaria:443

HEADER:
User-Agent: CodeGear SOAP 1.3
Host: www1.agenciatributaria.gob.es:443
Content-Length: 0
Connection: Keep-Alive
Pragma: no-cache
con una respuesta:
HEADER
FiddlerGateway: Direct
StartTime: 08:00:48.731
pero en el RAW del request aparece esto:

Código:

CONNECT www1.agenciatributaria.gob.es:443 HTTP/1.0
User-Agent: CodeGear SOAP 1.3
Host: www1.agenciatributaria.gob.es:443
Content-Length: 0
Connection: Keep-Alive
Pragma: no-cache

After the client received notice of the established CONNECT, it failed to send any data.


Ejecutando desde el IDE

el mismo header:
User-Agent: CodeGear SOAP 1.3
Host: www1.agenciatributaria.gob.es:443
Content-Length: 0
Connection: Keep-Alive
Pragma: no-cache
pero el raw del mensaje:
Código:

CONNECT www1.agenciatributaria.gob.es:443 HTTP/1.0
User-Agent: CodeGear SOAP 1.3
Host: www1.agenciatributaria.gob.es:443
Content-Length: 0
Connection: Keep-Alive
Pragma: no-cache

A SSLv3-compatible ClientHello handshake was found. Fiddler extracted the parameters below.

Version: 3.3 (TLS/1.2)
Random: 64 12 C3 D3 CD 93 AE CB 92 35 3F 92 27 60 63 C1 93 D9 94 1B E6 35 9E FB BA 33 D6 98 B1 3A CD ED
"Time": 01/08/2082 4:26:44
SessionID: empty
Extensions:
        server_name        www1.agenciatributaria.gob.es
        status_request        OCSP - Implicit Responder
        supported_groups        x25519 [0x1d], secp256r1 [0x17], secp384r1 [0x18]
        ec_point_formats        uncompressed [0x0]
        signature_algs        rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, rsa_pss_rsae_sha512, rsa_pkcs1_sha256, rsa_pkcs1_sha384, rsa_pkcs1_sha1, ecdsa_secp256r1_sha256, ecdsa_secp384r1_sha384, ecdsa_sha1, dsa_sha1, rsa_pkcs1_sha512, ecdsa_secp521r1_sha512
        SessionTicket        empty
        extended_master_secret        empty
        renegotiation_info        00
Ciphers:
        [C02C]        TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
        [C02B]        TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
        [C030]        TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        [C02F]        TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
        [C024]        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
        [C023]        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
        [C028]        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
        [C027]        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
        [C00A]        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
        [C009]        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
        [C014]        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
        [C013]        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
        [009D]        TLS_RSA_WITH_AES_256_GCM_SHA384
        [009C]        TLS_RSA_WITH_AES_128_GCM_SHA256
        [003D]        TLS_RSA_WITH_AES_256_CBC_SHA256
        [003C]        TLS_RSA_WITH_AES_128_CBC_SHA256
        [0035]        TLS_RSA_WITH_AES_256_CBC_SHA
        [002F]        TLS_RSA_WITH_AES_128_CBC_SHA
        [000A]        SSL_RSA_WITH_3DES_EDE_SHA

Compression:
        [00]        NO_COMPRESSION

y automáticamente está la llamada de POST a https://www1.agenciatributaria.gob.e.../ws/VNifV2SOAP con el xml de consulta.

Es como si no se enviase nada a parte del handshake de conexión... (ojo, el Content-Length: 0 de la respuesta raw de conexión no tiene nada que ver, ya que cuando se conecta correctamente, también sale a 0...) por que la respuesta del handshake es SSL3 "SSLv3-compatible ClientHello handshake was found" y el cliente no lo reconoce ¿?

Lo que sí, es que cuando se conecta bien, el tamaño total del request es de 1858 bytes (187 del header y 1671 del body) pero cuando lo hago desde el SO, el tamaño del request es de 276 bytes (187 del header y 89 del body).

El request se hace en dos partes, uno con la identificación (CONNECT) y otro con el request puramente dicho (POST). Parece que desde el ide, despés del Connect, puede hacer bien el POST, en cambio desde el SO, despues del Connect, no hace el Post...


o ya no sé ni lo que digo...:confused:

Neftali [Germán.Estévez] 16-03-2023 09:45:57

Revisa los parámetros de SSL.
Haz pruebas con diferentes versiones.

iMia 16-03-2023 10:20:42

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 550768)
Revisa los parámetros de SSL.
Haz pruebas con diferentes versiones.

Gracias Neftali,

He probado de activar Manualmente TLS 1.2 en el registro, y SSL 3... y nada...

He probado copiando diferentes versiones de libeay32 y ssleay32 junto al ejecutable y como si nada... No sé si las utiliza (yo diría que no, por que comprobando las dlls que abre la app, no lo hace... ) y si las utiliza ni cómo ni cuando...

iMia 16-03-2023 12:26:24

Arreglado!!!!!!!!

El problema estaba en la forma de cargar el certificado con CAPICOM...

Tenia que ser:

Código Delphi [-]
Cert.Load(FileName, Password, CAPICOM_KEY_STORAGE_EXPORTABLE, CAPICOM_CURRENT_USER_KEY)

Neftali [Germán.Estévez] 16-03-2023 14:01:05

Gracias por comentar la solución.
^\||/


La franja horaria es GMT +2. Ahora son las 16:48:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi