Ver Mensaje Individual
  #12  
Antiguo 10-11-2012
Alexis De la Cr Alexis De la Cr is offline
Miembro
 
Registrado: May 2006
Ubicación: Puebla
Posts: 124
Reputación: 13
Alexis De la Cr Va por buen camino
Estimados compañeros. Tengo una duda con respecto al sello digital, y aunque este tema ya esta olvidado, es el que mas se acerca a la duda que tengo

en general para obtener el sello digital, en la version 2.0 o 2.2 hay que obtener la cadena original la cual la obtengo a traves de un XSLPageProducer

mediante el siguiente codigo
Código Delphi [-]
XSLPageProducer1.XMLData := XMLDoc3;
XSLPageProducer1.FileName:='lcadenaoriginal_2_0.xslt';
cadenaoriginal := XSLPageProducer1.Content;

despues hay que eliminar todos aquellos caracteres indeseados como son el Retorno de carro, el escape, los espacios antes y despues del pipe, etc, y se codifica en UTF8 mediante el sisguiente codigo

Código Delphi [-]
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#13,'');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#10,'');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#8,'');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,'  ','');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,' |','|');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,'| ','|');
    cadenaoriginal := UTF8Encode(cadenaoriginal);

apliacamos la encriptacion md5 con la llave privada en formato pem y al resultado le aplicacmos la encriptacion base64

Código Delphi [-]
    StrPCopy(inbuf,cadenaoriginal);
    InitOpenSSL;
    key:=LoadPrivateKey(llaveprivada,'');
    EVP_SignInit(@mdctx,EVP_md5());
    EVP_SignUpdate(@mdctx,@inbuf,StrLen(inbuf));
    EVP_SignFinal(@mdctx,@outbuf,Len,key);
  EVP_MD_CTX_cleanup(@mdctx);
  EVP_PKEY_free(key);;
    FreeOpenSSL;
    result := bintobase64(@outbuf,Len);

Hasta aqui todo bien, al menos eso creo, porque en su tiempo validaba los documentos xml generados en el sat y pasaba dicha validacion. En la actualidad dicho validador del SAT me marca error de que la version 2.0 no estaba vigente en la fecha de emision del comprobante, y por mas que le he movido a las fechas no logro hacerlo funcionar.

si hay algun error y algiuen lo detecta pues le agradeceria la ayuda.

Ahora bien que pasa con el sello en la version 3.2? es exactamente el mismo tratamiento excepto que en lugar de hacer la encriptacion md5, se hace con sha1? porque asi lo he intentado y el v alidador del sat me rechaza el sello de l documento, incluso con esta herramienta el sello sale distinto

http://solucionfactible.com/sfic/cap...rramientaSello


utilizo el siguiente codigo

Código Delphi [-]

     XSLPageProducer1.XMLData := XMLDoc3;
     XSLPageProducer1.FileName:='cadenaoriginal_3_2.xslt';
    cadenaoriginal := XSLPageProducer1.Content;

    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#13,'');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#10,'');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,#8,'');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,'  ','');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,' |','|');
    cadenaoriginal := AnsiReplaceStr(cadenaoriginal,'| ','|');
    cadenaoriginal := UTF8Encode(cadenaoriginal);

    StrPCopy(inbuf,cadenaoriginal);
    InitOpenSSL;
    key:=LoadPrivateKey(llaveprivada,'');
    EVP_SignInit(@mdctx,EVP_sha1());
    EVP_SignUpdate(@mdctx,@inbuf,StrLen(inbuf));
    EVP_SignFinal(@mdctx,@outbuf,Len,key);
  EVP_MD_CTX_cleanup(@mdctx);
  EVP_PKEY_free(key);;
    FreeOpenSSL;
    result := bintobase64(@outbuf,Len);


muchas gracias por su tiempo, y por su ayuda en caso de aplicar

Alexis De la Cruz
Responder Con Cita