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
/*
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
*/
Users browsing this forum: No registered users and 15 guests