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
Firmar archivo con firma electrónica .p12
- leandro
- Posts: 1744
- Joined: Wed Oct 26, 2005 2:49 pm
- Location: Colombia
- Has thanked: 34 times
- Been thanked: 10 times
- Contact:
Firmar archivo con firma electrónica .p12
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com
[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com
[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
- Antonio Linares
- Site Admin
- Posts: 42519
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
- wilsongamboa
- Posts: 614
- Joined: Wed Oct 19, 2005 6:41 pm
- Location: Quito - Ecuador
- Been thanked: 5 times
Re: Firmar archivo con firma electrónica .p12
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
los archivos necesarios los tengo me avisas para enviartelos si quieres hacer pruebas
espero sea de ayuda
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
/*
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
Wilson.josenet@gmail.com