Cómo usar la utilidad de Microsoft llamada CAPICOM, que se puede utilizar para firmar datos y código digitalmente, comprobar firmas digitales, proteger la privacidad de datos, hacer hash de datos, cifrar y descifrar datos, obtener datos de los certificados digitales instalados, etc. En el artículo explicamos cómo usar el SDK de CAPICOM con Borland Delphi. Mostramos paso a paso cómo realizar una aplicación que encripte y desencripte datos y que obtenga los certificados digitales instalados mediante CAPICOM.
- Qué es CAPICOM, para qué sirve.
- Descarga e instalación de Microsoft CAPICOM SDK.
- Registro de la librería capicom.dll en Windows 7.
- Cómo usar CAPICOM en Delphi para obtener los certificados digitales instalados en un equipo.
- La aplicación AjpdSoft Obtener datos certificados digitales en funcionamiento.
- Anexo.
Qué es CAPICOM, para qué sirve
CAPICOM es un control ActiveX o una librería (según el caso) de Microsoft que proporciona una interfaz COM para Microsoft CryptoAPI (también llamada
Cryptographic Application Programming Interface, Microsoft Cryptography API, ó CAPI). CAPICOM permite usar un conjunto de funciones de CryptoAPI para permitir a los desarrolladores de aplicaciones incorporar de forma sencilla la funcionalidad de firma digital y encriptación en sus aplicaciones. Debido a que utiliza COM, los desarrolladores de aplicaciones pueden acceder a esta funcionalidad en una serie de entornos de programación tales como Microsoft Visual Basic, Visual Basic Script, Active Server Pages (ASP), Microsoft JScript, C + +, Delphi, Java, PHP y otros.
CAPICOM se puede empaquetar como un control ActiveX, para ser instalado en los navegadores y permitir a los desarrolladores Web utilizarla en aplicaciones basadas en Web (ASP, PHP, etc.). Además, CAPICOM cuenta con un SDK (kit de desarrollo de software o Software Development Kit) con las librerías necesarias para que sea usado por lenguajes de programación para desarrollar aplicaciones de escritorio (Delphi, Visual Basic .Net, Visual Basic, etc.).
De esta forma, con CAPICOM podremos implementar la utilidad de uso de certificados digitales en nuestras aplicaciones casi sin esfuerzo, pues todas las funciones necesarias para el acceso a estos certificados ya están implementadas y listas para ser usadas.
Descarga e instalación de Microsoft CAPICOM SDK
En primer lugar deberemos descargar e instalar el SDK de CAPICOM (Platform SDK Redistributable: CAPICOM), disponible gratuitamente en:
Instalaremos CAPICOM SDK ejecutando el fichero descargado capicom_dc_sdk.msi, se iniciará el asistente de instalación de CAPICOM 2.1.0.2 SDK, pulsaremos «Next»:
Leeremos los términos de licencia, si estamos de acuerdo marcaremos «I accept the terms in the License Agreement» y pulsaremos «Next»:
Indicaremos en «Location» la carpeta de destino de CAPICOM SDK (pulsando «Browse» podremos cambiarla), pulsaremos «Next» para continuar:
Pulsaremos «Install» para iniciar la instalación definitiva de CAPICOM SDK:
Una vez finalizada la instalación, pulsaremos «Finish»:
En realidad, la instalación de CAPICOM 2.1.0.2 SDK lo único que hace es descomprimir una carpeta en la carpeta de destino con los siguientes ficheros y subcarpetas:
La carpeta que más nos interesa es «Lib» que contiene la librería capicom.dll necesaria para el funcionamiento de nuestra aplicación. Esta librería deberá estar en la carpeta del sistema, en C:\Windows\System32 y correctamente registrada con regsvr32.exe o AjpdSoft Registro de OCX y DLL como explicamos aquí.
Registro de la librería capicom.dll en Windows 7
Una vez descargado e instalado el software CAPICOM SDK copiaremos el fichero capicom.dll ubicado en la carpeta de instalación de CAPICOM, en la subcarpeta «Lib\X86»:
Lo pegaremos en la carpeta del sistema (system32):
A continuación registraremos la librería capicom.dll o bien usando regsvr32.exe o bien utilizando AjpdSoft Registro de OCX y DLL. Abriremos la aplicación ejecutando el fichero registroOCX.exe en modo administrador, pulsando con el botón derecho sobre el fichero descargado y seleccionando «Ejecutar como administrador»:
Pulsaremos el botón «<<» para seleccionar el fichero capicom.dll:
En «Tipo» seleccionaremos «DLL (*.dll)», buscaremos el fichero «capicom.dll» en la carpeta System32 de Windows y pulsaremos «Abrir»:
Pulsaremos en «Registrar»:
Si todo es correcto mostrará un mensaje como este:
Con el texto:
El proceso de registro ha finalizado con el siguiente resultado:
Registrados: 1.
No registrados: 0
Nota: si tenemos activado el control de cuentas de usuario (UAC) de Windows 7, es posible que nos muestre algún mensaje de confirmación al que tendremos que responder «Sí».
Cómo usar CAPICOM en Delphi para obtener los certificados digitales instalados en un equipo
Para el acceso a los certificados digitales desde Delphi y CAPICOM necesitaremos la librería capicom.dll correctamente registrada y el fichero CAPICOM_TLB.pas que podremos descargar del ejemplo de este artículo:
Abriremos Delphi, crearemos un nuevo proyecto, añadiremos algunos componentes al formulario principal: un TLisbBox (donde mostraremos los certificados digitales instalados en el equipo y los datos de los mismos), algunos TButton para realizar las acciones de obtener certificados, obtener certificados y sus datos, guardar información de certificados y salir de la aplicación, etc.. El formulario quedará de la siguiente forma:
Añadiremos el siguiente código:
- Para el botón «Obtener certificados» (que sólo obtendrá el nombre del certificado):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
procedure TformCertificados.btObtenerCertificadosClick(Sender: TObject); const CAPICOM_CA_STORE = 'ca'; CAPICOM_MY_STORE = 'my'; CAPICOM_ADDRESS_BOOK_STORE = 'AddressBook'; CAPICOM_OTHER_STORE = 'other'; CAPICOM_ROOT_STORE = 'root'; var carpetaAlmacen : IStore; certificadosAlmacen : ICertificates; certificadoActual : ICertificate2; i, j: integer; begin lsCertificados.Clear; carpetaAlmacen := CoStore.Create; carpetaAlmacen.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED or CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED or CAPICOM_STORE_OPEN_EXISTING_ONLY); certificadosAlmacen := carpetaAlmacen.Certificates as ICertificates2; for i := 1 to certificadosAlmacen.Count do begin certificadoActual := IInterface(certificadosAlmacen.Item[i]) as ICertificate2; lsCertificados.Items.Add (obtenerNombreNIFCertificado( certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME))); end; end; |
- Para el botón «Obtener datos para exportación»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
procedure TformCertificados.btObtenerDatosCertificadosClick( Sender: TObject); const CAPICOM_CA_STORE = 'ca'; CAPICOM_MY_STORE = 'my'; CAPICOM_ADDRESS_BOOK_STORE = 'AddressBook'; CAPICOM_OTHER_STORE = 'other'; CAPICOM_ROOT_STORE = 'root'; var carpetaAlmacen : IStore; certificadosAlmacen : ICertificates; certificadoActual : ICertificate2; i, j: integer; begin lsCertificados.Clear; carpetaAlmacen := CoStore.Create; carpetaAlmacen.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED or CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED or CAPICOM_STORE_OPEN_EXISTING_ONLY); certificadosAlmacen := carpetaAlmacen.Certificates as ICertificates2; for i := 1 to certificadosAlmacen.Count do begin certificadoActual := IInterface(certificadosAlmacen.Item[i]) as ICertificate2; lsCertificados.Items.Add('--------------------------------------'); lsCertificados.Items.Add (obtenerNombreNIFCertificado( certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME))); lsCertificados.Items.Add('--------------------------------------'); lsCertificados.Items.Add (' NOMBRE: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME)); lsCertificados.Items.Add (' EMITIDO POR: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME)); lsCertificados.Items.Add (' EMAIL: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_EMAIL_NAME)); lsCertificados.Items.Add (' FECHA EMISIÓN: ' + <br> DateTimeToStr(certificadoActual.ValidFromDate)); lsCertificados.Items.Add (' FECHA EXPIRACIÓN: ' + <br> DateTimeToStr(certificadoActual.ValidToDate)); lsCertificados.Items.Add (' NÚMERO DE SERIE: ' + certificadoActual.SerialNumber); lsCertificados.Items.Add (' SHA1 HASH: ' + certificadoActual.Thumbprint); lsCertificados.Items.Add (' NOMBRE DNS: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_DNS_NAME)); lsCertificados.Items.Add (' NOMBRE UPN: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_UPN)); if certificadoActual.Archived then lsCertificados.Items.Add (' ARCHIVADO: SÍ') else lsCertificados.Items.Add (' ARCHIVADO: NO'); if certificadoActual.BasicConstraints.IsPresent then begin if certificadoActual.BasicConstraints.IsCritical then lsCertificados.Items.Add (' CRÍTICO: SÍ') else lsCertificados.Items.Add (' CRÍTICO: NO'); if certificadoActual.BasicConstraints.IsCertificateAuthority then lsCertificados.Items.Add (' AUTORIDAD DE CERTIFICACIÓN: SÍ') else lsCertificados.Items.Add (' AUTORIDAD DE CERTIFICACIÓN: NO'); if certificadoActual.BasicConstraints.IsPathLenConstraintPresent then lsCertificados.Items.Add ( inttostr(certificadoActual.BasicConstraints.PathLenConstraint)) else lsCertificados.Items.Add (' RESTRICCIÓN PATHLENCONSTRAINT NO PRESENTE'); end else lsCertificados.Items.Add (' RESTRICCIONES BÁSICAS NO PRESENTES'); if certificadoActual.KeyUsage.IsPresent then begin lsCertificados.Items.Add (' USO DE CLAVES:'); lsCertificados.Items.Add (' Critical = ' + SiNo (certificadoActual.KeyUsage.IsCritical)); lsCertificados.Items.Add (' IsDigitalSignatureEnabled = ' + SiNo (certificadoActual.KeyUsage.IsDigitalSignatureEnabled)); lsCertificados.Items.Add (' IsNonRepudiationEnabled = ' + SiNo (certificadoActual.KeyUsage.IsNonRepudiationEnabled)); lsCertificados.Items.Add (' IsKeyEnciphermentEnabled = ' + SiNo (certificadoActual.KeyUsage.IsKeyEnciphermentEnabled)); lsCertificados.Items.Add (' IsDataEnciphermentEnabled = ' + SiNo (certificadoActual.KeyUsage.IsDataEnciphermentEnabled)); lsCertificados.Items.Add (' IsKeyAgreementEnabled = ' + SiNo (certificadoActual.KeyUsage.IsKeyAgreementEnabled)); lsCertificados.Items.Add (' IsKeyCertSignEnabled = ' + SiNo (certificadoActual.KeyUsage.IsKeyCertSignEnabled)); lsCertificados.Items.Add (' IsCRLSignEnabled = ' + SiNo (certificadoActual.KeyUsage.IsCRLSignEnabled)); lsCertificados.Items.Add (' IsEncipherOnlyEnabled = ' + SiNo (certificadoActual.KeyUsage.IsEncipherOnlyEnabled)); lsCertificados.Items.Add (' IsDecipherOnlyEnabled = ' + SiNo (certificadoActual.KeyUsage.IsDecipherOnlyEnabled)); end else lsCertificados.Items.Add (' USO DE CLAVES: NO PRESENTE'); if certificadoActual.ExtendedKeyUsage.IsPresent then lsCertificados.Items.Add (' USO DE CLAVE EXTENDIDO: PRESENTE') else lsCertificados.Items.Add (' USO DE CLAVE EXTENDIDO: NO PRESENTE'); if certificadoActual.Template.IsPresent Then begin lsCertificados.Items.Add (' PLANTILLA:'); lsCertificados.Items.Add (' Critical = ' + BoolToStr (certificadoActual.Template.IsCritical)); lsCertificados.Items.Add (' Nombre = ' + certificadoActual.Template.Name); lsCertificados.Items.Add (' OID = ' + certificadoActual.Template.OID.FriendlyName + ' (' + certificadoActual.Template.OID.Value + ')'); lsCertificados.Items.Add (' Mayor = ' + IntToStr(certificadoActual.Template.MajorVersion)); lsCertificados.Items.Add (' Menor = ' + IntToStr(certificadoActual.Template.MinorVersion)); end else lsCertificados.Items.Add (' TEMPLATE: NO PRESENTE'); lsCertificados.Items.Add (' CLAVE PÚBLICA:'); lsCertificados.Items.Add (' Algoritmo = ' + certificadoActual.PublicKey.Algorithm.FriendlyName + ' (' + certificadoActual.PublicKey.Algorithm.Value + ')'); lsCertificados.Items.Add (' Tamaño = ' + IntToStr (certificadoActual.PublicKey.Length) + ' bits'); if certificadoActual.HasPrivateKey then begin lsCertificados.Items.Add (' CLAVE PRIVADA:'); lsCertificados.Items.Add (' Nombre del contenedor = ' + certificadoActual.PrivateKey.ContainerName); lsCertificados.Items.Add (' Nombre único = ' + certificadoActual.PrivateKey.UniqueContainerName); lsCertificados.Items.Add (' Nombre del proveedor = ' + certificadoActual.PrivateKey.ProviderName); lsCertificados.Items.Add (' Accessible = ' + SiNo (certificadoActual.PrivateKey.IsAccessible)); lsCertificados.Items.Add (' Protegida = ' + SiNo (certificadoActual.PrivateKey.IsProtected)); lsCertificados.Items.Add (' Exportable = ' + SiNo (certificadoActual.PrivateKey.IsExportable)); lsCertificados.Items.Add (' Eliminable = ' + SiNo (certificadoActual.PrivateKey.IsRemovable)); lsCertificados.Items.Add (' Keyset equipo = ' + SiNo (certificadoActual.PrivateKey.IsMachineKeyset)); lsCertificados.Items.Add (' Almacén Hardware = ' + SiNo (certificadoActual.PrivateKey.IsHardwareDevice)); end else lsCertificados.Items.Add (' CLAVE PRIVADA NO ENCONTRADA'); if i < certificadosAlmacen.Count then begin lsCertificados.Items.Add(''); lsCertificados.Items.Add(''); end; end; end; |
- Botón para guardar los datos en fichero de texto «Guardar en fichero»:
1 2 3 4 5 6 7 8 9 10 11 |
procedure TformCertificados.btGuardarDatosClick(Sender: TObject); begin dlGuardar.Title := 'Guardar datos de certificados digitales en fichero'; dlGuardar.Filter := 'Ficheros de texto (*.txt)|*.txt|Todos los ficheros (*.*)|*.*'; dlGuardar.FileName := 'certificados'; dlGuardar.DefaultExt := 'txt'; if dlGuardar.Execute then lsCertificados.Items.SaveToFile(dlGuardar.FileName); end; |
Aquí se puede ver todo el código fuente de la aplicación AjpdSoft Obtener datos certificados digitales.
La aplicación AjpdSoft Obtener datos certificados digitales en funcionamiento
Ejecutaremos el fichero obtenerCertificados.exe (no necesita instalación pero sí necesita la DLL capicom.dll en el sistema correctamente registrada como explicamos aquí). Para obtener los certificados instalados pulsaremos el botón «Obtener certificados»:
Nos mostrará el SUBJECT_SIMPLE_NAME de cada certificado instalado en el equipo:
Para obtener todos los datos de cada certificado digital instalado en el equipo pulsaremos el botón «Obtener datos para exportación»:
Obtendrá los siguientes datos de cada certificado digital instalado en el equipo:
- Nombre del certificado.
- Entidad emisora.
- Email del certificado.
- Fecha de emisión.
- Fecha de validez (caducidad o expiración).
- Número de serie.
- SHA 1 Hash.
- Nombre DNS.
- Nombre UPN.
- Archivado.
- Crítico.
- Autoridad de certificación.
- Restricción PathLenConstraint.
- Restricciones básicas.
- Uso de claves:
- IsDigitalSignatureEnabled.
- IsDigitalSignatureEnabled.
- IsNonRepudiationEnabled.
- IsNonRepudiationEnabled.
- IsKeyEnciphermentEnabled.
- IsKeyEnciphermentEnabled.
- IsDataEnciphermentEnabled.
- IsDataEnciphermentEnabled.
- IsKeyAgreementEnabled.
- IsKeyAgreementEnabled.
- IsKeyCertSignEnabled.
- IsKeyCertSignEnabled.
- IsCRLSignEnabled.
- IsCRLSignEnabled.
- IsEncipherOnlyEnabled.
- IsEncipherOnlyEnabled.
- IsDecipherOnlyEnabled.
- IsDecipherOnlyEnabled.
- Uso de claves extendido.
- Plantilla (Template):
- Critical.
- Nombre.
- Mayor.
- Menor.
- Clave pública:
- Algoritmo.
- Tamaño.
- Clave privada:
- Nombre del contenedor.
- Nombre único.
- Nombre del proveedor.
- Accessible.
- Protegida.
- Exportable.
- Eliminable.
- Keyset equipo.
- Almacén Hardware.
Si queremos guardar el resultado de los datos obtenidos de los certificados digitales pulsaremos «Guardar en fichero»:
Seleccionaremos la carpeta de destino y el nombre de fichero resultante con los datos de los certificados digitales instalados en el equipo, pulsaremos «Guardar»:
Anexo
Código fuente source code aplicación AjpdSoft Obtener datos certificados digitales
A continuación os mostramos el código fuente (source code) completo en Borland Delphi 6 de la aplicación AjpdSoft Obtener datos certificados digitales:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
unit UnidadMenuPrincipal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, shellapi, StrUtils, Buttons, ComCtrls, CAPICOM_TLB; type TformCertificados = class(TForm) lsCertificados: TListBox; LWEB: TLabel; Label1: TLabel; bSalir: TButton; btObtenerDatosCertificados: TBitBtn; btGuardarDatos: TBitBtn; dlGuardar: TSaveDialog; btObtenerCertificados: TBitBtn; StatusBar1: TStatusBar; procedure LWEBClick(Sender: TObject); procedure bSalirClick(Sender: TObject); procedure btObtenerDatosCertificadosClick(Sender: TObject); procedure btGuardarDatosClick(Sender: TObject); procedure btObtenerCertificadosClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var formCertificados: TformCertificados; implementation {$R *.dfm} function SiNo (valor : Boolean) : string; begin if valor then Result := 'Sí' else Result := 'No'; end; function obtenerNombreCertificado (nombre : string) : string; var nombreR : string; begin nombreR := AnsiReplaceStr(nombre, 'CN=NOMBRE', ''); nombreR := AnsiReplaceStr(nombre, 'NOMBRE', ''); nombreR := Trim (copy(nombreR, 1, pos(' - NIF', nombreR) - 1)); Result := nombreR; end; function obtenerNombreNIFCertificado (nombre : string) : string; var nombreR : string; begin nombreR := AnsiReplaceStr(nombre, 'CN=NOMBRE', ''); nombreR := AnsiReplaceStr(nombre, 'NOMBRE', ''); Result := nombreR; end; procedure TformCertificados.LWEBClick(Sender: TObject); begin ShellExecute(Handle, Nil, PChar('https://www.proyectoa.com'), Nil, Nil, SW_SHOWNORMAL); end; procedure TformCertificados.bSalirClick(Sender: TObject); begin close; end; procedure TformCertificados.btObtenerDatosCertificadosClick(Sender: TObject); const CAPICOM_CA_STORE = 'ca'; CAPICOM_MY_STORE = 'my'; CAPICOM_ADDRESS_BOOK_STORE = 'AddressBook'; CAPICOM_OTHER_STORE = 'other'; CAPICOM_ROOT_STORE = 'root'; var carpetaAlmacen : IStore; certificadosAlmacen : ICertificates; certificadoActual : ICertificate2; i, j: integer; begin lsCertificados.Clear; carpetaAlmacen := CoStore.Create; carpetaAlmacen.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED or CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED or CAPICOM_STORE_OPEN_EXISTING_ONLY); certificadosAlmacen := carpetaAlmacen.Certificates as ICertificates2; for i := 1 to certificadosAlmacen.Count do begin certificadoActual := IInterface(certificadosAlmacen.Item[i]) as ICertificate2; lsCertificados.Items.Add('--------------------------------------'); lsCertificados.Items.Add (obtenerNombreNIFCertificado( certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME))); lsCertificados.Items.Add('--------------------------------------'); lsCertificados.Items.Add (' NOMBRE: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME)); lsCertificados.Items.Add (' EMITIDO POR: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME)); lsCertificados.Items.Add (' EMAIL: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_EMAIL_NAME)); lsCertificados.Items.Add (' FECHA EMISIÓN: ' + DateTimeToStr(certificadoActual.ValidFromDate)); lsCertificados.Items.Add (' FECHA EXPIRACIÓN: ' + DateTimeToStr(certificadoActual.ValidToDate)); lsCertificados.Items.Add (' NÚMERO DE SERIE: ' + certificadoActual.SerialNumber); lsCertificados.Items.Add (' SHA1 HASH: ' + certificadoActual.Thumbprint); lsCertificados.Items.Add (' NOMBRE DNS: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_DNS_NAME)); lsCertificados.Items.Add (' NOMBRE UPN: ' + certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_UPN)); if certificadoActual.Archived then lsCertificados.Items.Add (' ARCHIVADO: SÍ') else lsCertificados.Items.Add (' ARCHIVADO: NO'); if certificadoActual.BasicConstraints.IsPresent then begin if certificadoActual.BasicConstraints.IsCritical then lsCertificados.Items.Add (' CRÍTICO: SÍ') else lsCertificados.Items.Add (' CRÍTICO: NO'); if certificadoActual.BasicConstraints.IsCertificateAuthority then lsCertificados.Items.Add (' AUTORIDAD DE CERTIFICACIÓN: SÍ') else lsCertificados.Items.Add (' AUTORIDAD DE CERTIFICACIÓN: NO'); if certificadoActual.BasicConstraints.IsPathLenConstraintPresent then lsCertificados.Items.Add ( inttostr(certificadoActual.BasicConstraints.PathLenConstraint)) else lsCertificados.Items.Add (' RESTRICCIÓN PATHLENCONSTRAINT NO PRESENTE'); end else lsCertificados.Items.Add (' RESTRICCIONES BÁSICAS NO PRESENTES'); if certificadoActual.KeyUsage.IsPresent then begin lsCertificados.Items.Add (' USO DE CLAVES:'); lsCertificados.Items.Add (' Critical = ' + SiNo (certificadoActual.KeyUsage.IsCritical)); lsCertificados.Items.Add (' IsDigitalSignatureEnabled = ' + SiNo (certificadoActual.KeyUsage.IsDigitalSignatureEnabled)); lsCertificados.Items.Add (' IsNonRepudiationEnabled = ' + SiNo (certificadoActual.KeyUsage.IsNonRepudiationEnabled)); lsCertificados.Items.Add (' IsKeyEnciphermentEnabled = ' + SiNo (certificadoActual.KeyUsage.IsKeyEnciphermentEnabled)); lsCertificados.Items.Add (' IsDataEnciphermentEnabled = ' + SiNo (certificadoActual.KeyUsage.IsDataEnciphermentEnabled)); lsCertificados.Items.Add (' IsKeyAgreementEnabled = ' + SiNo (certificadoActual.KeyUsage.IsKeyAgreementEnabled)); lsCertificados.Items.Add (' IsKeyCertSignEnabled = ' + SiNo (certificadoActual.KeyUsage.IsKeyCertSignEnabled)); lsCertificados.Items.Add (' IsCRLSignEnabled = ' + SiNo (certificadoActual.KeyUsage.IsCRLSignEnabled)); lsCertificados.Items.Add (' IsEncipherOnlyEnabled = ' + SiNo (certificadoActual.KeyUsage.IsEncipherOnlyEnabled)); lsCertificados.Items.Add (' IsDecipherOnlyEnabled = ' + SiNo (certificadoActual.KeyUsage.IsDecipherOnlyEnabled)); end else lsCertificados.Items.Add (' USO DE CLAVES: NO PRESENTE'); if certificadoActual.ExtendedKeyUsage.IsPresent then lsCertificados.Items.Add (' USO DE CLAVE EXTENDIDO: PRESENTE') else lsCertificados.Items.Add (' USO DE CLAVE EXTENDIDO: NO PRESENTE'); if certificadoActual.Template.IsPresent Then begin lsCertificados.Items.Add (' PLANTILLA:'); lsCertificados.Items.Add (' Critical = ' + BoolToStr (certificadoActual.Template.IsCritical)); lsCertificados.Items.Add (' Nombre = ' + certificadoActual.Template.Name); lsCertificados.Items.Add (' OID = ' + certificadoActual.Template.OID.FriendlyName + ' (' + certificadoActual.Template.OID.Value + ')'); lsCertificados.Items.Add (' Mayor = ' + IntToStr(certificadoActual.Template.MajorVersion)); lsCertificados.Items.Add (' Menor = ' + IntToStr(certificadoActual.Template.MinorVersion)); end else lsCertificados.Items.Add (' TEMPLATE: NO PRESENTE'); lsCertificados.Items.Add (' CLAVE PÚBLICA:'); lsCertificados.Items.Add (' Algoritmo = ' + certificadoActual.PublicKey.Algorithm.FriendlyName + ' (' + certificadoActual.PublicKey.Algorithm.Value + ')'); lsCertificados.Items.Add (' Tamaño = ' + IntToStr (certificadoActual.PublicKey.Length) + ' bits'); if certificadoActual.HasPrivateKey then begin lsCertificados.Items.Add (' CLAVE PRIVADA:'); lsCertificados.Items.Add (' Nombre del contenedor = ' + certificadoActual.PrivateKey.ContainerName); lsCertificados.Items.Add (' Nombre único = ' + certificadoActual.PrivateKey.UniqueContainerName); lsCertificados.Items.Add (' Nombre del proveedor = ' + certificadoActual.PrivateKey.ProviderName); lsCertificados.Items.Add (' Accessible = ' + SiNo (certificadoActual.PrivateKey.IsAccessible)); lsCertificados.Items.Add (' Protegida = ' + SiNo (certificadoActual.PrivateKey.IsProtected)); lsCertificados.Items.Add (' Exportable = ' + SiNo (certificadoActual.PrivateKey.IsExportable)); lsCertificados.Items.Add (' Eliminable = ' + SiNo (certificadoActual.PrivateKey.IsRemovable)); lsCertificados.Items.Add (' Keyset equipo = ' + SiNo (certificadoActual.PrivateKey.IsMachineKeyset)); lsCertificados.Items.Add (' Almacén Hardware = ' + SiNo (certificadoActual.PrivateKey.IsHardwareDevice)); end else lsCertificados.Items.Add (' CLAVE PRIVADA NO ENCONTRADA'); if i < certificadosAlmacen.Count then begin lsCertificados.Items.Add(''); lsCertificados.Items.Add(''); end; end; end; procedure TformCertificados.btGuardarDatosClick(Sender: TObject); begin dlGuardar.Title := 'Guardar datos de certificados digitales en fichero'; dlGuardar.Filter := 'Ficheros de texto (*.txt)|*.txt|Todos los ficheros (*.*)|*.*'; dlGuardar.FileName := 'certificados'; dlGuardar.DefaultExt := 'txt'; if dlGuardar.Execute then lsCertificados.Items.SaveToFile(dlGuardar.FileName); end; procedure TformCertificados.btObtenerCertificadosClick(Sender: TObject); const CAPICOM_CA_STORE = 'ca'; CAPICOM_MY_STORE = 'my'; CAPICOM_ADDRESS_BOOK_STORE = 'AddressBook'; CAPICOM_OTHER_STORE = 'other'; CAPICOM_ROOT_STORE = 'root'; var carpetaAlmacen : IStore; certificadosAlmacen : ICertificates; certificadoActual : ICertificate2; i, j: integer; begin lsCertificados.Clear; carpetaAlmacen := CoStore.Create; carpetaAlmacen.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED or CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED or CAPICOM_STORE_OPEN_EXISTING_ONLY); certificadosAlmacen := carpetaAlmacen.Certificates as ICertificates2; for i := 1 to certificadosAlmacen.Count do begin certificadoActual := IInterface(certificadosAlmacen.Item[i]) as ICertificate2; lsCertificados.Items.Add (obtenerNombreNIFCertificado( certificadoActual.GetInfo (CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME))); end; end; end. |
Algunos errores típicos y su solución
- Código de error: 0x80070005:
[Window Title]
RegSvr32
[Content]
Se cargó el módulo «C:\Windows\System32\capicom.dll», pero se produjo un error en la llamada a DllRegisterServer (código de error: 0x80070005).
Para obtener más información acerca de este problema, realice una búsqueda en Internet con el código de error como término de búsqueda.
[Aceptar]
Este error se suele producir en equipos con Windows Vista y Windows 7 (con UAC activado) o cuando el usuario actual no tiene permisos suficientes para escribir en el registro. Cuando intentamos registrar una DLL o un OCX, Windows debe escribir en el Registro de Configuraciones por lo que el usuario con el que intentamos realizar el registro debe tener permisos suficientes. En el caso de sistemas operativos con Windows Vista o Windows 7, si tenemos activo UAC (User Account Control) puede que nos impida escribir en el registro, por lo que tendremos que desactivarlo previamente, desde el botón «Iniciar», seleccionando «Ejecutar» (o bien pulsando la tecla de Windows + R), en la ventana de ejecutar escribiremos «msconfig» y pulsaremos «Aceptar»:
En la pestaña «Herramientas» de la ventana «Configuración del sistema» haremos doble clic sobre «Cambiar configuración de UAC»:
En la ventana de «Configuración de Control de cuentas de usuario» seleccionaremos «No notificarme nunca»:
No notificarme nunca cuando:
- Un programa intente instalar software o realizar cambios en el equipo.
- Realice cambios en la configuración de Windows.
Pulsaremos «Aceptar» (deberemos reiniciar el equipo para que los cambios se apliquen):
Nota importante: tras el registro del fichero capicom.dll (o de cualquier otro) es muy recomendable volver a activar UAC, de la misma forma que hemos explicado para desactivarlo.
- No se puede encontrar el módulo especificado: al ejecutar la aplicación AjpdSoft Obtener datos certificados digitales, al obtener los certificados digitales:
Este error es debido a que la librería capicom.dll no está en la carpeta del sistema o no está correctamente registrada. Para el caso de Microsoft Windows 7 de 64bits, el fichero capicom.dll debe estar en:
C:\Windows\SysWOW64
Para el caso de Microsoft Windows 7 de 32bits el fichero capicom.dll debe estar en:
C:\Windows\System32
Para obtener la librería capicom.dll se pueden seguir estos pasos y para registrarla se pueden seguir estos otros pasos.