Página 2 de 10

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Vie Sep 28, 2018 3:59 pm
por Dado
Si, asi parece, si Uri="" entonces es el "entire XML doc"

Yo estoy tratando de corregir el error de lectura de certificado, pienso que si el WS no puede leer el certificado entonces no va a poder validar la firma

Al principio pense que era porque estaba usando el certificado de prueba, pero ya estoy usando uno real y tengo el mismo error, INCLUSO CON EL PROGRAMA DE HALCON DIVINO tengo el error de certificado

Mi ultimo recurso es usar la documentacion oficial del SAT :mrgreen:

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Vie Sep 28, 2018 4:13 pm
por crono81
Parece que di con la respuesta, viendo el codigo de halcon divino:
esta linea de codigo:
DigestValue = cert.GetCertHash()
por lo tanto el digest value, es el hash del certificado, podrias verificar con el certificado que usaste obtener el hash y ver si da contra el valor del request: 1djKnucpcQ8MvErygIvwzz6PNUM=
segun para obtener el hash en openssl se usa esta instruccion
openssl x509 -hash -in cert.pem -noout
Espero tus comentarios

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Vie Sep 28, 2018 4:30 pm
por Dado
Nop, me da un valor de solo 9 cifras : 8becd69a

Adjunto el certificado de prueba que use, incluyendo el CER original y tambien convertido en formato PEM como lo pide tu instruccion de OpenSSL

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Vie Sep 28, 2018 4:33 pm
por crono81
No intentaste sacar el sha1 del hash, luego base64?

EDITO: creo que yo no obtengo el valor correcto, pues uso una version vieja de openssl, y no se cual usan en el sat, pues hay diferencias entre el hash de una version y de la otra

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Vie Sep 28, 2018 4:57 pm
por Dado
El hash es el mismo no importa como lo obtengas, te imaginas ! por ejemplo que el SHA1 que calcula OpenSSL no sea el mismo SHA1 que calcula "Bouncy Castle" (libreria que usan en C#). Siempre y sin importar como lo calcules debe ser el mismo SHA1 para la misma cadena

Ya es hora de retirarme (6pm) mañana le sigo desde mi casa que es tu casa y vemos si podemos adelantarle algo mas.....buen fin de semana !

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Vie Sep 28, 2018 5:05 pm
por crono81
Estoy de acuerdo, pero yo lo digo por las versiones de openssl, las cuales si hacen un "openssl x509 -hash" distinto entre las dos.

EDITO: esto parecerá tonto, pero va de la mano con lo que hace el sat (al parecer no se está firmando nada aqui). Viendo mas a fondo el codigo de halcon divino:

Código: Seleccionar todo

        public Requester.SignatureType Signature()
        {
            X509Certificate2 cert = new X509Certificate2(path, password, X509KeyStorageFlags.DefaultKeySet);
            Requester.SignatureType signature = new Requester.SignatureType();
            signature.SignedInfo = new Requester.SignedInfoType();
            signature.SignedInfo.CanonicalizationMethod = new Requester.CanonicalizationMethodType();
            signature.SignedInfo.CanonicalizationMethod.Algorithm = "Algorithm";
            signature.SignedInfo.SignatureMethod = new Requester.SignatureMethodType();
            signature.SignedInfo.SignatureMethod.Algorithm = "Algorithm";
            signature.SignedInfo.Reference = new Requester.ReferenceType
            {
                DigestMethod = new Requester.DigestMethodType
                { Algorithm = "Algorithm" },
                DigestValue = cert.GetCertHash()//<<<<-----------------AQUI SE AGREGA EL HASH (supongo yo que sha1 hexadecimal base64)
            };
            signature.SignatureValue = cert.GetPublicKey();//<<<<<<<<-------Aqui se agrega la llave pubica del certificado (OJO la llave, no el certificado)
            signature.KeyInfo = new Requester.KeyInfoType
            {
                X509Data = new Requester.X509DataType
                {
                    X509IssuerSerial = new Requester.X509IssuerSerialType
                    {
                        X509IssuerName = cert.IssuerName.Name,
                        X509SerialNumber = cert.GetSerialNumberString()
                    },
                    X509Certificate = cert.RawData
                }
            };
            return signature;
        }
Teniendo esto en cuenta y viendo el request, tiene lógica

Código: Seleccionar todo

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
	<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
		<SolicitaDescarga xmlns="http://DescargaMasivaTerceros.sat.gob.mx">
			<solicitud RfcEmisor="AAA010101AAA" RfcSolicitante="AAA010101AAA" FechaInicial="2018-09-27T00:00:00" FechaFinal="2018-09-27T23:59:59" TipoSolicitud="CFDI">
				<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
					<SignedInfo>
						<CanonicalizationMethod Algorithm="Algorithm"/>
						<SignatureMethod Algorithm="Algorithm"/>
						<Reference>
							<DigestMethod Algorithm="Algorithm"/>
							<DigestValue>AQUI VA EL HASH</DigestValue>   <<<<<<<---------------------------------------------------
						</Reference>
					</SignedInfo>
					<SignatureValue>AQUI VA LA LLAVE PUBLICA</SignatureValue><<<<<<<---------------------------------------------------
					<KeyInfo>
						<X509Data>
							<X509IssuerSerial>
								<X509IssuerName>OID.1.2.840.113549.1.9.2=Responsable: ACDMA, OID.2.5.4.45=SAT970701NN3, L=Coyoacán, S=Distrito Federal, C=MX, PostalCode=06300, STREET="Av. Hidalgo 77, Col. Guerrero", E=asisnet@pruebas.sat.gob.mx, OU=Administración de Seguridad de la Información, O=Servicio de Administración Tributaria, CN=A.C. 2 de pruebas(4096)</X509IssuerName>
								<X509SerialNumber>3230303031303030303030333030303232383135</X509SerialNumber>
							</X509IssuerSerial>
							<X509Certificate>AQUI VA EL CERTIFICADO</X509Certificate><<<<<<<---------------------------------------------------
						</X509Data>
					</KeyInfo>
				</Signature>
			</solicitud>
		</SolicitaDescarga>
	</s:Body>
</s:Envelope>
Creo que esta es la solución, saludos y a ver si mañana ya tenemos la solución

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Vie Sep 28, 2018 10:00 pm
por Dado
LO TENGO !

Y de hecho ya lo tenia desde ayer, sin darme cuenta :lol:

Recuerdas el problema que estuve reportando ? "CERTIFICADO INVALIDO"

Pues resulta que todo este tiempo habia estado usando certificados de sello CSD, primero uno de prueba, luego uno real, bueno aqui una nota que debe estar resaltada :

SE DEBE USAR LA e.FIRMA, CONOCIDA ANTERIORMENTE COMO FIEL, NO USAR EL CSD
ADEMAS SE DEBE USAR UN CERTIFICADO *REAL*, NO SE PUEDEN USAR CERTIFICADOS DE PRUEBA


Se debe calcular el digest del siguiente nodo, (((curiosamente NO lleva namespace, pero si estan ordenados alfabeticamente los atributos y el nodo expandido <></>)))

Código: Seleccionar todo

<des:solicitud FechaFinal="2017-10-05T00:00:00" FechaInicial="2017-10-01T00:00:00" RfcEmisor="xxxxxxxx" RfcSolicitante="xxxxxxx" TipoSolicitud="CFDI"></des:solicitud>
Aqui dejo un request y response, el unico truco curioso es que despues de crear el nodo de la firma se debe insertar enmedio del <des:solicitud> asi :

<des:solicitud Fecha....etc><Signature>blah blah</Signature></des:solicitud>

Nota que hice muchisimos cambios respecto a lo que teniamos con el programa de Halcon Divino, aqui volvi a reescribir todo el request basandome en la documentacion del SAT

(tuve que borrar datos privados, es que son reales, lo siento)

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Sab Sep 29, 2018 10:42 am
por crono81
Perfecto Dado, yo juraba que era un certificado, por como empieza (MIIBCgKCAQEAgvvCiCFDFVaYX7xdVRh.....) este es el sello del primer request, por como inicia, parece la llave publica de un certificado, por eso supuse eso.

Dirás la pseudo documentación, que más bien parece un extracto de la verdadera documentación, pues a diferencia de la documentación del cfdi, donde se indidca detalladamente como obtener la firma, aqui no lo hacen, pareciera que (como comentaba un compañero programador) el sat quisiera dar uso exclusivo a ciertos proveedores.

Pero en fin, supongo que las dos peticiones restantes van a ser más sencillas, pues el request es similar a éste.

EDITO: ya logro obtener el id de descarga, a verificar y a descargar.
Gracias.

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Lun Oct 01, 2018 11:57 am
por crono81
Buen dia Dado, que has obtenido de respuesta a la verificación de las descargas, yo en dos distintas solo obtengo:

Código: Seleccionar todo

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
	<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
		<VerificaSolicitudDescargaResponse xmlns="http://DescargaMasivaTerceros.sat.gob.mx">
			<VerificaSolicitudDescargaResult CodEstatus="5000" EstadoSolicitud="5" CodigoEstadoSolicitud="5004" NumeroCFDIs="0" Mensaje="Solicitud Aceptada"/>
		</VerificaSolicitudDescargaResponse>
	</s:Body>
</s:Envelope>

------------------------------------

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
	<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
		<VerificaSolicitudDescargaResponse xmlns="http://DescargaMasivaTerceros.sat.gob.mx">
			<VerificaSolicitudDescargaResult CodEstatus="5000" EstadoSolicitud="5" CodigoEstadoSolicitud="5004" NumeroCFDIs="0" Mensaje="Solicitud Aceptada"/>
		</VerificaSolicitudDescargaResponse>
	</s:Body>
</s:Envelope>
Que no se encuentra, siendo que la envié el sabado la primera y hoy la segunda.
Saludos

Re: Crear SolicitaDescarga de los servicios web de descarga masiva del SAT

Publicado: Lun Oct 01, 2018 12:08 pm
por Dado
Nop, tampoco he avanzado, tengo es estatus_solicitud = 1 es decir como "aceptada"

Esperaria que por lo menos avance al estatus = 2 "en proceso", pero nada

Lo malo del tuyo es que el 5 corresponde a "Rechazada" y codigo =5005 "no se encontro informacion", de ahi lo veo mas grave, como que mejor intenta otro juego de valores