Firmar archivo con firma electrónica .p12

mod_harbour es un módulo para Apache que permite correr tus PRGs directamente en la web!!!

Firmar archivo con firma electrónica .p12

Postby leandro » Tue Feb 01, 2022 1:59 pm

Hola buenos días para todos

Debido a una pregunta que hicieron la sección de xharbour, me surge una idea, y con esta una duda.

Es posible firmar archivos, con certificado de firma electrónica .p12

De antemano gracias
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1688
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Firmar archivo con firma electrónica .p12

Postby Antonio Linares » Thu Feb 03, 2022 10:44 am

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42203
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Firmar archivo con firma electrónica .p12

Postby wilsongamboa » Thu Feb 10, 2022 1:01 pm

Leandro buenos dias
Seguro que si es mas yo tambien lo necesito mi pregunta era sobre firma pdfs con un .p12 me quede a medio camino porque escpapa mis conocimientos este tema aca un ejemplo que saque del foro creo es de Diego Fazio
Code: Select all  Expand view  RUN
/*
Hola Amigos
Aqui les dejo como uso la HB_cms_SignFile() en mi sistema para pedir un Ticket
de Acceso a AFIP y emitir una factura electrónica en Agentina
*/


//----------------------------------------------------------------------------//
FUNCTION Opc_PidoNuevoTA()

Local cBat, cOpenSSL,nError
Local nHandle
Local aRespuesta
local cCuitNew := cCuit
Local cSource := 'C=AR, O=' + cEmpresa + ', serialNumber=CUIT '+ cCuitNew +', CN='+cRazon
Local cDestinationDn := 'cn=wsaa,o=afip,c=ar,serialNumber=CUIT 33697454239'
local nId := val(LeeIni('FactElec','ID')) + 1
Local cUniqueId := cValToChar( nId ) // EL NUMERO QUE IDENTIFICA EL REQUERIMIENTO, TIENE QUE SER DISTINTO CADA VEZ
Local cGenerationTime := TimeFMT( HB_DateTime(), -1 ) // - 1Hs
Local cExpirationTime := TimeFMT( HB_DateTime(), 1 ) // + 1Hs
Local cService := 'wsfe' // The WS service name you are asking a TA for ( "wdepmovimientos", "wsfe" )
Local cXML := '' // Variable donde Armo el XML
Local cCMS := '' // Variable donde esta el XML y su Firma Electronica
Local cTRA := '' // Ticket de requerimiento de Acceso
Local cCMS_Base64 := '' // Variable donde esta el CMS Codificado en Base64
Local cCmdSign := '' // Comando para llamar a OpenSsl y Generar la Firma del Archivo XML
Local cPathOpenSsl := 'C:\OpenSSL-Win32\Bin' // Donde Tengo Instalado OpenSsl
Local cRespuesta := ''
local aErrores := {'Firma OK','al abrir el archivo .CRT','al abrir el archivo .KEY','al Crear el Objeto Private.Key',;
'...la Key no corresponde al Certificado','al abrir el archivo a Firmar','al crear el objeto CMS',;
'al asignar Data al objeto CMS','al cerrar la data del objeto CMS','al crear el Archivo de Salida',;
'en la generación final del archivo CMS' }

If File( cPath+'TA.xml')
Ferase( cPath+'TA.xml')
Ferase( cPath+'TRA.tmp')
Ferase( cPath+'TRA.xml')
End

* Grabo el nuevo numero de ID
EscribeIni( 'FactElec','ID', nId )

* Armo El Archivo Xml con el mensaje del TRA (LoginTicketRequest.xml)
cXml += '<?xml version="1.0" encoding="UTF-8"?>' + CRLF
cXml += '<loginTicketRequest version="1.0">' + CRLF
cXml += ' <header>' + CRLF
*cXml += ' <source>' + cSource + '</source>' + CRLF
*cXml += ' <destination>' + cDestinationDn + '</destination>' + CRLF
cXml += ' <uniqueId>' + cUniqueId + '</uniqueId>' + CRLF
cXml += ' <generationTime>' + cGenerationTime + '</generationTime>' + CRLF
cXml += ' <expirationTime>' + cExpirationTime + '</expirationTime>' + CRLF
cXml += ' </header>' + CRLF
cXml += ' <service>' + cService + '</service>' + CRLF
cXml += '</loginTicketRequest>' + CRLF

* Grabo el Archivo XML con el Nombre TRA.xml
If( ( nHandle := fcreate( cPath+'TRA.xml', 0 ) ) == -1 )
MsgStop( 'NO se pudo crear TRA.xml',' ERROR' )
Return( .F. )
Else
fWrite( nHandle, cXml )
fClose( nHandle )
End


cCmdSign := 'openssl smime' +;
' -sign' +;
' -in ' + cPath+ 'TRA.xml' +; // Archivo XML a Firmar
' -out ' + cPath+ 'TRA.tmp' +; // Archivo con la Firma
' -signer ' + cPath + cCert +; //
' -inkey ' + cPath + cPrivateKey + ; //
' -outform ' + 'DER' +; // Lo Graba en Binario ('PEM' lo graba como numeros con 4 lineas de titulos)
' -nodetach' // NO se Incluye el Archivo Original en la Salida
cBat := ''
cBat += 'path ' + cPathOpenSsl + CRLF
cBat += cCmdSign + CRLF

if( file(cPath+'FirmoXML.bat'), ferase(cPath+'FirmoXML.bat'),nil)
    MemoWrit( cPath+'FirmoXML.bat', cBat )

    //..si no tiene la libcrypto.dll usa OpenSSSL para generar TRA.TMP
    IF file('.\libcrypto-3.dll')

        nError := HB_CMS_SignFile( cPath + 'TRA.XML', '.' + cCert, '.\' + cPrivateKey, cPath + 'TRA.TMP' )
        if nError != 1
            MsgStop( '
ERROR: ' + aErrores[nError] + CRLF +;
            '
REINTENTE...','ERROR EN GENERACION DEL TICKET DE ACCESO')
        Retu .T.
    endif

ELSE
    HB_run( cPath+'
FirmoXML.bat' ) //.. esto es lo que reemplaza la Hb_cms_signFile()

    /* el archivo firmoXML.bat llama al openssl y contiene este comando:
    path C:\OpenSSL-Win32\Bin
    openssl smime -sign -in C:\Fiscales\Electronicas\TRA.xml -out C:\Fiscales\Electronicas\TRA.tmp -signer
    C:\Fiscales\Electronicas\mariano_d79b556860f0566.crt -inkey C:\Fiscales\Electronicas\Privada.key -outform DER -nodetach
    */
ENDIF

cCMS := MemoRead( cPath+'
TRA.tmp' ) // Leo el Archivo Firmado
* Codifico en base64
cCMS_Base64 := hb_base64Encode( cCMS ) // Funcion de Harbour

* Llamo al WS de Autenticaci¢n (WSAA)
//..excluir para hacer pruebas
cRespuesta := LlamoAlWSAA( cCMS_Base64 )

MemoWrit( cPath+'
TA.xml', cRespuesta )
if empty(cRespuesta)
MsgStop( '
OCURRIO UN ERROR EN EL WEBSERVICE DE AFIP... ',' ERROR')
Retu .T.
endif

Retu .T.

/*
    Espero les sea de utilidad !
    Abrazo a todos
*/

los archivos necesarios los tengo me avisas para enviartelos si quieres hacer pruebas
espero sea de ayuda
Wilson 'W' Gamboa A
Wilson.josenet@gmail.com
User avatar
wilsongamboa
 
Posts: 600
Joined: Wed Oct 19, 2005 6:41 pm
Location: Quito - Ecuador


Return to mod_harbour

Who is online

Users browsing this forum: No registered users and 2 guests