FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Firma electr贸nica con certificados (Webinar)
Posts: 56
Joined: Mon Apr 11, 2011 06:22 PM
Firma electr贸nica con certificados (Webinar)
Posted: Thu Sep 19, 2024 10:52 AM
Ante todo mil disculpas por no poder ofrecer en el webinar del pasado 9 de septiembre esta informaci贸n, que hab铆a estado anunciada por nuestro master A.Linares
Por motivos de fuerza mayor estuve ausente unos dias...
As铆 que voy a intentar clarificar unas ideas que hace tiempo escrib铆, a fin de que sean 煤tiles a la comunidad

Lo que aqu铆 expondr茅 es producto de la investigaci贸n en posibilidades y herramientas para poder firmar electronicamente documentos,
desde nuestros programas harbour/Fivewin, especialmente en formato XML enfocado a la facturaci贸n electr贸nica

Decir tambi茅n que la firma digital es una tarea compleja, que intervienen multitud de variables y hacerlo de forma nativa en harbour,
si bien fue una de mis motivaciones iniciales a partir de la infraestructura proporcionada por Windows y sin dependencias externas, me result贸 una labor tit谩nica
que he abandonado, por falta de tiempo y seguramente de preparaci贸n

En la parte final de este post, describir茅 el proceso por el cual me llev贸 al desaf铆o de la firma nativa en harbour
y dejar茅 unas directrices por si alguien quiere continuar ...
De forma pr谩ctica, voy a detallar las herramientes que utilizo o tengo cierto conocimiento, para delegar este tema de la firma, con utilidades de terceros

Cualquier nueva informaci贸n, herramientas o m茅todos utilizados, ser谩 muy bienvenida para ampliar esta informaci贸n
Por supuesto, ante cualquier error u omisi贸n, rectif铆quenme por favor !

Fijemos algunos conceptos ...

Qu茅 es una firma electr贸nica ?
Es un fichero que contiene informaci贸n sobre el documento original, el firmante, la fecha de la firma, algoritmos utilizados y posible caducidad de la firma


Formatos principales de firma
  • CAdES (CMS Avanzado) : Es la evoluci贸n del primer formato de firma estandarizado. Es apropiado para firmar ficheros grandes, especialmente si la firma contiene el documento original porque optimiza el espacio de la informaci贸n. Tras firmar, no podr谩s ver la informaci贸n firmada, porque la informaci贸n se guarda de forma binaria
  • XAdES (XML Avanzado) : El resultado es un fichero de texto XML, un formato de texto muy similar al HTML que utiliza etiquetas. Los documentos obtenidos suelen ser m谩s grandes que en el caso de CAdES, por eso no es adecuado cuando el fichero original es muy grande. Aplicaciones como eCoFirma o facturae de las Administraciones P煤blicas en Espa帽a firman en XAdES
  • PAdES (PDF Avanzado) : Este es el formato m谩s adecuado cuando el documento original es un pdf. El destinatario de la firma puede comprobar f谩cilmente la firma y el documento firmado. Con los formatos anteriores esto no es posible si no se utilizan herramientas externas
  • OOXML y ODF : Son los formatos de firma que utilizan Microsoft Office y Open Office, respectivamente

Subformatos (perfiles) de XAdES (XML Advanced Electronic Signatures, Firma electr贸nica avanzada XML)
  • XAdES-BES, forma b谩sica que simplemente cumple los requisitos legales de la Directiva para firma electr贸nica avanzada
  • XAdES-EPES, forma b谩sica a la que se le ha a帽adido informaci贸n sobre la pol铆tica de firma
  • XAdES-T (timestamp), a帽ade un campo de sellado de tiempo para proteger contra el repudio
  • XAdES-C (complete), a帽ade referencias a datos de verificaci贸n (certificados y *as de revocaci贸n) a los documentos firmados para permitir verificaci贸n y validaci贸n off-line en el futuro (pero no almacena los datos en s铆 mismos)
  • XAdES-X (extended), a帽ade sellos de tiempo a las referencias introducidas por XAdES-C para evitar que pueda verse comprometida en el futuro una cadena de certificados
  • XAdES-X-L (extended long-term), a帽ade los propios certificados y listas de revocaci贸n a los documentos firmados para permitir la verificaci贸n en el futuro incluso si las fuentes originales (de consulta de certificados o de las listas de revocaci贸n) no estuvieran ya disponibles

Qu茅 necesito para firmar electr贸nicamente un documento ?
El documento a firmar (PDF, XML, ...)
Un certificado digital expedido por una Autoridad Certificadora, por ejemplo : https://www.sede.fnmt.gob.es/certificados/certificado-de-representante


Tipos de Certificados
Existen una multitud de certificados digitales para amplios prop贸sitos en seguridad, voy a centrarme
en los certificados m谩s comunes para la facturaci贸n electr贸nica, seg煤n X.509 que es un est谩ndar para
infraestructura de claves publicas (PKI)
  • Sintaxis definida en lenguaje ASN.1 (Abstract Syntax Notation One)
  • Extensiones de archivos de certificado X.509 :
  • .CER - Certificado codificado en CER (Canonical Encoding Rules), algunas veces es una secuencia de certificados
  • .DER - Certificado codificado en DER (Distinguished Encoding Rules)
  • .PEM - Certificado codificado en Base64, encerrado entre "-----BEGIN CERTIFICATE-----" y "-----END CERTIFICATE-----"
    Puede contener certificados o claves privadas, encerrados entre las l铆neas BEGIN/END
  • .P7B - Ver .p7c
  • .P7C - Estructura PKCS#7 SignedData sin datos, solo certificado(s) o CRL(s)
  • .PFX - Ver .p12
  • .P12 - PKCS#12, puede contener certificado(s) (p煤blico) y claves privadas (protegido con clave)
  • Por razones hist贸ricas (en la actualidad son lo mismo)
    • .pfx: es la copia de seguridad con clave privada de un certificado (exportado desde Internet Explorer)
    • .p12: es la copia de seguridad con clave privada de un certificado (exportado desde Firefox)


  • Sistemas criptogr谩ficos de clave p煤blica
    Los anteriores certificados, suelen utilizar alguno de estos algoritmos :
    • RSA = Rivest, Shamir y Adleman
    • ECC = Criptograf铆a de curva el铆ptica


    Algunos tipos de Firma
    • PKCS = Public-Key Cryptography Standards. Grupo de est谩ndares de criptograf铆a de clave p煤blica publicados por RSA
      Conjunto de algoritmos de clave asim茅trica, que es un sistema criptogr谩fico que se caracteriza por utilizar dos claves, una clave p煤blica y otra privada
    • PKCS#1 : Est谩ndar criptogr谩fico RSA
    • PKCS#3 : Est谩ndar de intercambio de claves Diffie-Hellman
    • PKCS#5 : Est谩ndar de cifrado basado en contrase帽as
    • PKCS#7 : Usado para firmar y/o cifrar mensajes en PKI
    • PKCS#10: Formato de los mensajes enviados a una Autoridad de certificaci贸n para solicitar la certificaci贸n de una clave p煤blica
    • PKCS#11: Define un API gen茅rico de acceso a dispositivos criptogr谩ficos
    • PKCS#15: https://es.wikipedia.org/wiki/PKCS


    Utilidades del sistema (tambi茅n desde cmd) para obtener informaci贸n de certificados instalados
    Code (fw): Select all Collapse
    聽 聽 rem Lista certificados instalados en el sistema, desde cmd o powershell 
    聽 聽 聽 聽 > certutil -user -store my
    聽 聽 rem Acceso GUI almacen de certificados
    聽 聽 聽 聽 > certmgr.exe

    Herramientas y utilidades de terceros
    • Autofirma
    • Chilkat
    • Microsoft signtool
    • EZSignIt
    • XolidoSign
    • XML Signer (XAdES)
    • OpenSSL

    Autofirma
    Es una herramienta con interfaz gr谩fica proporcionada por el Ministerio de Hacienda y Administraciones P煤blicas en Espa帽a, que
    permite la ejecuci贸n de operaciones de firma de ficheros locales en entornos de escritorio
    (Windows, Linux y Mac OS X). Ofrece la posibilidad de realizar firmas de cualquier tipo de documento
    Dispone de una api que puede ser llamada desde harbour (hb_processRun) o FWH (ShellExecute), sin intervenci贸n del usuario

    Ejemplo de firma de factura electronica, con pol铆tica de firma y certificado en fichero (formato pfx, con usuario/contrase帽a)
    Code (fw): Select all Collapse
    聽 聽 聽 聽 cPolicy := '\npolicyIdentifier=https://www.facturae.gob.es/formato/Polticasfirma/A)%20Versi%C3%B3n%203.1/Politica_Firma_formato_facturae_v3_1.pdf';
    聽 聽 聽 聽 cPolicy += '\npolicyQualifier=https://www.facturae.gob.es/formato/Polticasfirma/A)%20Versi%C3%B3n%203.1/Politica_Firma_formato_facturae_v3_1.pdf';
    聽 聽 聽 聽 cPolicy += '\npolicyIdentifierHash="Ohixl6upD6av8N7pEvDABhEL6hM='
    聽 聽 聽 聽 cPolicy += '\npolicyIdentifierHashAlgorithm="http://www.w3.org/2001/04/xmlenc#sha256"'
    聽 聽 聽 聽 cPolicy += '\npolicyDescription="" '
    聽 聽 聽 聽 
    聽 聽 聽 聽 autofirmaCommandLine.exe sign 
    聽 聽 聽 聽 聽 聽 -i request.xml -o request.xml.xsig 
    聽 聽 聽 聽 聽 聽 -config format="XAdES Enveloped"+ cPolicy
    聽 聽 聽 聽 聽 聽 -format xades -algorithm SHA512withRSA 
    聽 聽 聽 聽 聽 聽 -store pkcs12:certificado.pfx -password 1234 -filter

    Ejemplo de firma de fichero XML con certificado del almacen de certificados del usuario, mediante uso de alias
    alias_certificado = nombre descriptivo que podemos ver con certmgr.exe
    Code (fw): Select all Collapse
    聽 聽 聽 聽 autofirmaCommandLine.exe sign 
    聽 聽 聽 聽 -i test.xml -o test.xml.xsig 
    聽 聽 聽 聽 -config format="XAdES Enveloped" 
    聽 聽 聽 聽 -format xades 聽
    聽 聽 聽 聽 -store windows -alias "alias_certificado"

    Verificar la firma, informar de toda la ruta del fichero
    Code (fw): Select all Collapse
    聽 聽 聽 聽 autofirmaCommandLine.exe verify -i c:\path\test.xml.xsign

    ChilKat
    • Se distribuye en varios formatos, tambi茅n en formato DLL ActiveX
    • Es de pago pero se puede descargar y utilizar de forma gratuita en la mayoria de sus funciones
    • Si es necesario registrar, se pueden unir 4 desarrolladores y comprar una licencia de 369 USD, vale lo que cuesta !
    • Estamos ante la navaja suiza de la criptografia y firma para Windows (y un sinfin de utilidades m谩s)
    • Son los aut茅nticos especialistas del tema, lo que no se pueda firmar con esta DLL dificilmente se podr谩 firmar con nada
    • Implementan con ejemplos la facturaci贸n electr贸nica de varios paises
    • Existen multitud de ejemplos en FoxPro y Visual Basic que facilmente son trasladables a harbour
    Code (fw): Select all Collapse
    聽 聽 聽 聽 oXmlToSign := CreateObject('Chilkat_9_5_0.Xml')
    聽 聽 聽 聽 // Se completa toda la lista de tags segun el formato de factura electronica de cada pais
    聽 聽 聽 聽 ...
    聽 聽 聽 聽 // Se crea el objeto para la digesti贸n del documento
    聽 聽 聽 聽 oGen := CreateObject('Chilkat_9_5_0.XmlDSigGen')
    聽 聽 聽 聽 ...
    聽 聽 聽 聽 // Se crea un objeto xml para a帽adir la firma y se a帽aden atributos
    聽 聽 聽 聽 oObject := CreateObject('Chilkat_9_5_0.Xml')
    聽 聽 聽 聽 ...
    聽 聽 聽 聽 // Se a帽ade la firma al objeto y el resto de propiedades
    聽 聽 聽 聽 oGen:AddObject("Signature869123-Object629337", oObject:GetXml(),"","")
    聽 聽 聽 聽 ...
    聽 聽 聽 聽 // Se obtiene el certificado para firmar en formato PFX
    聽 聽 聽 聽 oCert := CreateObject('Chilkat_9_5_0.Cert')
    聽 聽 聽 聽 nSuccess := oCert:LoadPfxFile("certificado.pfx","mi_password")
    聽 聽 聽 聽 
    聽 聽 聽 聽 // Podemos obtener el error con
    聽 聽 聽 聽 ? oCert:LastErrorText
    聽 聽 聽 聽 
    聽 聽 聽 聽 // Cargar el objeto XML generado al principio y que va a ser firmado
    聽 聽 聽 聽 oSbXml := CreateObject('Chilkat_9_5_0.StringBuilder')
    聽 聽 聽 聽 oXmlToSign:GetXmlSb(oSbXml)
    
    聽 聽 聽 聽 // Firma del XML
    聽 聽 聽 聽 nSuccess = oGen:CreateXmlDSigSb(oSbXml)
    聽 聽 聽 聽 
    聽 聽 聽 聽 // Podemos obtener el error con
    聽 聽 聽 聽 ? oCert:LastErrorText
    聽 聽 聽 聽 
    聽 聽 聽 聽 // Guardar el XML firmado en un archivo
    聽 聽 聽 聽 nSuccess := oSbXml:WriteFile("test.xml.sign","utf-8",0)
    
    聽 聽 聽 聽 // Tambien podemos guardar a la harbour
    聽 聽 聽 聽 hb_memowrit("test.xml.sign", oSbXml:GetAsString() )

    Signtool
    Es una utilidad en l铆nea de comandos de Microsoft utilizada principalmente para firmar digitalmente archivos ejecutables,
    controladores y otros tipos de archivos binarios en Windows, como parte de la seguridad del software y la distribuci贸n
    Es 煤til para firmar ejecutables y asegurar la integridad y autenticidad de aplicaciones, pero no est谩 dise帽ado
    para firmar facturas electr贸nicas, que suelen estar en formatos estructurados XML


    EZSignIt
    Alternativa libre (y distribuible) a Signtool, ejecutable desde linea de comando y GUI
    Sirve para la firma de codigo (exe, dll, ocx)
    No sirve para la firma XADES XML


    XolidoSign
    Programa de escritorio GRATUITO para firmar, verificar y sellar con tiempo documentos electr贸nicamente
    No he visto que pueda realizar firma para facturaci贸n electr贸nica
    Me consta que es utilizado por notar铆as y registradores para firma digital, pero no lo he probado personalmente


    XML Signer (XAdES)
    Programa de pago para firma masiva de XML con certificados digitales X.509
    Aunque estampa la firma, no he conseguido que validara para factura-e
    Desconozco si se le puede llamar desde linea de comando


    OpenSSL
    Potente herramienta de l铆nea de comandos y biblioteca criptogr谩fica que se utiliza ampliamente para operaciones de cifrado,
    firma y manejo de certificados. Sin embargo, con OpenSSL no es posible firmar facturas electr贸nicas.
    El motivo principal es que normalmente se requiere del est谩ndar XAdES (XML Advanced Electronic Signatures) y OpenSSL no est谩 dise帽ado
    espec铆ficamente para manejar firmas electr贸nicas
    Sin embargo creo que nos puede ayudar en las operaciones criptogr谩ficas y de certificados, si vamos a construir por nuestra cuenta el formato XADES


    Firmar con harbour sin dependencias de terceros ?

    Bueno, esta es la gran pregunta que me hice al descubrir que los colegas de FoxPro y en particular Fernando Mora, firmaban XML de facturaci贸n electr贸nica en varios paises latinoamericanos,
    sin necesidad de ninguna dependencia externa, directamente utilizando la criptografia propia de Windows (dejo el enlace en fuentes)

    A partir de Windows Vista -creo- el propio sistema operativo provee de las siguientes api :
    • wincrypt: API de criptograf铆a de Windows (Cryptographic API), tambi茅n conocida como CryptoAPI
    • bcrypt : API de criptograf铆a de Windows CNG (Cryptography Next Generation)
    • ncrypt : API para la gesti贸n de Claves Criptogr谩ficas CNG
    • cryptui : API que proporciona una interfaz gr谩fica para gestionar y operar con certificados

    wincrypt
    • Manejo de Certificados, permite trabajar con certificados digitales X.509, proporcionando funciones para crear, importar, exportar, validar y administrar certificados
    • Cifrado y Descifrado utilizando algoritmos como RSA, AES, y DES
    • Generaci贸n de claves sim茅tricas y asim茅tricas para su uso en operaciones de cifrado, firmas digitales y otros procesos criptogr谩ficos
    • Generaci贸n de hashes seguros mediante algoritmos como SHA-1, SHA-256 y SHA-512
    • Algunas funciones ya no est谩n disponibles en sistemas Windows 10/11 y hay que utilizar CNG (bcrypt)

    bcrypt
    • Generaci贸n y Manejo de Claves Criptogr谩ficas
    • Cifrado y Descifrado utilizando algoritmos como AES, DES, 3DES, entre otros
    • Generaci贸n de hashes seguros mediante algoritmos como SHA-1, SHA-256 y SHA-512
    • Funciones para crear y verificar firmas digitales, asegurando la autenticidad y no repudio de los datos
    • Generaci贸n de N煤meros Aleatorios Seguros (CRNG) esenciales en operaciones como la generaci贸n de claves
    • Es el reemplazo a largo plazo de CryptoAPI

    ncrypt
    • Permite crear, almacenar, exportar e importar claves criptogr谩ficas, tanto sim茅tricas como asim茅tricas.
    • Las claves pueden ser almacenadas de manera segura utilizando proveedores de almacenamiento de claves (Key Storage Providers, KSP),
    • como el Proveedor de Claves de Software de Microsoft o un M贸dulo de Seguridad de Hardware (HSM)
    • Las claves pueden ser almacenadas de forma segura en dispositivos como el Trusted Platform Module (TPM) o HSMs, lo que asegura que las claves privadas nunca sean expuestas
    • Proporciona funciones para realizar operaciones de cifrado y descifrado con algoritmos robustos, como AES, RSA, y otros.
    • Interoperabilidad con Proveedores de Servicios Criptogr谩ficos (CSP)

    cryptui
    • Gesti贸n de Certificados, permite ver, importar, exportar, y administrar certificados digitales a trav茅s de asistentes f谩ciles de usar
    • Facilita la administraci贸n de certificados X.509, incluyendo la visualizaci贸n de detalles como la autoridad de certificaci贸n, las fechas de expiraci贸n, y la cadena de confianza
    Todas estas API las podemos encontrar en nuestro sistema operativo en forma de DLL (crypt32.dll, bcrypt.dll, ncrypt.dll, cryptui.dll )

    Estan escritas en C y l贸gicamente deberemos de acceder con harbour a traves de su API C
    Tambi茅n deberemos crear las librerias de importacion .lib o .a dependiendo de nuestro compilador de C

    Como puerta de entrada a este mundo, dejo un ejemplo funcional para ilustrar el acceso a estas API y una forma de trabajo peculiar que mostr贸 el amigo Manu Exp贸sito -gracias por tu paciencia !-
    en su fant谩stico manual : Lenguaje C para programadores Harbour
    Code (fw): Select all Collapse
    /**
    聽* Test de uso funcion hb_WinGetCertificateFromStore()
    聽* v1.0 30-04-2024
    聽* (c)2024 Joaquim Ferrer <quim_ferrer@yahoo.es>
    聽*
    聽* Dialogo de seleccion de certificados de Windows
    聽* Uso :
    聽* 聽 聽hb_WinGetCertificateFromStore( <@cCertName>, [hWnd, cTitle, cDisplay] )
    聽*
    聽* Params :
    聽* 聽 聽cCertName = Variable dimensionada y pasada por referencia -requerida-
    聽* 聽 聽hWnd 聽 聽 聽= Handle de ventana, si es NIL o 0, es la ventana del escritorio
    聽* 聽 聽cTitle 聽 聽= Titulo (interior) de la ventana -opcional-
    聽* 聽 聽cDisplay 聽= Texto 聽(interior) de la ventana -opcional-
    聽*
    聽* Notas :
    聽* La libreria Chilkat no dispone -hasta la fecha- de ninguna API de acceso al
    聽* almacen de certificados de Windows. Mediante hb_WinGetCertificateFromStore
    聽* es posible obtener el nombre de un certificado (Subject Name) y pasarlo a
    聽* la funcion Chilkat.CertStore.FindCertBySubjectCN()
    聽*/
    
    function main()
    
    聽 聽local nError
    聽 聽local cCert 聽 聽:= space(64)
    聽 聽local cTitle 聽 := "Header de la ventana, ERP Nombre, ..."
    聽 聽local cDisplay := "Texto informativo para seleccionar certificado"
    
    聽 聽// Titulo y texto por defecto
    聽 聽nError := hb_WinGetCertificateFromStore( @cCert, 0, cTitle, cDisplay )
    
    聽 聽if nError == 0
    聽 聽 聽 ? "Nombre del certificado para pasar a Chilkat :"
    聽 聽 聽 ? cCert
    聽 聽else
    聽 聽 聽 ? "Error o no se ha seleccionado certificado :"
    聽 聽 聽 ? nError
    聽 聽endif
    
    return NIL
    
    #pragma BEGINDUMP
    #include <windows.h>
    #include <wincrypt.h>
    #include <cryptuiapi.h>
    #include <hbapi.h>
    #include <hbapiitm.h>
    #include <hbapierr.h>
    
    //--------------------------------------------------------------------------
    // Accede al dialogo de seleccion de certificados del almacen de
    // certificados de Windows
    // Esta funcion puede ser llamada desde C o desde PRG
    //--------------------------------------------------------------------------
    int hb_WinGetCertificateFromStore( LPSTR pszString, HWND hWnd, LPCWSTR pwszTitle, LPCWSTR pwszDisplay )
    {
    聽 聽HCRYPTPROV_LEGACY hCryptProv = 0;
    聽 聽HCERTSTORE hStore;
    聽 聽PCCERT_CONTEXT pCert;
    聽 聽DWORD dwDontUseColumn = CRYPTUI_SELECT_EXPIRATION_COLUMN;
    聽 聽DWORD dwFlags = 0; 聽 // Actualmente no se usa y debe establecerse en 0
    
    聽 聽hStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, hCryptProv, CERT_SYSTEM_STORE_CURRENT_USER, L"MY" );
    
    聽 聽if (hStore) 
    聽 聽{
    聽 聽 聽 pCert = CryptUIDlgSelectCertificateFromStore( hStore, hWnd,
    聽 聽 聽 聽 聽 聽 聽 聽 聽 pwszTitle, pwszDisplay, dwDontUseColumn, dwFlags, NULL );
    聽 聽 聽 if (pCert) 
    聽 聽 聽 {
    聽 聽 聽 聽 聽DWORD dwLen = 256;
    聽 聽 聽 聽 聽CertGetNameString( pCert, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, pszString, dwLen );
    聽 聽 聽 聽 聽return 0;
    聽 聽 聽 }
    聽 聽}
    聽 聽return 1;
    }
    
    static wchar_t * AnsiToWide( const char * szString )
    {
    聽 聽int 聽 聽 聽 iLen;
    聽 聽wchar_t * szWide;
    
    聽 聽iLen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szString, -1, NULL, 0 );
    聽 聽szWide = ( wchar_t* ) hb_xgrab( iLen * sizeof( wchar_t ) );
    聽 聽MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, szString, -1, szWide, iLen );
    聽 聽return szWide;
    }
    
    //--------------------------------------------------------------------------
    // Wrapper a PRG, ejemplo de llamada :
    // hb_WinGetCertificateFromStore(<@cCertName>, [hWnd, cTitle, cDisplay] )
    // devuelve 0 si todo va bien o 1 si hay error
    //--------------------------------------------------------------------------
    HB_FUNC( HB_WINGETCERTIFICATEFROMSTORE )
    {
    聽 聽// Variable recibida y pasada por referencia
    聽 聽LPSTR pszString = ( LPSTR ) hb_parc( 1 );
    
    聽 聽if ( pszString )
    聽 聽{
    聽 聽 聽 // Handle de ventana, si es NULL es la ventana del escritorio
    聽 聽 聽 HWND hWnd = ( HWND ) hb_parptr( 2 );
    
    聽 聽 聽 // Header de la ventana
    聽 聽 聽 LPCSTR lpSrc = hb_parcx( 3 );
    聽 聽 聽 LPCWSTR pszTitle = ( LPCWSTR ) AnsiToWide( lpSrc );
    
    聽 聽 聽 // Texto de seleccion de certificado
    聽 聽 聽 lpSrc = hb_parcx( 4 );
    聽 聽 聽 LPCWSTR pwszDisplay = AnsiToWide( lpSrc );
    
    聽 聽 聽 DWORD dwError = hb_WinGetCertificateFromStore( pszString, hWnd, pszTitle, pwszDisplay );
    
    聽 聽 聽 hb_xfree( (LPVOID) pszTitle );
    聽 聽 聽 hb_xfree( (LPVOID) pwszDisplay );
    
    聽 聽 聽 hb_storc( pszString, 1 );
    聽 聽 聽 hb_retni( dwError );
    聽 聽}
    聽 聽else
    聽 聽 聽 hb_errRT_BASE( EG_ARG, 2010, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
    }
    #pragma ENDDUMP
    Si existe dificultad en construirlas o si se quiere profundizar en este tema, he abierto repositorio p煤blico en :
    https://github.com/QuimFerrer/wincrypt

    Incluye librerias construidas para varios compiladores, el ejemplo anterior para harbour y otra alternativa desde fivewin, adem谩s de fuentes foxpro que me han servido de gu铆a

    Conforme disponga de tiempo ir茅 ampliando el repositorio con funciones C y wrappers a PRG que a煤n necesito ordenar

    Disfruten de la vida !


    Fuentes
    Posts: 44158
    Joined: Thu Oct 06, 2005 05:47 PM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Thu Sep 19, 2024 10:54 AM
    Querido Quim,

    Muchas gracias! :-)
    regards, saludos

    Antonio Linares
    www.fivetechsoft.com
    Posts: 731
    Joined: Fri Oct 07, 2005 07:42 AM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Thu Sep 19, 2024 11:07 AM
    Excelente POST Quim!!
    Esta informaci贸n vale su peso en oro.

    Muchas gracias!!! :)
    Saludos

    Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
    Posts: 990
    Joined: Wed Oct 19, 2005 02:17 PM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Thu Sep 19, 2024 11:55 AM

    Qu茅 grande eres Quim !!!

    Much铆simas gracias por compartir conocimiento.

    Un abrazo,

    Posts: 670
    Joined: Wed Oct 19, 2005 06:41 PM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Thu Sep 19, 2024 12:44 PM

    Quimm sin palabras muchas gracias razon que nunca pude hacerlo ja ja ja

    Wilson 'W' Gamboa A
    Wilson.josenet@gmail.com
    Posts: 1710
    Joined: Tue Oct 28, 2008 06:26 PM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Thu Sep 19, 2024 01:37 PM

    Muchas Gracias estimado Quimm por tan valiosa informaci贸n

    Tenemos que lograr firmar con HARBOUR + FWH

    Y no depender de terceros.

    Con la informaci贸n brindada estamos cerca.

    Vamos que se puede

    Saludos,



    Adhemar C.
    Posts: 56
    Joined: Mon Apr 11, 2011 06:22 PM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Fri Sep 20, 2024 07:42 AM
    Muchas gracias a todos por vuestras felicitaciones, me alegra que os haya gustado :)
    acuellar wrote:Muchas Gracias estimado Quimm por tan valiosa informaci贸n

    Tenemos que lograr firmar con HARBOUR + FWH

    Y no depender de terceros.

    Con la informaci贸n brindada estamos cerca.

    Vamos que se puede
    Como coment茅 en mi post, la firma electr贸nica sobretodo para los distintos tipos de facturaci贸n electr贸nica, es una tarea compleja y hay que dedicarse a ello, por lo que mi apuesta profesional ha sido con chilkat y en algunas ocasiones con autofirma, que me han facilitado mucho la vida

    Para I+D o por curiosidad y de paso aprender/refrescar lenguaje C, es un buen ejercicio intentar portar las API de Criptografia de Windows a harbour

    Para ello ir茅 aportando al repositorio p煤blico de github las funciones que he podido probar, s贸lo con 谩nimo de que sirvan de guia para quien quiera dedicarse de lleno a esto

    Vi que en mayo de 2023 publicaste en este foro una guia de los pasos a seguir para la firma digital, no s茅 si orientada a la factura electr贸nica
    https://forums.fivetechsupport.com/viewtopic.php?f=6&t=43236&p=260260&hilit=interpretaci%C3%B3n+de+pasos+a+seguir&sid=0d2911727e6cbd557750be269027b6b2#p260164

    Podr铆as comentar d贸nde te quedaste y las dificultades encontradas en cada paso ?

    Creo que podria ser una buena lista de 'retos' a seguir. Gracias !
    Posts: 318
    Joined: Fri Jan 14, 2022 08:37 AM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Fri Sep 20, 2024 10:28 AM
    Hola a todos,

    Gracias Quim por compartir tus conocimientos con esta comunidad que tanto los necesita.

    Mi experiencia:
    Yo utilizo desde siempre Autofirma. Va bien pero lentorro y con banner
    Ahora mismo no me puedo permitir 360 eypos en chilkat

    Diego Fazio, otro gran aportador, hizo una contribucion aqui https://groups.google.com/g/harbour-users/c/NhSPzh6s-ao/m/w8pFwjQQBgAJ que no he probado y que pareciera que para firmar por p12 o pfx seria buena

    Y por ultimo, me imagino que estas cosas las tienen solucionadas la gente de Python 驴 Que tan dificil seria hacerlo con Python a traves de un wrapper OLE ?

    Con mis mejores deseos para todos
    Posts: 817
    Joined: Sun Jun 15, 2008 07:47 PM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Fri Sep 20, 2024 12:45 PM

    Bueno.. no, lo siguiente!!!

    ______________________________________________________________________________

    Sevilla - Andaluc铆a
    Posts: 1710
    Joined: Tue Oct 28, 2008 06:26 PM
    Re: Firma electr贸nica con certificados (Webinar)
    Posted: Fri Sep 20, 2024 03:26 PM
    Estimado Quim

    Intent茅 de todas las formas y no logr茅 obtener lo esperado.

    Tuve que recurrir a terceros :|
    Saludos,



    Adhemar C.

    Continue the discussion