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
Subformatos (perfiles) de XAdES (XML Advanced Electronic Signatures, Firma electr贸nica avanzada XML)
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) Por razones hist贸ricas (en la actualidad son lo mismo)
Sistemas criptogr谩ficos de clave p煤blica
Los anteriores certificados, suelen utilizar alguno de estos algoritmos :
Algunos tipos de Firma
Utilidades del sistema (tambi茅n desde cmd) para obtener informaci贸n de certificados instalados
Herramientas y utilidades de terceros
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)
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
Verificar la firma, informar de toda la ruta del fichero
ChilKat
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
bcrypt
ncrypt
cryptui
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
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
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)
- .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
聽 聽 rem Lista certificados instalados en el sistema, desde cmd o powershell
聽 聽 聽 聽 > certutil -user -store my
聽 聽 rem Acceso GUI almacen de certificados
聽 聽 聽 聽 > certmgr.exeHerramientas 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)
聽 聽 聽 聽 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 -filterEjemplo 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
聽 聽 聽 聽 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
聽 聽 聽 聽 autofirmaCommandLine.exe verify -i c:\path\test.xml.xsignChilKat
- 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
聽 聽 聽 聽 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
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
/**
聽* 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 ENDDUMPhttps://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
- Formatos de Firma
https://firmaelectronica.gob.es/Home/Ciudadanos/Formatos-Firma.html - Par谩metros de configuraci贸n de los formatos de firma
https://github-wiki-see.page/m/ctt-gob-es/clienteafirma/wiki/Par%C3%A1metros-de-configuraci%C3%B3n-de-los-formatos-de-firma - Qu茅 es un certificado x.509 y c贸mo funciona
https://www.ssldragon.com/es/blog/que-es-certificado-x-509/ - Qu茅 es una PKI
https://www.entrust.com/es/resources/learn/what-is-pki - Certificado X.509 Qu茅 es y para qu茅 se usa
https://protecciondatos-lopd.com/empresas/certificado-x509/ - Autofirma
https://sede.serviciosmin.gob.es/ES-ES/FIRMAELECTRONICA/Paginas/AutoFirma.aspx - ChilKat
https://www.example-code.com/foxpro/xades.asp - Microsoft signtool
https://learn.microsoft.com/es-es/windows/win32/seccrypto/signtool - EZSignIt
https://www.ssesetup.com/download.html - XolidoSign desktop
https://www.xolido.com/lang/xolidosign/modulo/xolidosign-desktop/descargar/ - XML Signer (XAdES)
https://www.signfiles.com/xml-signer/ - OpenSSL
https://www.openssl.org/ - Gu铆a de Facturaci贸n Electr贸nica en Per煤 SUNAT (una buena guia para seguir)
https://fe-primer.greenter.dev/docs/sign/ - Firmar XML 100% VFP sin DLL
https://groups.google.com/g/publicesvfoxpro/c/qU_hJZr87a0/m/-Nfjumq2DgAJ