A volte ritornano... CAPICOM - parte 1 - Overview

Ieri, essendo a letto con l'influenza, stavo girovagando qua e là per internet (esiste anche un altro termine molto più appropriato :-) che eviterebbe il giro di parole) ed alla fine mi sono ritrovato ad analizzare le keywords più utilizzate per arrivare sul mio blog...e una voce tra le prime 10 mi ha colpito particolarmente : CAPICOM.  Mi ha colpito per vari motivi primo fra tutti perchè nei soli ultimi due mesi è stata cercata quasi un centinaio di volte tramite il mio blog. In secondo luogo CAPICOM non è più "giovanissimo" ma pare riscuotere ancora parecchio fascino nonostante la quasi totalità delle sue funzioni siano oggi disponibili nel framework .NET. Infatti qui in Microsoft ogni tanto arrivano ancora richieste di "aiuto" e supporto all'uso di CAPICOM.
La prima volte che scrissi di CAPICOM 1 era nel lontano 2002 sul numero 111 e 112 della rivista Computer Programming (ancora bloccate dalla lettura se non abbonati). Alcune parti di quegli articoli nel tempo sono stati usati/ripresi in varie pubblicazioni di terzi ed è quindi con un po' di dispiacere che ho notato che in un solo caso l'intero contenuto di entrambi gli articoli (disegni e bibliografia compresi) sono stati usati pari pari senza nemmeno mettere me o Infomedia nella bibliografia. Dico questo perchè per la sola parte di overview riutilizzerò alcune parti scritte allora (ovviamente con vari aggiornamenti ed estensioni) e non vorrei essere additato come copista, se non copista di me stesso :-).

Cosa è CAPICOM

Lo sviluppo di applicazioni che integrano elementi di crittografia è stato per molto tempo dominio dei programmatori C++: la programmazione era complessa ed era richiesto un buon grado di conoscenza delle specifiche API del sistema operativo (CryptoAPI) e dei fondamenti di crittografia.  Con il rilascio del Microsoft Platform SDK di Febbraio 2001 è stato incluso un nuovo componente COM (CAPICOM.DLL, acronimo di CryptoAPI COM) per le funzioni base di crittografia estendendole quindi in modo “naturale” anche ai programmatori Visual Basic, Visual FoxPro,VB Script, Java Script, ASP e a qualsiasi altro linguaggio che supporti lo standard COM, .NET compreso.

Con .NET 1.0 e 1.1 il supporto alle operazioni di crittografia (soprattutta la firma) era piuttosto lacunoso in quanto non c'era un diretto supporto agli store dei certificati rendendo quindi difficile l'uso in programmi di commercio elettronico o similare.  La soluzione migliore era qualla di usare CAPICOM 2.0 per il supporto completo dello store anche se questo comportava delle trasformazioni per passarsi l'oggetto Certificate che in .NET e CAPICOM hanno strutture ben diverse. Fortunatamente con la versione 2.0 del framework non c'è più bisogno di ricorrere a questi escamotage.

CAPICOM permette di aggiungere un insieme di funzionalità base di crittografia a chiave simmetrica e asimmetrica senza entrare nel “variopinto” mondo delle CrytpoAPI tramite una serie di metodi e proprietà. Le principali funzioni del componente sono la firma elettronica, la verifica, l’encryption e il decryption, la gestione dei certificati e la gestione degli store dei certificati, l'uso di hash e di alcune funzioni di utilità varie. Più nel dettaglio CAPICOM supporta lo standard X.509, rendendo possibile l’utilizzo di certificati 

  • Rilasciati da una qualsiasi Certification Authority (CA) commerciale come Verisign e Thawte
  • Generati da una infrastruttura PKI di Windows.
  • Autogenerati con l’utility makecert.exe. (certificati di test)

CAPICOM 2.1.0.2è la versione ad oggi più recente ed è l'unica ad essere supportata in Windows Vista !!! Inoltre CAPICOM esiste solamente nella versione a 32-bits!!!

CAPICOM quindi è un "semplice" wrapper sulle CryptoAPI e come tale non è il veicolo di nessun nuovo algoritmo o classe di algoritmi. Infatti effettua le operazioni di crittografia supportate dal sistema operativo o da eventuali estensioni (non CAPICOM) ed inoltre non esporta tutte le funzionalità presenti nelle CrytoAPI ma, al contrario, imposta internamente una serie di valori di default (alcune volte modificabili programmaticamente) rendendo estremamente facile l’uso di funzionalità complesse quali la firma elettronica, l’ encryption di dati con chiave simmetrica e asimmetrica e la gestione di certificati.

Sebbene in molti esempi che si trovano in giro si faccia sempre riferimento a codice eseguito client-side, CAPICOM è stato sviluppato per girare anche in ambiente server side. Questa caratteristica permette di utilizzare CAPICOM anche all'interno di servizi o Web Services. 
In una tipica applicazione a più livelli l' oggetto CAPICOM viene creato all’interno di pagine ASP/ASP.NET  o gestiti da altri componenti. Indipendentemente da dove si trovi CAPICOM è importante evidenziare in alcuni casi comportamenti particolari: se un thread di IIS gestisce una richiesta di un utente riconosciuto dal sistema, questo thread impersonifica l’utente acquisendone le credenziali (a seconda anche della confiugrazione dell' application pool, del worker process e delle configurazioni del web.config). Viceversa, con accesso anonimo IIS impersonifica un utente predefinito chiamato IUSR_MACHINE_NAME dove MACHINE_NAME è il nome della macchina. Quindi IIS in entrambi i casi impersonifica un utente quando processa delle richieste. Questo aspetto diventa molto importante lavorando con gli store dei certificati poiché ogni utente ha il proprio store dei certificati registrato nell’hive privato (HKEY_CURRENT_USER) ed è quindi inaccessibile da codice che gira con credenziali diverse. Un problema analogo si presenta quando CAPICOM è registrato come applicazione COM+ server o library. Nel caso di COM+ server è possibile configurare l’ identity di un qualsiasi utente di sistema, mentre nel caso di COM+ library il codice gira con le credenziali del chiamante.In entrambi i casi, per le applicazioni a più livelli o comunque a servizi, si consiglia di utilizzare, quanto possibile, lo store di sistema che si trova in HKEY_LOCAL_MACHINE.

CAPICOM serve a...

Volendo schematizzare al massimo le funzionalità di CAPICOM possiamo dire :

  • Firma digitale con encoding ASN.1 e supporto allo standard PKCS#7 
  • Supporto a smart-card riconosciute da Windows
  • Encryption a chiave simmetrica
  • Encryption a chiave asimmetrica (envelop)
  • Calcolo di Hash
  • CodeSigning per Authenticode
  • Utilities per il supporto di conversioni di stringhe e generazioni di numeri pseudo-casuali.
  • Interfacce di supporto tra le CryptoAPI e gli oggetti CAPICOM e viceversa
  • Supporto ai certificati X509
  • Supporto agli store dei certificati.
  • Ricerche all'interno degli store
  • Supporto ai Certificate Policies, Application Policies e templates
  • Supporto per esportazione informazioni sensibili via PFX e PKCS#12
  • Supporto di AES per l'encryption (solo su XP e superiori)

e come vedremo nei prossimi post quello che colpisce maggiormente è la sua semplicitià di utilizzo.

Installazione e distribuzione di CAPICOM

L’installazione di CAPICOM può avvenire in varie modalità a seconda degli scenari. Il primo scenario, il più semplice (per i tecnici) e il più veloce è sicuramente quella manuale. Questa è l'opzione che spesso utilizzano gli sviluppatori sulle proprie macchine di sviluppo e di test ovvero la registrazione del un solo file capicom.dll tramite regsvr32.exe, oppure installando la DLL con il setup dell’applicazione.

Una seconda modalità in ambiente enterprise è tramite i processi di software distribution.

Una terza modalità riguarda gli scenari WEB based dove non abbiamo la possibilità di creare un processo di deployment controllato. In questo caso l'installazione è possibile tramite l’installazione del componente COM tramite il tag

<object classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679"  codebase = https://hostname/myApp/capicom.dll#version=2,1,0,2>

Per ragioni di sicurezza il file CAPICOM.DLL è stato firmato da Microsoft facilitando il download del componente anche quando la security di Internet Explorer è impostata a High.

La quarta modalità, infine, prevede la creazione di un file .INF e tramite le utility makecab.exe o cabarc.exe, si genera un file .CAB, lo si firma con signcode.exe(Le ultime versioni di queste utility sono disponibili nel Microsoft Platform SDK.) , e si effettua il download da una pagina HTML. Quando si preferisce installare l’ActiveX tramite il file .CAB è possibile utilizzare lo stesso CLSID di CAPICOM oppure generarne uno con l’utility guidgen.exe. Il vantaggio nell’utilizzo della terza modalità di installazione (file .CAB) è la minore dimensione del componente da scaricare.

Sistemi supportati

Versione 1.0

Windows 95/98/ME with Internet Explorer 5 or later
Windows NT® 4.0 with SP4+
Windows 2000
Windows XP/.Net Server

(se non per il supporto ad applicativi su W95 e NT4 non c'è ragione di usare la versione 1.0)

Versione 2.0

Windows 2000 Service Pack 4
Windows Server 2003 Service Pack 1
Windows Server 2003 Service Pack 2
Windows XP Service Pack 2
Windows Vista (nella sua ultima versione)

La seconda parte di questa serie di articoli sarà dedicata alla firma digitale con CAPICOM.

 --Mario