CRLibre / API_Hacienda

API libre para Factura Electrónica en Costa Rica, interfaz para integrar sistemas con el Ministerio de Hacienda para la Facturación Electrónica
https://crlibre.org/factura-electronica/
GNU Affero General Public License v3.0
165 stars 120 forks source link

Error con la firma digital xades-epes #5

Closed apokalipto closed 6 years ago

apokalipto commented 6 years ago

La firma no es válida. Aquí adjunto los pasos que he estado siguiendo, para corroborar si a ustedes les sucede lo mismo cuando intenan firmar el documento.

Primero para efectos prácticos, hice un script en PHP para encapsular la funcionalidad del Firmador, y poder firmar el XML desde la línea de comando.

<?php
    include 'Firmadohaciendacr.php';

    $cert = $argv[1];
    $pin = $argv[2];
    $xmlIn = $argv[3];
    $xmlOut = $argv[4];

    $signer = new Firmadocr();
    echo "Certificado: " . $cert . "\n";
    echo "PIN: " . $pin .  "\n";
    echo "IN: " . $xmlIn . "\n";
    echo "OUT: " . $xmlOut . "\n";

    $signer->firmar($cert,$pin,$xmlIn,$xmlOut);

?>

Los pasos concretos para reproducir el error:

  1. Generar el XML: https://gist.github.com/apokalipto/f7697db0bedab130d3f78f4d4d4000b0
  2. Firmar XML: php -q firmar.php <keyPath> <keyPassword> <xmlInPath> <xmlOutPath>
  3. Enviar documento firmado al API. Respuesta => HTTP 202 (estado aceptado)
  4. Hacer query para verificarlo: GET "https://api.comprobanteselectronicos.go.cr/recepcion-sandbox/v1/recepcion/50609021800011190015800100001010000000023199999999"

La respuesta es la siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<MensajeHacienda xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.1/mensajeHacienda">
    <Clave>50609021800011190015800100001010000000023199999999</Clave>
    <NombreEmisor/>
    <TipoIdentificacionEmisor>02</TipoIdentificacionEmisor>
    <NumeroCedulaEmisor> 3102111111 </NumeroCedulaEmisor>
    <NombreReceptor/>
    <TipoIdentificacionReceptor>02</TipoIdentificacionReceptor>
    <NumeroCedulaReceptor>3001123208</NumeroCedulaReceptor>
    <Mensaje>3</Mensaje>
    <DetalleMensaje>Este comprobante fue procesado en el ambiente de pruebas, por lo cual no tiene validez para fines tributarios.

La firma del comprobante electrónico no es válida</DetalleMensaje>

Les comento que he estado teniendo el mismo problema con varias soluciones. También con implementaciones en Java:

Saben que podría estar pasando? A ustedes les da el mismo error? De antemano se les agradecen sus comentarios.

rvargasp commented 6 years ago

Ya intentó cambiando la versión del esquema en la URL a 4.2?

apokalipto commented 6 years ago

El problema no era con la firma. El problema era con el XML, y su codificación en base64 a la hora de enviarlo. La respuesta de rechazo debido a que "la firma del comprobante electrónico no es válida, NO NECESARIAMENTE se refiere a la firma digital en sí. Puede estar asociada a problemas con el XML. Adjunto algunas de las posibles causas.

lurobaca commented 6 years ago

Estoy con el tema del firmado de mis xml con la API de CRLibre y veo que aqui hablan del tema he indican que la firma se ejecuta correctamente con el codigo de abajo pero me quedan las dudas sobre los valores que van en los parametros podrian darme una luz de donde los consigo ya que no logro encontrar informacion de que debe ir ahi de antemano gracias

$cert = $argv[1]; // QUE INFORMACION COLOCO AQUI,  DONDE LA CONSIGO?
$pin = $argv[2]; // QUE INFORMACION COLOCO AQUI  DONDE LA CONSIGO?
$xmlIn = $argv[3]; //ESTA ES LA RUTA DEL XML QUE DESEO FIRMAR CORRECTO ?
$xmlOut = $argv[4];// ESTO ES DONDE DESEO QUE SE GUARDE MI XML FIRMADO?

`<?php include 'Firmadohaciendacr.php';

$cert = $argv[1]; // QUE INFORMACION COLOCO AQUI,  DONDE LA CONSIGO?
$pin = $argv[2]; // QUE INFORMACION COLOCO AQUI  DONDE LA CONSIGO?
$xmlIn = $argv[3]; //ESTA ES LA RUTA DEL XML QUE DESEO FIRMAR CORRECTO ?
$xmlOut = $argv[4];// ESTO ES DONDE DESEO QUE SE GUARDE MI XML FIRMADO?

$signer = new Firmadocr();
echo "Certificado: " . $cert . "\n";
echo "PIN: " . $pin .  "\n";
echo "IN: " . $xmlIn . "\n";
echo "OUT: " . $xmlOut . "\n";

$signer->firmar($cert,$pin,$xmlIn,$xmlOut);

?>`

lurobaca commented 6 years ago

creo que me contesto solo, si no me equivoco los parámetros para firmar los obtenemos a a la hora de obtener el usuario y contraseña del ATV, primero vamos a ATV https://www.hacienda.go.cr/atv/login.aspx

luego seguimos los pasos para obtener el certificado digital llengo al menu COMPROBANTE ELECTRONICO/LLAVE CRIPTOGRAFICA DE PRUEBA/GENERAR LLAVE CRIPTOGRAFICA .

después de llenar la información del formulario con el PIN que solicita el cual colocamos en el parámetros $pinP12 y descargar el archivo que lleva como nombre la cedula del contribuyente , emisor y o persona que necesita el usuario y clave del atv y este archivo lleva extencion .p12 ejem: 310120005785.p12 el cual necesitamos guardar y luego debemos indicar la ruta de ese archivo en el parematro $p12Url . los otros 2 parámetros imagino que es mas fácil identificarlos, el parámetros $xmlIn solo es la ruta donde tenemos el XML que deseamos firmar y $xmlOut es la ruta donde se almacenara el xml ya firmado o al menos eso es lo que entiendo

`function signFE(){ require 'Firmadohaciendacr.php'; modules_loader("files");
$p12Url= filesGetUrl(params_get('p12Url')); //URL del archivo descargado del ATV de hacienda con extencion .p12 y lleva como nombre la cedula del controbuyente

$pinP12= params_get('pinP12'); //Pin del certificado, este el el pin que solicita la llave criptografica cuando ejecutamos el archivo .p12 que descargamos de ATV

$inXmlUrl= filesGetUrl(params_get('inXmlUrl')); //URL en el servidor donde esta el XML que se va a firmar

$outXmlUrl= params_get('outXmlUrl');//almacena la URL donde se almacena el XML con la firma

$tipodoc=params_get('tipodoc');// URL en el servidor donde va a salir el XML firmado

    $fac = new Firmadocr();        
    $fac->firmar($p12Url, $pinP12,$inXmlUrl,$outXmlUrl,$tipodoc );

    return $outXmlUrl;

} ?>`

asegurabadilla commented 6 years ago

@apokalipto Me podrías ayudar.. Seguí todos los consejos anteriores pero sigo sin poder tener respuesta acertada de hacienda. ind-estado": "rechazado" La firma del comprobante electrónico no es válida. Algún consejo?

lurobaca commented 6 years ago

eso a mi me paso y lo corregi revisa los encabezados de cada documento, todos los xml son iguales lo unico que varia son los encabezados y el tag de cierre, en CRLibre whatsapp publicaron una clase en php con cada encabezado, te lo pasaria pero ahorita estoy fuera de la compu,puede ser eso, algun espacio mal dado o enter mal dado. o usuarios y clave;de ATV malos , podrias volverlos a generar y volver a instalar el archivo .p12

El vie., 25 de may. de 2018 9:24 PM, asegurabadilla < notifications@github.com> escribió:

@apokalipto https://github.com/apokalipto Me podrías ayudar.. Seguí todos los consejos anteriores pero sigo sin poder tener respuesta acertada de hacienda. ind-estado": "rechazado" La firma del comprobante electrónico no es válida. Algún consejo?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/CRLibre/API_Hacienda/issues/5#issuecomment-392229017, or mute the thread https://github.com/notifications/unsubscribe-auth/AF94RLhbk9HxumI29JM5L_AhOhDSA-Kfks5t2LzpgaJpZM4SBDMG .

asegurabadilla commented 6 years ago

@lurobaca gracias por su respuesta. Este es el encabezado que estoy utilizando.

<FacturaElectronica 
xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" 
xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica.xsd">

Además cuando se codifica a Base64, también lo he echo como indica @apokalipto sin retornos de carro(\n). Estoy utilizando xades4j el código de @edennish.

jparajeles commented 6 years ago

Han encontrado una soluccion sobre este tema, me muestra un error al enviar el xml:

:SSL certificate problem: unable to get local issuer certificate

Saludos

lurobaca commented 6 years ago

vuelva a generar el certificado o verifique la ruta de acceso al mismo

2018-05-28 1:14 GMT-06:00 jparajeles notifications@github.com:

Han encontrado una soluccion sobre este tema, me muestra un error al enviar el xml:

:SSL certificate problem: unable to get local issuer certificate

Saludos

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/CRLibre/API_Hacienda/issues/5#issuecomment-392440489, or mute the thread https://github.com/notifications/unsubscribe-auth/AF94RJaX3OCswlNY_CSGRnwqRueSdQXYks5t26PmgaJpZM4SBDMG .

-- Luis Roberto Bastos C Bach.Informatica Empresarial Tecnico y desarrollador de software http://esneitec.com/

nayrban commented 6 years ago

Alguno tiene un ejemplo de un documento valido que hayan probado contra staging? Este es lo genero yo, pero de igual forma no es valido para hacienda. Documento Firmado

Lo validamos contra https://apis.gometa.org/validar/ y es valido, la verdad no tenemos idea xq hacienda retorna ese error de manera generica

Cambiamos el formato de la fecha, corregimos unos montos, encabezados como los que mencionan arriba. Pero no tenemos la menor idea

gutiman commented 6 years ago

Estoy en el mismo caso de nayrban.

Ya no se que más hacer más que arrancarme el pelo lol.

Alguno pudo firmar y enviar el comprobantwe exitosamente?

nehemiascr commented 6 years ago

Me sucedió el mismo problema, al xml le faltaba la declaración de xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>

estaba codificando en base64 el string

<FacturaElectronica xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica  https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/FacturaElectronica_V.4.2.xsd">
  <Clave>

en lugar de codificar el string con la declaración de xml

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<FacturaElectronica xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica  https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/FacturaElectronica_V.4.2.xsd">
  <Clave>

Al codificar en base64 la hilera que incluye la declaración de xml no me da el error :)

mamm26 commented 6 years ago

@gutiman, @nehemiascr: En la última actualización del API siguen presentando este problema?

gutiman commented 6 years ago

Al final mi problema era similar al de @nehemiascr.

Yo guardaba el XML firmado en la DB y luego lo leía de ahí para enviarlo a hacienda. Resulta que la DB lo manoseaba y me le perdía la integridad a la firma.

Saludos.