Imagen

DESCARGA SOFTWARE PARA FACTURA ELECTRONICA DE AQUI.
Facturacion, Validacion, Addendas, Librerias de programacion, etc.


CARTA PORTE V3.1

ECODEX TIENE ESTOS NUEVOS DATOS DE CONTACTO :
Comercializacion y Ventas - Evelia Vicke evicke@ecodex.com.mx 33-16-03-03-48
Soporte - Humberto Guerrero soporte@ecodex.com.mx 33-34-90-46-03


.

Duda de Como Autentificarse en los WebService de Descarga de los XML

Todo lo que no cabe en los demas foros........
estebanchambas
Mensajes: 51
Registrado: Mié Ago 08, 2018 1:30 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por estebanchambas »

andresmaya escribió:Buen día, tampoco he podido lograrme autenticar pero tengo un código que ya genera la parte del WSA (Addressing) y WSSE (Security).

Lo que no tengo muy claro es cual es el XML que se debe firmar, es decir, el string inicial, al parecer hay que hacer una llamada al método Autentica sin WSDL sino con el action solamente y luego ese XML de SOAP firmarlo, he intentato eso pero sin éxito.

Les comparto mis solicitudes como las genera mi script donde el SIGNED REQUEST es muy similar al que pone el SAT en su manual:

ORIGNAL REQUEST: (es el que genero al inicio para luego este firmarlo)

Código: Seleccionar todo

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Body>
        <Autentica/>
    </s:Body>
</s:Envelope>
SIGNED REQUEST: (incluye el primer request firmado mediante certificados x.509 y con addressing)

Código: Seleccionar todo

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <s:Header>
        <a:Action>https://cfdidescargamasivasolicitud.clouda.sat.gob.mx/Autenticacion/#Autentica</a:Action>
        <a:To>https://cfdidescargamasivasolicitud.clouda.sat.gob.mx/Autenticacion/Autenticacion.svc</a:To>
        <a:MessageID>uuid:e0461b44-3654-712a-ab90-38bbacbfdb02</a:MessageID>
        <o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" s:mustUnderstand="1">
            <o:BinarySecurityToken xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" u:Id="pfx88bca128-1598-2383-da18-3263f3841890" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">MIIGez...==</o:BinarySecurityToken>
            <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                    <ds:Reference URI="#pfxffb919d0-65f0-959e-54c5-d0b2128ef894">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>zlT6N9URycOqyKrI//9qx307jiQ=</ds:DigestValue>
                    </ds:Reference>
                    <ds:Reference URI="#pfx767dca7d-7335-5e0f-af25-2c3693ed93a4">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                        <ds:DigestValue>7G1OMrRL2NW8TXliY96gQVVGDmk=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>UYmrDgEytnjd6Y...szew==</ds:SignatureValue>
                <ds:KeyInfo>
                    <o:SecurityTokenReference>
                        <o:Reference ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" URI="#pfx88bca128-1598-2383-da18-3263f3841890"/>
                    </o:SecurityTokenReference>
                </ds:KeyInfo>
            </ds:Signature>
            <u:Timestamp xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" u:Id="pfxffb919d0-65f0-959e-54c5-d0b2128ef894">
                <u:Created>2018-08-07T21:04:43Z</u:Created>
                <u:Expires>2018-08-07T21:09:43Z</u:Expires>
            </u:Timestamp>
        </o:Security>
    </s:Header>
    <s:Body xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" u:Id="pfx767dca7d-7335-5e0f-af25-2c3693ed93a4">
        <Autentica/>
    </s:Body>
</s:Envelope>
NOTA: he truncado/resumido el Signature y BinaryToken para que sea mas digerible leerlo.

Halcon Divino, también me encuentro en MTY si te interesa podríamos trabajar en conjunto esto o reunirnos para agilizarlo si te parece bien.

Hasta donde alcanzo a entender, usas SOAP para hacer tu petición, no usas URL de WSDL puesto que no tiene Definición.

Pero si usas "Action", Que Direccion usas como Action?, esta: https://cfdidescargamasivasolicitud.clo ... /Autentica
Y le inyectas por asi decir, el XML que describiste no?

Y el Certificado me imagino que lo metes en el socket y allí especificas la contraseña.



O usas esta URL, como Action: https://cfdidescargamasivasolicitud.clo ... enticacion
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por Dado »

Lo que veo de la solucion de Halcon Divino, que es buenisima y me ayudo mucho, es que es una "caja negra", lo programan en C#, definen varios punteros y casi por obra de magia C# se encarga de todo.........una maravilla !!

Para los que programamos en otros lenguajes (o por lo menos para mi que programo en Delphi) es que tenemos que hacer todo a pata, debido a que los genios del SAT no definieron el WSDL y no podemos conectarnos y hacer un "binding"

Lo que yo he hecho y casi funciona es lo siguiente :

0. Eche a andar el codigo de Halcon Divino y mediante un sniffer (HTTP Analyzer, tambien se puede usar Fiddle) extraje un request totalmente valido y lo uso como base

1. Genero el nodo que debe firmarse, canonizado (sin espacios y sin retornos de carro)

Código: Seleccionar todo

<u:Timestamp u:Id="_0"><u:Created>%created%</u:Created><u:Expires>%expires%</u:Expires></u:Timestamp>
2. En los placeholders (%%) inserto la fecha actual y la fecha actual + 5 minutos

3. Calculo el digest sha1 de ese nodo y lo paso a Base64, segun el requerimiento del sello, ahora, porque se que ese es el nodo que debe firmarse ? por el ID.......si notan el ID es igual a "_0" y en la firma de muestra que he encontrado en los foros dice que <Reference URI="_0">

Ese Reference URI es el que nos indica que elemento es el que se esta firmando

Y porque se que es SHA1 y no SHA256 o algun otro ? Lo dice en el digest method

Código: Seleccionar todo

<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1">
3. Generar el esqueleto principal :

Código: Seleccionar todo

'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">' +
	'<s:Header>' +
		'<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">' +
{%%} 	'%TimeStamp%' +
		'<o:BinarySecurityToken u:Id="uuid-06cc91fd-6392-4204-b595-8de413632f28-1" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" ' +
{%%}		'EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">%certb64%</o:BinarySecurityToken>' +
{%%}	'%Signature%'+
		'</o:Security>' +
	'</s:Header>' +
	'<s:Body>' +
		'<Autentica xmlns="http://DescargaMasivaTerceros.gob.mx" />' +
	'</s:Body>' +
'</s:Envelope>';
4 Igualmente inserto en los place holders lo relacionado, el nodo de timestamp, el nodo del sello y en %certb64% inserto el certificado en base 64

Nota, se inserta UNICAMENTE el certificado, NO se inserta la llave privada y secreta y no publica (si, es pa' hacer notar que es PRIVADA y por ningun motivo debe viajar en el XML)

Los que programan en C# estan usando archivos PFX que son una combinacion de Certificado+Llave porque ya tienen rutinas que les ayudan con esto, no es realmente un requerimiento del SAT, es mas bien una facilidad que les esta dando el lenguaje de programacion. En Delphi yo uso por separado los archivos.

La envio mediante POST al URL :

Código: Seleccionar todo

'https://cfdidescargamasivasolicitud.clouda.sat.gob.mx/Autenticacion/Autenticacion.svc'
Al enviarlo le agrego dos headers :

Código: Seleccionar todo

HTTP.MimeType := 'text/xml; charset=utf-8';
HTTP.Headers.Add('SOAPAction: "http://DescargaMasivaTerceros.gob.mx/IAutenticacion/Autentica"');
Y...........nop, me quedo igual que @crono81, con un "An error occurred when verifying security for the message" y por supuesto que he intentado "MIL" formas de sellar el nodo y nada.

Por ultimo, se perfectamente que el nodo a sellar es el mencionado por unas pruebas que hice, para esto tome el request del programa de Halcon Divino y le empece a agregar espacios y retornos de carro. Cuando lo editaba FUERA del nodo <TimeStamp> y lo reenviaba al SAT me daba un token valido, PERO si le agregaba un espacio dentro del nodo mencionado me marcaba el error de "An error occurred when verifying security for the message"
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
estebanchambas
Mensajes: 51
Registrado: Mié Ago 08, 2018 1:30 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por estebanchambas »

Hola, o sea que generas el cuerpo a mano y lo codificas con base64?,
Y tu conjunto de datos los mandas por un SOAP? Pero que URL usas como Action?

Y el primer Webservice con el que debes de obtener el token es el que dice Autentica, cierto?
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por Dado »

Si, lo hago a mano

Solo el hash del nodo que se firma y el certificado lo codifico en base64, pero todo el SOAP no

Ahi mencione que uso como SOAPAction, checalo nuevamente

Si, este es el Autentica, donde obtienes el token para los demas servicios
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
estebanchambas
Mensajes: 51
Registrado: Mié Ago 08, 2018 1:30 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por estebanchambas »

Ya capto, tu SOAPAction es: http://DescargaMasivaTerceros.gob.mx/IA ... /Autentica
Y el NameSpace es: https://cfdidescargamasivasolicitud.clouda.sat.gob.mx

Cierto?

y el XML que envias es un RequestHeader?



Se me hace que por eso no da:
porque probando este enlace con CURL no da respuesta alguna, obvio usando -v http://DescargaMasivaTerceros.gob.mx/IA ... /Autentica, dice lo siguiente:

Código: Seleccionar todo

bash-3.2# curl -v http://DescargaMasivaTerceros.gob.mx/IAutenticacion/Autentica
* Could not resolve host: DescargaMasivaTerceros.gob.mx
* Closing connection 0
curl: (6) Could not resolve host: DescargaMasivaTerceros.gob.mx
bash-3.2# 

Sin embargo si le haces curl -v a : https://cfdidescargamasivasolicitud.clo ... cacion.svc

Te da la siguiente respuesta el Curl:

Código: Seleccionar todo

bash-3.2# curl -v https://cfdidescargamasivasolicitud.clouda.sat.gob.mx/Autenticacion/Autenticacion.svc
*   Trying 40.124.2.194...
* TCP_NODELAY set
* Connected to cfdidescargamasivasolicitud.clouda.sat.gob.mx (40.124.2.194) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=MX; ST=Distrito Federal; L=Mexico; O=Servicio de Administraci?n Tributaria; CN=*.clouda.sat.gob.mx
*  start date: Dec 26 16:50:05 2016 GMT
*  expire date: Dec 27 16:50:05 2018 GMT
*  subjectAltName: host "cfdidescargamasivasolicitud.clouda.sat.gob.mx" matched cert's "*.clouda.sat.gob.mx"
*  issuer: C=US; O=Trend Micro Inc; CN=Trend Micro S2 CA
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fe331003c00)
> GET /Autenticacion/Autenticacion.svc HTTP/2
> Host: cfdidescargamasivasolicitud.clouda.sat.gob.mx
> User-Agent: curl/7.54.0
> Accept: */*
> 
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 400 
< server: Microsoft-IIS/10.0
< x-powered-by: ASP.NET
< date: Tue, 25 Sep 2018 22:56:53 GMT
< content-length: 0
< 
* Connection #0 to host cfdidescargamasivasolicitud.clouda.sat.gob.mx left intact
bash-3.2# 
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por Dado »

Los Request Header son dos (el mime type y el soap action)

El XML que envio es el SOAP Message (ahorita ya casi salimos de la oficina (a las 6pm) mañana hago una prueba de envio y publico aqui el XML que tambien se le llama Request y corresponde a un SOAP Message je je je, asi o mas trabalenguas :) )

Si, en CURL ya te pudiste conectar, ahora solo te falta ENVIAR el susodicho request/soap msg
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
crono81
Mensajes: 118
Registrado: Lun Dic 16, 2013 5:55 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por crono81 »

Gracias HalconDivino, Dado. Solo una duda, en que formato van los timstamp que se envían?
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por Dado »

El formato es como el de los CFDI, pero con decimas de segundo y una "Z"

Ah! y por cierto, hay que enviarlo en horario GMT (hora de Mexico mas 5 horas)

Por ejemplo, ahorita que ya son casi las 6pm deberias enviar asi "2018-09-25T23:01:03.253Z"

Esto es conocimiento empirico, obtenido de los request VALIDOS que genera el programa de Halcon Divino

ME TENGO QUE IR (perdon, pero estan cerrando la oficina) manaña les prometo un request y response valido.
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por Dado »

Listo, adjunto request, response y headers validos generados por el programa de Halcon Divino

La operacion fue a las 10:40 am , lo menciono para que noten como el Timestamp y en los headers manejan la hora GMT que es (hora local + 5 horas)
Adjuntos
headers.png
headers.png (14.3 KiB) Visto 13989 veces
Response.xml
(991 Bytes) Descargado 590 veces
Request.xml
(3.82 KiB) Descargado 732 veces
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
crono81
Mensajes: 118
Registrado: Lun Dic 16, 2013 5:55 pm

Re: Duda de Como Autentificarse en los WebService de Descarga de los XML

Mensaje por crono81 »

Gracias Dado, estoy con unas dudas, de donde salen estos datos:
<o:BinarySecurityToken u:Id="uuid-7de252ad-a383-458d-a467-8aadb076df4f-1"
el uuid

<DigestValue>5dsghtYrY4kzB/4NrESIrCjan3M=</DigestValue>
Este valor no se de donde sale, pensé que era el sha1 del nodo <u:Timestamp u:Id="_0">, pero no
y
<SignatureValue>fqU4yPge........</SignatureValue>
imagino que es el sha1 -sign base64 del nodo timestamp
Cerrado