<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Security &amp; Architecture : WInternals</title><link>http://blogs.msdn.com/mariofontana/archive/tags/WInternals/default.aspx</link><description>Tags: WInternals</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Ci vediamo a ROMA??</title><link>http://blogs.msdn.com/mariofontana/archive/2009/02/06/ci-vediamo-a-roma.aspx</link><pubDate>Fri, 06 Feb 2009 20:41:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9402602</guid><dc:creator>mfontana</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9402602.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9402602</wfw:commentRss><description>&lt;p&gt;Il 16-17-18 Marzo a ROMA si tiene la prima edizione della &lt;a href="http://www.bastaitalia.it/conferenza/" target="_blank"&gt;conferenza BASTA! Italia&lt;/a&gt;. La più prestigiosa conferenza sullo sviluppo .NET tedesca sbarca in Italia !!&lt;/p&gt;  &lt;p&gt;Il 17 mattina terrò una sessione dal titolo : &lt;em&gt;Make your old applications SOA-aware with Web Services API. From Windows XP/2003 to Windows 7/2008 R2.&lt;/em&gt;dove parlerò della nuova architettura per i Web Services presenti nelle prossime versioni del sistema operativo Windows 7 e Windows Server 2008 R2. Sarà una sessione di livelllo 400 (Expert) per dare un po’ di internals e capire come queste API unmanged possono essere utilizzate in architetture SOA e in particolare con servizi WCF/Asmx . Per dare un po’ di background sull’argomento nei prossimi giorni pubblicherò una serie di link introduttivi. Farò comunque i primi 10 min della presentazione una overview di massima.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;L’abstract:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Con Windows 7 e Windows Server 2008 R2 il sistema operativo si arricchisce di nuove API native (WWSAPI – Windows Web Services API) che permettono di estendere le applicazioni unmanaged verso le architetture a servizi.Analizzeremo le ragioni di queste nuove API, l’architettura, le possibilità di interoperabilità con il mondo .NET e Java, e i principali standard WS-* di riferimento implementati.Tramite varie demo scorreremo i principali scenari di utilizzo evidenziandone i pro e i contro.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9402602" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Architetture+applicative/default.aspx">Architetture applicative</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Specifiche+di+Base/default.aspx">Specifiche di Base</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WInternals/default.aspx">WInternals</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Windows+Server/default.aspx">Windows Server</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/SOA/default.aspx">SOA</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Win7/default.aspx">Win7</category></item><item><title>Store dei certificati in Windows : tutto quello che un Architetto dovrebbe sapere</title><link>http://blogs.msdn.com/mariofontana/archive/2008/02/05/store-dei-certificati-in-windows-tutto-quello-che-un-architetto-dovrebbe-sapere.aspx</link><pubDate>Tue, 05 Feb 2008 13:50:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7462365</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/7462365.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=7462365</wfw:commentRss><description>&lt;p&gt;Cominciamo con i ricordi...&lt;br&gt;A partire da Windows NT 4 SP3 il sistema operativo è in grado di salvare i certificati X509 in una struttura persistente chiamata “Certificate store”. A quel tempo il supporto per la gestione dei certificati era molto limitata nelle performance, essendo un’operazione gestita in singled-Threaded, e nelle funzionalità, perchè era una semplice struttura dati salvata all’interno del registry e caricata in memoria per renderla disponibile all’applicazione. Una volta chiuso lo store i dati venivano riscritti nel registry.Inoltre, non era possibile creare dei filtri, delle viste e neppure utilizzare più store contemporaneamente. &lt;/p&gt; &lt;p&gt;A partire da Windows 2000 sono stati superati molti limiti presenti nelle versioni precedenti e sono state introdotte parecchie nuove funzionalità come gli store logici, la gerarchia e l’ereditarietà tra store, l’accesso remoto, il supporto per le notifiche e il multi-threaded . Il nome “store dei certificati” è rimasto nella documentazione di Microsoft anche per le versioni correnti dei sistemi operativi ma da Windows 2000 in poi tale nome è piuttosto riduttivo in quanto questi store sono dei veri e propri database specializzati per il salvataggio e la gestione di oggetti PKI come le CLR, le CTL (Certificate Trust List) oltre ovviamente ai certificati. All’interno della PKI di Microsoft le chiavi crittografiche e gli store dei certificati sono gestiti all’interno del sotto sistema di crittografia delle CryptoAPI&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/StoredeicertificatiinWindowstuttoquelloc_F742/figura8.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="322" alt="figura8" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/StoredeicertificatiinWindowstuttoquelloc_F742/figura8_thumb.jpg" width="429" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Figura 1 - Sistema di crittografia di Windows&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Gli oggetti PKI in questo sotto sistema sono rappresentati con il termine di &lt;strong&gt;contesto&lt;/strong&gt;. Un contesto è una struttura dati che contiene la forma cifrata dell’oggetto oltre ad una parte in chiaro. Gli store dei certificati non sono altro che una collezione di contesti e i certificati vengono passati all’interno del sistema tramite dei puntatori ai contesti.  &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/StoredeicertificatiinWindowstuttoquelloc_F742/image_4.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="360" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/StoredeicertificatiinWindowstuttoquelloc_F742/image_thumb_1.png" width="438" border="0"&gt;&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;Figura 2- Struttura degli store&lt;/strong&gt;  &lt;p&gt;Questo sotto sistema di crittografia è alla base di quasi tutte le operazioni di sicurezza del sistema operativo ed è messa a disposizione degli sviluppatori tramite un insieme di API, oggetti COM e codice .NET  &lt;p&gt;Windows identifica gli store di default con un nome, come ad esempio &lt;i&gt;Personal&lt;/i&gt;, &lt;i&gt;Other people&lt;/i&gt;, &lt;i&gt;Intermediate Certification Authorities&lt;/i&gt;, &lt;i&gt;Trusted Roots e Untrusted Certificates.&lt;/i&gt;  &lt;p&gt;Nella figura sottostante sono riportati gli store di default per un utente in Windows Server.  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/StoredeicertificatiinWindowstuttoquelloc_F742/Figura10.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="328" alt="Figura10" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/StoredeicertificatiinWindowstuttoquelloc_F742/Figura10_thumb.jpg" width="436" border="0"&gt;&lt;/a&gt;  &lt;p&gt;&lt;strong&gt;Figura 3- Viste sugli store dei certificati&lt;/strong&gt;  &lt;p&gt;Lo store &lt;i&gt;&lt;strong&gt;Personal&lt;/strong&gt;&lt;/i&gt;,chiamato anche &lt;i&gt;&lt;strong&gt;MY&lt;/strong&gt;&lt;/i&gt;, include tutti i certificati dell’utente, ovvero tutti quei certificati che hanno la chiave privata associata, mentre in &lt;i&gt;&lt;strong&gt;Other people&lt;/strong&gt;&lt;/i&gt;, chiamato anche &lt;i&gt;&lt;strong&gt;Address Book&lt;/strong&gt;&lt;/i&gt;, sono presenti i certificati delle persone con le quali scambiamo messaggi in modalità &lt;i&gt;Envelop&lt;/i&gt;. Anche Outlook utilizza questo store per inserire i certificati delle persone con le quali si ha uno scambio di email cifrate (da qui il nome &lt;i&gt;Address Book&lt;/i&gt;).  &lt;p&gt;&lt;strong&gt;&lt;i&gt;Intermediate Certification Authorities&lt;/i&gt; &lt;/strong&gt;è lo store delle C.A. intermediarie, ovvero quelle che hanno i certificati di tipo C.A. ma non sono root C.A&lt;i&gt;.&lt;/i&gt; mentre &lt;strong&gt;&lt;i&gt;Trusted Roots&lt;/i&gt; &lt;/strong&gt;include tutte le root C.A. che il sistema operativo deve considerare attendibili. Infine &lt;strong&gt;&lt;i&gt;Untrusted Certificates&lt;/i&gt; &lt;/strong&gt;è lo store di quei certificati che devono essere esplicitamente considerati non validi, una funzionalità molto simile a quella della CLR. Il sistema di crittografia di Windows crea delle viste sugli store per la macchina e per ogni profilo utente permettendo di accedere a oggetti PKI privati - i certificati nel &lt;i&gt;Personal&lt;/i&gt; store, le chiavi private e &lt;i&gt;Other People &lt;/i&gt;- e condivisi a tutte le viste come ad esempio &lt;i&gt;&lt;strong&gt;Intermediate Certification Authorities &lt;/strong&gt;&lt;/i&gt;e &lt;i&gt;&lt;strong&gt;Trusted Roots&lt;/strong&gt;.&lt;/i&gt;  &lt;p&gt;Nello store &lt;i&gt;Personal&lt;/i&gt;, a differenza di tutti gli altri store, la struttura dati dei certificati può includere delle proprietà che indicano il &lt;i&gt;CSP&lt;/i&gt; (Cryptographic Service Provider) e il nome del &lt;i&gt;Key-set&lt;/i&gt; (database delle chiavi private) contenente la corrispettiva chiave privata da utilizzare. Infatti la chiave privata non è ovviamente presente nel certificato e deve essere utilizzata solamente dal proprietario del certificato. Quando un’applicazione ha selezionato il certificato dallo store, il sotto sistema di crittografia utilizza queste informazioni per aprire un contesto con un &lt;i&gt;CSP&lt;/i&gt; e tramite esso utilizzare la chiave privata corretta (vedi &lt;strong&gt;figura 2&lt;/strong&gt;) E' compito del sistema di crittografia gestire la sicurezza e la cifratura di tali chiavi.  &lt;p&gt;Quando si vuol far scegliere all'utente il certificato il modo più corretto è quello che ho descritto nel &lt;a href="http://blogs.msdn.com/mariofontana/archive/2008/02/01/tutto-quello-che-un-architetto-deve-sapere-sui-certificati-digitali-e-windows.aspx" target="_blank"&gt;post precedente&lt;/a&gt;. Di solito il client (l'utente) utilizza una finestra per la scelta del certificato la quale è popolata da tutti i certificati presenti nello store &lt;i&gt;Personal&lt;/i&gt; che hanno associato un link a un CSP (ovvero hanno una chiave privata accessibile dall’utente).  &lt;p&gt;Infine, solo tramite codice unmanaged, è possibile crearsi dei propri store di certificati per registrarvi non solo certificati ma CTL, CRL ecc... Sebbene questa tecnica sia possibile è da valutare con cura la reale necessità. Una volta creato il proprio store è possibile linkarlo dinamicamente agli store logici per l'utente o per la macchina permettendo all'intero sistema delle CrypoAPI di effettuare le normali operazioni di ricerca, visualizzazione, ecc...&lt;pre&gt;BOOL WINAPI &lt;strong&gt;CertAddStoreToCollection&lt;/strong&gt;(
  __in      HCERTSTORE &lt;i&gt;hCollectionStore&lt;/i&gt;,
  __in_opt  HCERTSTORE &lt;i&gt;hSiblingStore&lt;/i&gt;,
  __in      DWORD &lt;i&gt;dwUpdateFlag&lt;/i&gt;,
  __in      DWORD &lt;i&gt;dwPriority&lt;/i&gt;
);
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp; &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7462365" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Crittografia/default.aspx">Crittografia</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WInternals/default.aspx">WInternals</category></item><item><title>Certificati digitali in Windows : tutto quello che un Architetto dovrebbe sapere</title><link>http://blogs.msdn.com/mariofontana/archive/2008/02/01/tutto-quello-che-un-architetto-deve-sapere-sui-certificati-digitali-e-windows.aspx</link><pubDate>Fri, 01 Feb 2008 15:17:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7373513</guid><dc:creator>mfontana</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/7373513.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=7373513</wfw:commentRss><description>&lt;H2&gt;Certificati Digitali&lt;/H2&gt;
&lt;P&gt;I Certificati sono firmati digitalmente dalla &lt;STRONG&gt;Certification Authority (CA)&lt;/STRONG&gt; che li ha rilasciati e sono composti da una struttura dati estendibile di campi obbligatori e opzionali. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura2.jpg" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=314 alt=Figura2 src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura2_thumb.jpg" width=493 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura2_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;La struttura dei certificati digitali a chiave pubblica comunemente utilizzata è quella definita dallo &lt;STRONG&gt;standard X.509 &lt;/STRONG&gt;specificato da &lt;STRONG&gt;ITU-T &lt;/STRONG&gt;(&lt;EM&gt;International Telecommunications Union-Telecommunication&lt;/EM&gt;) e &lt;STRONG&gt;ISO &lt;/STRONG&gt;(&lt;EM&gt;International Organization for Standardization’s&lt;/EM&gt;). 
&lt;P&gt;Lo scopo dei certificati, come suggerisce il nome, è di certificare l’identità di una persona, di un servizio o di una macchina all’interno di un arco temporale finito (identificato dai campi : &lt;I&gt;Valid to&lt;/I&gt; e &lt;I&gt;Valid From&lt;/I&gt;) associando la chiave pubblica (anch’essa presente nel certificato) e le informazioni descrittive del richiedente con la chiave privata che deve essere accessibile solamente all’entità a cui è stato rilasciato il certificato. In questo contesto mi preme sottolineare uno dei misunderstanding più comuni : &lt;STRONG&gt;la chiave privata NON risiede nel certificato!!! &lt;/STRONG&gt;piuttosto è presente in uno store (Key Store) presente o sul sistema o all'interno di device esterne come ad esempio le smart-card. 
&lt;P&gt;Esistono due tipi di certificati: certificati &lt;STRONG&gt;CA &lt;/STRONG&gt;e certificati &lt;STRONG&gt;end-entity&lt;/STRONG&gt;. I certificati CA vengono rilasciati da una CA padre ad una CA figlia che può avere ruoli diversi all’interno di una struttura gerarchica PKI (Public Key Infrastructure) con l’unica eccezione dei certificati di una &lt;I&gt;Root CA&lt;/I&gt; che sono firmati dalla stessa &lt;I&gt;Root CA,&lt;/I&gt; mentre i certificati end-entity vengono rilasciati esclusivamente a entità che a loro volta non generano altri certificati. 
&lt;P&gt;In Windows quando una Certification Authority crea un certificato end-entity viene ritornato al client un pacchetto in formato PKCS#7 contenente il nuovo certificato rilasciato e la lista di tutti i certificati delle CA intermedie fino ad arrivare alla &lt;I&gt;Root Ca&lt;/I&gt;. Questa lista si chiama &lt;I&gt;Certification Path&lt;/I&gt;. Nella figura seguente la &lt;I&gt;Certification Path &lt;/I&gt;contiene una &lt;I&gt;Root CA&lt;/I&gt; di nome &lt;I&gt;NemesisCA&lt;/I&gt; e il certificato end-entity senza nessuna CA intermediaria. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura3.jpg" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura3.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=378 alt=Figura3 src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura3_thumb.jpg" width=502 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura3_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;All’interno dei certificati sono presenti una serie di estensioni tra cui &lt;I&gt;KeyUsage&lt;/I&gt;. Questo campo, che può essere marcato come critico, indica come la chiave pubblica presente nel certificato debba essere utilizzata (e di conseguenza anche la chiave privata). In questo contesto prendiamo in considerazione solamente i valori &lt;I&gt;Digital Signature&lt;/I&gt;, &lt;I&gt;Non-Repudiation&lt;/I&gt;, &lt;I&gt;Key Encipherment&lt;/I&gt; e &lt;I&gt;Data Encipherment&lt;/I&gt; perchè sono quelli utilizzati maggiormente nelle nostre applicazioni. &lt;BR&gt;&lt;I&gt;Digital Signature&lt;/I&gt; implica che le chiavi asimmetriche possono essere utilizzate per le operazioni di firma digitale mentre &lt;I&gt;Non-Repudiation&lt;/I&gt; restringe il campo di utilizzo della chiave ai servizi di non-repudiabilità. L’estensione &lt;I&gt;Key Encipherment&lt;/I&gt; indica che la chiave pubblica può essere utilizzata per cifrare altre chiavi, come nella tecnica dell’Envelop descritta nella prima parte di questo articolo, mentre &lt;I&gt;Data Encipherment&lt;/I&gt; rappresenta la stessa funzionalità con l’eccezione che le informazioni da cifrare non sono altre chiavi crittografiche ma i dati dell’applicazione. 
&lt;P&gt;Quindi i certificati completi di tutti questi flag indicano che le chiavi asimmetriche possono essere utilizzate per la firma elettronica, per lo scambio di chiavi simmetriche (cifrate) e per la cifratura diretta di dati. Ad esempio si considerino 3 utenti : &lt;STRONG&gt;Luca&lt;/STRONG&gt;, &lt;STRONG&gt;Antonella &lt;/STRONG&gt;e &lt;STRONG&gt;Carlo &lt;/STRONG&gt;(La versione italiana di Alice e Bob). Per i primi due il campo &lt;I&gt;KeyUsage&lt;/I&gt; contiene tutti e quattro i flag mentre per l’utente Carlo sono previsti solo i primi due flag. Il certificato di Antonella ,in aggiunta, è stato inserito nello store &lt;I&gt;Other People&lt;/I&gt; del server. In questa situazione alcune applicazioni che si basano sulla presenza dei certificati negli store di Windows non permetteranno a Carlo di ricevere i dati sensibili dall'applicazione o dai servizi perchè il certificato che lo rappresenta indica che la sua chiave pubblica non può essere utilizzata per cifrare le informazioni e quindi non gli viene data la possibilità di accedere al servizio. Per l’utente Luca il server lo autentica ma non trovando il suo certificato tra quelli presenti nello store &lt;I&gt;Other People&lt;/I&gt; non può autorizzarlo e quindi gli ritorna un messaggio SOAP di accesso negato. L’utente Antonella è in grado di essere autenticata e autorizzata a ricevere i dati sensibili dell’applicazione.&lt;/P&gt;
&lt;H3&gt;Giocare con i certificati&lt;/H3&gt;
&lt;P&gt;Per effettuare delle prove con i certificati è possibile installare una CA di prova oppure utilizzare l’utility a riga di comando &lt;I&gt;makecert&lt;/I&gt;. &lt;BR&gt;Se si utilizza una CA Windows, dopo l’installazione di una &lt;I&gt;Stand-alone root CA&lt;/I&gt; si può richiedere un certificato accedendo al servizio di RA (Registration Authority – ovvero la parte di acquisizione dati di una Certification Authority) tramite Internet Explorer digitando l’URL &lt;A href="http://localhost/certsrv" mce_href="http://localhost/certsrv"&gt;&lt;B&gt;http://localhost/certsrv&lt;/B&gt;&lt;/A&gt; (se è sulla stessa macchina). La home page di default permette di richiedere manualmente un certificato tramite le scelte : &lt;I&gt;Request a certificate,&lt;/I&gt; &lt;I&gt;Advanced certificate request&lt;/I&gt; e &lt;I&gt;Create and submit a request to this CA&lt;/I&gt;. &lt;BR&gt;Arrivati qui: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura4a_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura4a_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=335 alt=Figura4a src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura4a_thumb.jpg" width=445 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura4a_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;l’utente deve inserire i propri dati o quelli del servizio oltre ad alcune impostazioni di crittografia (per una analisi completa delle opzioni fare riferimento alla documentazione del prodotto). In questo caso l’opzione &lt;I&gt;Both&lt;/I&gt; indica che la chiave sarà abilitata per la firma digitale e per l’encryption impostando i quattro flag sopra descritti nel campo &lt;I&gt;KeyUsage&lt;/I&gt; del certificato che verrà emesso. Il flag &lt;I&gt;Enable strong private key protection&lt;/I&gt; richiede una password per l’accesso alla chiave privata. &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura5.jpg" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura5.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=336 alt=Figura5 src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura5_thumb.jpg" width=446 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/Figura5_thumb.jpg"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Questa opzione permette di aumentare il livello di sicurezza del nostro client non permettendo, idealmente, a utenti diversi di utilizzare i certificati di altre persone. Per una applicazione reale è necessario adottare altre soluzioni come le smart-card.&lt;/P&gt;
&lt;P&gt;Dopo aver premuto il pulsante &lt;I&gt;Submit&lt;/I&gt; e risposto &lt;I&gt;Yes&lt;/I&gt; all’avvertimento di sicurezza si ottiene una pagina che informa il richiedente che la sua richiesta è stata innoltrata al server e di ripassare tra due o tre giorni. Ovviamente non c’è bisogno di aspettare così tanto tempo (questo è un messaggio standard e personalizzabile!). 
&lt;P&gt;Attivando lo snap-in della Certification Authority presente negli strumenti di amministrazione del vostro server si può procedere al rifiuto della richiesta oppure alla creazione e al rilascio del certificato. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/figura6.jpg" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/figura6.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=138 alt=figura6 src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/figura6_thumb.jpg" width=456 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/figura6_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;Una volta creato il certificato sul server l’utente potrà installare il certificato sulla propria macchina accedendo alla home page della CA selezionando la voce &lt;I&gt;View status of a pending certificate request&lt;/I&gt; dove comparirà un link al certificato appena emesso. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/figura7.jpg" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/figura7.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=131 alt=figura7 src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/figura7_thumb.jpg" width=458 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/figura7_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;Una volta installato il certificato è possibile verificare che sia correttamente presente nello store di Windows aprendo Internet Explorer. Dal menù &lt;I&gt;Internet Options &lt;/I&gt;si selezioni il tab &lt;I&gt;Content&lt;/I&gt; e premendo il pulsante &lt;I&gt;Certificates&lt;/I&gt; compare una lista dei certificati installati sulla macchina. Se l’operazione di richiesta e installazione è andata a buon fine il certificato sarà presente nel primo tab chiamato &lt;I&gt;Personal. &lt;/I&gt;
&lt;P&gt;Come regola generale, questo tab contiene tutti quei certificati la cui chiave privata associata è presente ed accessibile (store di Windows o Smard Card). Un altro metodo per effettuare la verifica consiste nell’ aprire una Management Console (mmc.exe) e aggiungere lo snap-ins dei certificati. In questo caso la vista è leggermente diversa e verrà analizzata più in dettaglio parlando dello store dei certificati. 
&lt;P&gt;La verifica di un certificato avviene tramite i seguenti passi : acquisizione del certificato della CA che lo ha emesso, decifratura dell’hash del certificato da verificare utilizzando la chiave pubblica presente nel certificato della CA, ricalcolo dell’hash del certificato, confronto tra i due hash ottenuti ed infine verifica delle informazioni temporali. Questa verifica può essere estesa a tutta la certification path comprendente le eventuali CA intermediarie e la Root. All’interno del periodo di validità il certificato può essere revocato a causa di innumerevoli ragioni come la perdita della chiave privata (smart-card) oppure un cambio di ruolo rendendo necessario un meccanismo di pubblicazione di tutti i certificati revocati. Ogni CA periodicamente pubblica una lista firmata dei certificati revocati (CLR - Certificate Revocation Lists) rendendola accessibile tramite una o più meccanismi (url, file,ldap...). In questo caso l’applicazione di controllo può aggiungere la verifica dell’estensione CLR presente nel certificato verificando che il numero di serie non sia presente nella CLR pubblica. In realtà esistono anche altri meccanismi di verifica delle revoche di cui ne parleremo in futuro. 
&lt;P&gt;Infine le operazioni di richiesta di un certificato e di installazione nello store di Windows possono essere effettuati via codice tramite l’uso di due oggetti COM (XENROLL.DLL e CAPICOM.DLL). XENROLL.DLL permette di eseguire una richiesta di un certificato digitale in formato PKCS#10. La CA risponde con un pacchetto in formato PKCS#7 il quale può essere interpretato tramite CAPICOM.DLL che a sua volta estrae il certificato e lo installa nello store di Windows. 
&lt;H3&gt;I Certificati e .NET &lt;/H3&gt;
&lt;P&gt;Le classi per manipolare i certificati digitali X509 sono presenti fin dalla versione 1.0 del framework ma è solo con la versione 2.0 che abbiamo il pieno accesso (soprattutto per gli store). Stiamo parlando del namespace &lt;STRONG&gt;System.Security.Cryptography.X509Certificates&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;La classe principale è &lt;STRONG&gt;X509Certificate &lt;/STRONG&gt;presesente fin dalla prima versione del framework che nella versione 2.0 del framework è stata estesa da &lt;STRONG&gt;X509Certificate2.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Una funzionalità molto richiesta è la visualizzazione dei certificati digitali come &lt;EM&gt;Internet Explorer o di Windows &lt;/EM&gt;più in generale (sia a mo di lista che la visualizzazione dei dettagli di un certificato)&lt;EM&gt;. &lt;/EM&gt;A questo scopo non è necessario crearsi la finestrella e popolarla di certificati "a mano" ma semplicemente basta ricorrere alla classe &lt;STRONG&gt;X509Certificate2UI &lt;/STRONG&gt;che permette di selezionare uno o più certificati dalla lista e visualizzare il contentuo proprio come Windows.&lt;BR&gt;La classe X509Certifacte2UI ha 4 metodi utili a questo scopo : &lt;BR&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DisplayCertificate (X509Certifcate2);&lt;BR&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DisplayCertificate (X509Certifcate2,IntPtr);&lt;BR&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;SelectFromCollection(X509Certifcate2Collection,string,string,X509SelectionFlag);&lt;BR&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;SelectFromCollection(X509Certifcate2Collection,string,string,X509SelectionFlag,IntPtr);&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;I primi due metodi visualizzano il certificato mentre gli ultimi due permettono di visualizzare la lista dei certificati a seconda dello store aperto.&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;X509Certificate2Collection&lt;/SPAN&gt; scollection = &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;X509Certificate2UI&lt;/SPAN&gt;.SelectFromCollection(fcollection, &lt;BR&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"Seleziona un certificato"&lt;/SPAN&gt;, &lt;BR&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"Seleziona un certificato dalla lista"&lt;/SPAN&gt;, &lt;BR&gt;&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;X509SelectionFlag&lt;/SPAN&gt;.MultiSelection);&lt;/P&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_2.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=239 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_thumb.png" width=473 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Premendo su View Certificate si ottiene la classica vista del certificato di Windows. Lo stesso risultato lo si può ottenere anche richiamando direttamente il metodo &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DisplayCertificate &lt;/SPAN&gt;(...)&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_4.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=359 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_thumb_1.png" width=467 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Il dietro le quinte di questi metodi è molto semplice. Come vedete sia .NET che CAPICOM utilizzano la stessa Win32 Crypto API per la visualizzazione dei certificati permettendo di avere la stessa "user experience" nelle applicazioni e nel sistema.&lt;/P&gt;PCCERT_CONTEXT WINAPI &lt;STRONG&gt;CryptUIDlgSelectCertificateW&lt;/STRONG&gt;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IN PCCRYPTUI_SELECTCERTIFICATE_STRUCTW pcsc);&lt;BR&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_8.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=354 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_thumb_3.png" width=461 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/TuttoquellocheunArchitettodevesaperesuiC_B2E7/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;H6&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&amp;nbsp;&lt;/H6&gt;
&lt;P&gt;La stessa cosa vale per:&lt;/P&gt;
&lt;P&gt;BOOL WINAPI &lt;STRONG&gt;CryptUIDlgViewCertificate&lt;/STRONG&gt;(&lt;BR&gt;__in PCCRYPTUI_VIEWCERTIFICATE_STRUCTW &lt;I&gt;pCertViewInfo&lt;/I&gt;, &lt;BR&gt;__out BOOL* &lt;I&gt;pfPropertiesChanged&lt;/I&gt; );&lt;/P&gt;
&lt;P&gt;dove &lt;STRONG&gt;&lt;EM&gt;pCertViewInfo &lt;/EM&gt;&lt;/STRONG&gt;è rappresentato da&lt;EM&gt;:&lt;/EM&gt;&lt;/P&gt;&lt;PRE&gt;typedef struct tagCRYPTUI_VIEWCERTIFICATE_STRUCT {&lt;BR&gt;  DWORD dwSize;&lt;BR&gt;  HWND hwndParent;&lt;BR&gt;  DWORD dwFlags;&lt;BR&gt;  LPCTSTR szTitle;&lt;BR&gt;  PCCERT_CONTEXT pCertContext;&lt;BR&gt;  LPCSTR* rgszPurposes;&lt;BR&gt;  DWORD cPurposes;&lt;BR&gt;  union {&lt;BR&gt;    CRYPT_PROVIDER_DATA* pCryptProviderData;&lt;BR&gt;    HANDLE hWVTStateData;&lt;BR&gt;  };&lt;BR&gt;  BOOL fpCryptProviderDataTrustedUsage;&lt;BR&gt;  DWORD idxSigner;&lt;BR&gt;  DWORD idxCert;&lt;BR&gt;  BOOL fCounterSigner;&lt;BR&gt;  DWORD idxCounterSigner;&lt;BR&gt;  DWORD cStores;&lt;BR&gt;  HCERTSTORE* rghStores;&lt;BR&gt;  DWORD cPropSheetPages;&lt;BR&gt;  LPCPROPSHEETPAGE rgPropSheetPages;&lt;BR&gt;  DWORD nStartPage;
} CRYPTUI_VIEWCERTIFICATE_STRUCT, &lt;BR&gt; *PCRYPTUI_VIEWCERTIFICATE_STRUCT;
typedef const CRYPTUI_VIEWCERTIFICATE_STRUCT *PCCRYPTUI_VIEWCERTIFICATE_STRUCT;&lt;/PRE&gt;
&lt;H6&gt;&amp;nbsp;&lt;/H6&gt;
&lt;P&gt;Per l'uso dei certificati via CAPICOM fare riferimento ai post su CAPICOM.&lt;/P&gt;
&lt;P&gt;&lt;A class="" href="http://blogs.msdn.com/mariofontana/archive/2008/02/05/store-dei-certificati-in-windows-tutto-quello-che-un-architetto-dovrebbe-sapere.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2008/02/05/store-dei-certificati-in-windows-tutto-quello-che-un-architetto-dovrebbe-sapere.aspx"&gt;Nel prossimo post dedicato ai certificati&lt;/A&gt; approfondirò il tema degli &lt;STRONG&gt;store &lt;/STRONG&gt;dei certificati in Windows.&lt;/P&gt;
&lt;P&gt;--Mario &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7373513" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Crittografia/default.aspx">Crittografia</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WInternals/default.aspx">WInternals</category></item><item><title>A volte ritornano... CAPICOM - parte 2 - Firma Digitale</title><link>http://blogs.msdn.com/mariofontana/archive/2008/01/31/a-volte-ritornano-capicom-seconda-parte.aspx</link><pubDate>Thu, 31 Jan 2008 22:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7356538</guid><dc:creator>mfontana</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/7356538.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=7356538</wfw:commentRss><description>&lt;P&gt;Partendo dall'overview della &lt;A class="" href="http://blogs.msdn.com/mariofontana/archive/2008/01/31/A-volte-ritornano_2E002E002E00_-CAPICOM-_2800_parte-1_2900_.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2008/01/31/A-volte-ritornano_2E002E002E00_-CAPICOM-_2800_parte-1_2900_.aspx"&gt;prima parte&lt;/A&gt;, in questa seconda parte affrontiamo il tema dell'architettura di riferimento per CAPICOM e le operazioni di firma! 
&lt;H4&gt;Architettura su cui si basa CAPICOM&lt;/H4&gt;
&lt;P&gt;CAPICOM lavora con il paradigma dell’ architettura del sistema di crittografia di Windows XP/2003 il quale comprende tre elementi fondamentali : l’ applicazione, il sistema operativo e i Cryptographic Service Provider (CSP). Le applicazioni comunicano con il sistema operativo tramite le CryptoAPI e il sistema operativo a sua volta comunica con i CSP tramite i Cryptographic Service Provider Interface (CSPI). I CSP sono dei moduli indipendenti che eseguono tutte le operazioni di crittografia, come la generazione di chiavi di sessione (chiavi simmetriche), chiavi asimmetriche (pubblica/privata) e operazioni di firma. Alcuni CSP implementano le loro funzioni via software come ad esempio i tre CSP forniti da Microsoft: &lt;I&gt;Base CSP&lt;/I&gt;, &lt;I&gt;Enhanced CSP&lt;/I&gt; e &lt;I&gt;Strong CSP&lt;/I&gt;, mentre altri le implementano tramite dispositivi hardware esterni come le smart-cards mantenendo però inalterata l’interfaccia di programmazione per il client. 
&lt;P&gt;Generalmente i dispositivi hardware vengono utilizzati quando il fattore sicurezza è determinante, come nelle applicazioni che integrano la firma digitale conforme alla Legge (firma di sottoscrizione prevista dal DPR 445/2000, firme digitali utilizzate per “archiviazione ottica sostitutiva” – deliberazione AIPA 24/98), oppure come il logon ad un sistema operativo. Per ragioni di sicurezza e di portabilità le applicazioni che richiedono i servizi di crittografia tramite i CSP possono scegliere varie opzioni come il tipo di algoritmo da usare per la firma elettronica o per l’ encryption e la lunghezza delle chiavi. Tuttavia non è possibile interagire direttamente con i dati interni del CSP, infatti per accedere alle chiavi di crittografia le applicazioni utilizzano come riferimenti degli “opaque handle”. 
&lt;P&gt;Ciò che distingue un CSP da un altro è il grado di sicurezza che implementa al suo interno, dato dalla lunghezza delle chiavi che è in grado di gestire e dagli algoritmi implementati. &lt;BR&gt;Fisicamente i CSP sono composti almeno da un file con estensione &lt;I&gt;.DLL&lt;/I&gt; che consente le operazioni di crittografia, e da una firma elettronica che Windows utilizza per verificare l’integrità del sistema. 
&lt;P&gt;Se il CSP è stato sviluppato per ambienti misti (Windows 98, Windows NT e Windows 2000) la firma utilizzata per garantire l’integrità del CSP risiede nel registry, mentre se il CSP è stato scritto per sistemi operativi Windows 2003/XP la firma può essere una risorsa dello stesso file .DLL. In questo caso si evidenzia che la risorsa deve avere una dimensione fissa di 144 bytes e deve essere identificata dal numero 0x29A, rendendo così meno probabile un disallineamento in fase di installazione o aggiornamento. 
&lt;P&gt;Esistono vari esempi di utilizzo dei CSP e delle CryptoAPI da parte del sistema operativo: l’EFS (Encryption File System) di Windows XP/2003, ad esempio, si basa sulle CryptoAPI per la generazione delle chiavi simmetriche e per le operazioni di cifratura; Authenticode, servizio che verifica la provenienza e l’integrità dei componenti scaricati tramite Internet/Intranet, gestisce la verifica della firma dei componenti per mezzo delle CryptoAPI e quindi i CSP. Anche i programmatori hanno a disposizione componenti “out of the box” che fanno largo utilizzo dei CSP, come &lt;I&gt;WININET.DLL&lt;/I&gt;, libreria ad alto livello per l’utilizzo - lato client - dei protocolli Internet come HTTP, FTP, Gopher e HTTPS . 
&lt;P&gt;Ogni CSP ha un database delle chiavi chiamato “Key database” &lt;B&gt;&lt;/B&gt;il quale contiene uno o più “Key containers” all’interno dei quali vengono effettivamente registrate le coppie di chiavi pubblica/privata di tipo &lt;I&gt;signature &lt;/I&gt;ed &lt;I&gt;exchange&lt;/I&gt;. Le prime sono utilizzate per operazioni di firma elettronica, le altre per cifrare le chiavi di sessione. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_2.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_2.png"&gt;&lt;IMG style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height=361 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb.png" width=459 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb.png"&gt;&lt;/A&gt; 
&lt;P&gt;Questi key containers hanno un nome univoco che permette ai client di connettersi tramite &lt;I&gt;CryptAquireContext,&lt;/I&gt; un’ API appartenente alla famiglia delle CryptoAPI. 
&lt;P&gt;L’ActiveX CAPICOM, essendo un wrapper delle CryptoAPI, si interpone tra le applicazioni e le CryptoAPI. 
&lt;P&gt;CAPICOM sfrutta la &lt;I&gt;dual interface&lt;/I&gt;, ovvero combina i metodi &lt;I&gt;IDispatch &lt;/I&gt;e &lt;I&gt;custom &lt;/I&gt;all’interno della stessa vTable, permettendo ai &lt;I&gt;client Automation &lt;/I&gt;l’uso di una sola parte della vTable. In questo modo viene estesa la possibilità di utilizzo delle funzioni di crittografia ad un ampio ventaglio di ambienti di programmazione anche ad alto livello. 
&lt;H4&gt;Firma Digitale con CAPICOM&lt;/H4&gt;
&lt;P&gt;L’introduzione del concetto di firma nell’ambito informatico ha permesso di erogare vari servizi per il controllo di integrità e di non ripudiabilità di documenti (intendendo per documenti una qualsiasi rappresentazione binaria). Alla base della firma elettronica vi è l’utilizzo delle chiavi asimmetriche, ovvero di una coppia di chiavi (numeri) utilizzate una per firmare e l’altra per verificare la firma. Caratteristica delle chiavi di firma asimmetriche è l’improbabilità di ricavare una delle chiavi partendo dall’altra. Delle due chiavi, quella utilizzata per firmare è definita “privata”, mentre quella usata per la verifica della firma è definita “pubblica”. La chiave privata deve essere mantenuta segreta, mentre quella pubblica deve essere consultabile da terze parti. 
&lt;P&gt;Nelle applicazioni PKI (Public Key Infrastructure) vengono normalmente utilizzati due signature scheme diversi: &lt;I&gt;DSA &lt;/I&gt;(Digital Signature Algorithm) e &lt;I&gt;RSA&lt;/I&gt; (Rivest, Shamir, Adleman). Il DSA basa la propria sicurezza sfruttando il problema del logaritmo discreto mentre RSA basa la propria sicurezza utilizzando particolari proprietà formali dei numeri primi molto grandi (valori da 1000 bits o più in cui ogni bit è significativo). Nel 1994 DSA fu scelto dal NIST (National Institute of Standards and Technology) e dalla NSA (National Security Agency) come standard per la firma digitale del governo USA. Fin dagli inizi fu sollevata la questione riguardante la velocità di esecuzione durante la verifica delle firme poiché, pur essendo la generazione della firma elettronica più veloce rispetto a quella di RSA, le operazioni di verifica sono decisamente più lente. Tali obiezioni furono sollevate in quanto in applicazioni PKI sono maggiori le operazioni di verifica rispetto a quelle di firma. Inoltre DSA può essere utilizzato solamente per calcolare le digital signature e non per l’encryption a chiavi asimmetriche. Viceversa RSA è più veloce nelle operazioni di verifica e può essere utilizzato per l’encryption a chiavi asimmetriche. Questa versatilità ha imposto RSA come maggiore standard mondiale nelle applicazioni PKI. &lt;/P&gt;
&lt;P&gt;CAPICOM è in grado di lavorare con chiavi di tipo RSA e DSA. L’unico vincolo è che il CSP utilizzato le supporti.&lt;/P&gt;
&lt;P&gt;Un altro “attore” presente nelle operazioni di firma e di verifica è l’Hash o impronta. Un Hash è il risultato di una funzione che riceve in input una sequenza di simboli binari a dimensione variabile e produce in output un’altra sequenza di simboli binari di dimensioni fisse. Un Hash quindi rappresenta in forma compatta un qualsiasi insieme di bit. Le caratteristiche principali di queste funzioni sono la facilità di calcolo e la compressione. Esistono due grandi famiglie di Hash: Keyed (con chiavi) e Unkeyed (senza chiavi). In questo contesto parleremo espressamente di Hash unkeyed e in particolare della sottoclasse MDC (Modification detection codes)&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_4.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_4.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=285 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_1.png" width=432 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_1.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Gli Hash MDC, chiamati anche manipulation detection codes, hanno principalmente lo scopo di garantire l’integrità dei dati focalizzandosi maggiormente su due proprietà: &lt;I&gt;one way hash functions (OWHFs) &lt;/I&gt;e &lt;I&gt;collision resistant hash functions (CRHFs) o collision free&lt;/I&gt;. Con la proprietà OWHF viene assicurata una notevole difficoltà computazionale nel calcolare i bit di input partendo da quelli di output (l’hash), mentre la proprietà CRHF assicura una bassissima percentuale di probabilità di calcolare due impronte uguali partendo da input diversi. &lt;/P&gt;
&lt;P&gt;Sebbene le CryptoAPI supportano molti algoritmi di Hash, CAPICOM per le operazioni di firma utilizza lo SHA-1 e non esiste nessuna interfaccia che permetta di cambiare tale algoritmo. 
&lt;P&gt;Per completare il quadro, avendo a disposizione la coppia di chiavi e le funzioni di Hash, manca un’entità che associ la persona (l’utente, la macchina o un servizio) alle chiavi: il certificato. 
&lt;P&gt;Il certificato è un documento rilasciato da un terza parte di fiducia la quale si assume l’onere di verificare le credenziali del richiedente e dare una validità temporale alle chiavi. 
&lt;P&gt;In crittografia le operazione di firma e di verifica si dividono in diverse fasi: la firma elettronica si genera partendo da un hash del documento in chiaro e successivamente si cifra l’hash con la propria chiave privata. La verifica, un’operazione leggermente più complessa, avviene tramite il certificato del firmatario dal quale si estrae la chiave pubblica utilizzata per decifrare l’hash generato durante la fase di firma. Una volta ottenuto l’hash in chiaro si rigenera indipendentemente l’hash del documento da verificare e se entrambe le impronte sono uguali, la firma è valida. In questa fase è possibile controllare la validità del certificato appartenente al soggetto firmatario verificando che il certificato non sia scaduto, sospeso o revocato dalla CA (tramite la pubblicazione in una CRL). 
&lt;P&gt;Uno dei primari obiettivi perseguiti durante lo sviluppo di CAPICOM è stato quello di rendere il più semplice possibile alcune operazioni crittografiche. Per apporre una firma digitale, tralasciando i necessari controlli sugli errori, sarebbero sufficienti solamente tre righe: 
&lt;P&gt;………………… 
&lt;P&gt;Dim firma As New SignedData 
&lt;P&gt;firma.Content = bufferToSign 
&lt;P&gt;msgbox firma.Sign 
&lt;P&gt;…………………. 
&lt;P&gt;Questo esempio crea un’istanza dell’oggetto SignedData, gli associa il buffer da firmare ed infine visualizza in una messagebox il risultato dell’operazione di firma codificato. Non avendo selezionato programmaticamente nessun certificato CAPICOM in automatico visualizza una DialogBox contenente la lista dei certificati installati sulla macchina. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/Figura5_2.jpg" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/Figura5_2.jpg"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=231 alt=Figura5 src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/Figura5_thumb.jpg" width=346 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/Figura5_thumb.jpg"&gt;&lt;/A&gt; 
&lt;P&gt;Il metodo &lt;I&gt;Sign&lt;/I&gt; richiede tre parametri : &lt;I&gt;Signer as Signer, bDetached as Boolean e EncodingType as CAPICOM_ENCODING_TYPE&lt;/I&gt;. L’oggetto &lt;I&gt;Signer (&lt;/I&gt;primo parametro) rappresenta il firmatario che deve avere accesso alla chiave privata relativa al certificato utilizzato. Sul platform SDK, nella sessione remarks, è possibile trovare una serie di casistiche sul funzionamento del metodo per Signer uguale o diverso da NULL, in concomitanza con il numero di certificati nello store e in relazione alla proprietà booleana &lt;I&gt;Settings.EnablePromptForCertificateUI &lt;/I&gt;(per le applicazioni middle-tier impostare sempre &lt;I&gt;Settings.EnablePromptForCertificateUI &lt;/I&gt;a FALSE). 
&lt;P&gt;Il secondo parametro &lt;I&gt;bDetached&lt;/I&gt; impostato a TRUE indica che l’hash firmato viene salvato in un file separato rendendo necessario disporre di entrambi i files per l’operazione di verifica. Quando &lt;I&gt;bDetached&lt;/I&gt; è FALSE viene creato un unico file contenente il documento in chiaro e la firma. In entrambi i casi i files contenenti le firme vengono salvati nel formato standard PKCS#7 rendendo possibile l’eventuale operazione di verifica anche tramite altre applicazioni PKI. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_6.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_6.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=346 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_2.png" width=417 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_2.png"&gt;&lt;/A&gt; 
&lt;P&gt;volendo "esplodere" il formato PKCS#7 otteniamo: 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_8.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=284 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_3.png" width=424 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_3.png"&gt;&lt;/A&gt; 
&lt;P&gt;L’ultimo parametro &lt;I&gt;EncodingType&lt;/I&gt; rappresenta il tipo di codifica utilizzata per il buffer contenente la firma. I valori ammessi sono CAPICOM_ENCODE_BASE64 dove i dati vengono salvati in una stringa base64 e CAPICOM_ENCODE_BINARY in cui vengono salvati in formato binario. 
&lt;P&gt;Sempre tramite l’interfaccia ISignedData è possibile firmare ripetutamente un documento tramite il metodo &lt;I&gt;Cosign&lt;/I&gt;. La firma di più persone su un contratto oppure l’approvazione di documenti all’interno di un processo di workflow sono esempi di utilizzo di tale metodo. Come in &lt;I&gt;Sign&lt;/I&gt;, anche in &lt;I&gt;Cosign &lt;/I&gt;valgono le stesse regole sulla presenza di un certificato valido con la propria chiave privata. 
&lt;P&gt;L’operazione di verifica avviene anch’essa tramite un metodo esposto da SignedData: &lt;I&gt;SignedData.Verify (SignedMessage as String, bDetached as boolean, VerifyFlag as CAPICOM_SIGNED_DATA_VERIFY_FLAG)&lt;/I&gt;. Semplicemente richiamando tale metodo vengono effettuati tutti i passi necessari per la verifica della o delle firme associate al documento. I primi due parametri sono equivalenti a quelli presenti in &lt;I&gt;SignedData.Sign &lt;/I&gt;mentre l’ultimo indica la politica di controllo. Il tipo dato CAPICOM_SIGNED_DATA_VERIFY_FLAG&lt;I&gt; &lt;/I&gt;può assumere due valori: CAPICOM_VERIFY_SIGNATURE_ONLY per controllare solamente la validità della firma, CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE aggiunge il controllo completo sulla validità del certificato. 
&lt;H4&gt;Un Sempio in HTML&lt;/H4&gt;
&lt;P&gt;Anche una semplice pagina HTML può fungere da container per CAPICOM permettendo all' utente di inserire le proprie informazioni e firmarle digitalmente.&lt;BR&gt;Questo esempio lo trovate all'interno del CAB di installazione di CAPICOM. 
&lt;P&gt;1) una banalissima form 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_10.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=382 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_4.png" width=471 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_4.png"&gt;&lt;/A&gt; 
&lt;P&gt;2) Selezionate il certificato. Dovete avere almeno 1 certificato nel personal store dei certificati, ovvero almeno un certificato con la chiave privata associata. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_12.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=462 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_5.png" width=471 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_5.png"&gt;&lt;/A&gt; 
&lt;P&gt;3) e premete FIRMA. Quello che si vede è il famoso pacchetto PKCS#7 encodato in BASE64 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_14.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=454 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_6.png" width=469 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_6.png"&gt;&lt;/A&gt; 
&lt;P&gt;4) Premendo verifica si ottiene il controllo del pacchetto pkcs#7. 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_16.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_16.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=411 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_7.png" width=475 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_7.png"&gt;&lt;/A&gt; 
&lt;H4&gt;Un Sempio .NET/CAPICOM&lt;/H4&gt;
&lt;P&gt;Un esempio più significiativo che trovate semre nell' SDK è questo progetto .NET che utilizza CAPICOM per creare la struttura di XMLDSIG (EXML DIgital Signature). Il .NET framework è in grado fin dalle prime versioni di gestire la specifica XMLDSIG ma in questo caso si può vedere l'utilizzo congiunto .NET/CAPICOM 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_18.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_18.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=385 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_8.png" width=334 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_8.png"&gt;&lt;/A&gt; 
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_20.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_20.png"&gt;&lt;IMG style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=312 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_9.png" width=337 border=0 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/Avolteritornano.CAPICOMsecondaparte_102E0/image_thumb_9.png"&gt;&lt;/A&gt; 
&lt;P&gt;Nel prossimo post parlerò delle varie forme di encryption supportate da CAPICOM e alcuni tips &amp;amp; tricks 
&lt;P&gt;--Mario &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7356538" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WInternals/default.aspx">WInternals</category></item><item><title>A volte ritornano... CAPICOM - parte 1 - Overview</title><link>http://blogs.msdn.com/mariofontana/archive/2008/01/31/A-volte-ritornano_2E002E002E00_-CAPICOM-_2800_parte-1_2900_.aspx</link><pubDate>Thu, 31 Jan 2008 02:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7325732</guid><dc:creator>mfontana</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/7325732.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=7325732</wfw:commentRss><description>&lt;P&gt;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 : &lt;STRONG&gt;CAPICOM&lt;/STRONG&gt;.&amp;nbsp; Mi ha colpito per vari motivi primo fra tutti&amp;nbsp;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.&lt;BR&gt;La prima volte che scrissi di CAPICOM 1 era nel lontano&amp;nbsp;2002 sul numero &lt;A href="http://online.infomedia.it/riviste/cp/111/sommario.htm" target=_blank mce_href="http://online.infomedia.it/riviste/cp/111/sommario.htm"&gt;&lt;FONT color=#0065e2&gt;111&lt;/FONT&gt;&lt;/A&gt; e &lt;A href="http://online.infomedia.it/riviste/cp/112/numerocp.htm" target=_blank mce_href="http://online.infomedia.it/riviste/cp/112/numerocp.htm"&gt;&lt;FONT color=#0065e2&gt;112&lt;/FONT&gt;&lt;/A&gt; 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 :-).&lt;/P&gt;
&lt;H4&gt;Cosa è CAPICOM&lt;/H4&gt;
&lt;P&gt;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.&amp;nbsp; Con il rilascio del Microsoft Platform SDK di Febbraio 2001 è stato incluso un nuovo componente COM (&lt;EM&gt;CAPICOM.DLL&lt;/EM&gt;, acronimo di &lt;B&gt;C&lt;/B&gt;rypto&lt;B&gt;API&lt;/B&gt; &lt;B&gt;COM&lt;/B&gt;) 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. 
&lt;P&gt;Con &lt;EM&gt;.NET 1.0 &lt;/EM&gt;e &lt;EM&gt;1.1&lt;/EM&gt; 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.&amp;nbsp; La soluzione migliore era qualla di usare &lt;EM&gt;CAPICOM 2.0 &lt;/EM&gt;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. 
&lt;P&gt;&lt;EM&gt;CAPICOM &lt;/EM&gt;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&amp;nbsp; 
&lt;UL&gt;
&lt;LI&gt;Rilasciati da una qualsiasi Certification Authority (CA) commerciale come Verisign e Thawte &lt;/LI&gt;
&lt;LI&gt;Generati da una infrastruttura PKI di Windows.&lt;/LI&gt;
&lt;LI&gt;Autogenerati con l’utility &lt;I&gt;makecert.exe&lt;/I&gt;. (certificati di test)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;CAPICOM &lt;A href="http://www.microsoft.com/downloads/details.aspx?FamilyId=CA930018-4A66-4DA6-A6C5-206DF13AF316&amp;amp;displaylang=en" mce_href="http://www.microsoft.com/downloads/details.aspx?FamilyId=CA930018-4A66-4DA6-A6C5-206DF13AF316&amp;amp;displaylang=en"&gt;&lt;STRONG&gt;&lt;FONT color=#0065e2&gt;2.1.0.2&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt;&amp;nbsp; &lt;/STRONG&gt;è la versione ad oggi più recente ed è l'unica ad essere supportata in Windows Vista !!! Inoltre CAPICOM esiste solamente nella versione a 32-bits!!! 
&lt;P&gt;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&amp;nbsp;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. 
&lt;P&gt;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.&amp;nbsp;&lt;BR&gt;In una tipica applicazione a più livelli l' oggetto CAPICOM&amp;nbsp;viene creato all’interno di pagine ASP/ASP.NET &amp;nbsp;o gestiti&amp;nbsp;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&amp;nbsp;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. 
&lt;H4&gt;CAPICOM serve a...&lt;/H4&gt;
&lt;P&gt;Volendo schematizzare al massimo le funzionalità di CAPICOM possiamo dire :&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Firma digitale con encoding ASN.1 e supporto allo standard PKCS#7&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Supporto a smart-card riconosciute da Windows&lt;/LI&gt;
&lt;LI&gt;Encryption a chiave simmetrica&lt;/LI&gt;
&lt;LI&gt;Encryption a chiave asimmetrica (envelop)&lt;/LI&gt;
&lt;LI&gt;Calcolo di Hash&lt;/LI&gt;
&lt;LI&gt;CodeSigning per Authenticode&lt;/LI&gt;
&lt;LI&gt;Utilities per il supporto di conversioni di stringhe e generazioni di numeri pseudo-casuali.&lt;/LI&gt;
&lt;LI&gt;Interfacce di supporto tra le CryptoAPI e gli oggetti CAPICOM e viceversa&lt;/LI&gt;
&lt;LI&gt;Supporto ai certificati X509&lt;/LI&gt;
&lt;LI&gt;Supporto agli store dei certificati.&lt;/LI&gt;
&lt;LI&gt;Ricerche all'interno degli store&lt;/LI&gt;
&lt;LI&gt;Supporto ai Certificate Policies, Application Policies e templates&lt;/LI&gt;
&lt;LI&gt;Supporto per esportazione informazioni sensibili via PFX e PKCS#12&lt;/LI&gt;
&lt;LI&gt;Supporto di AES per l'encryption (solo su XP e superiori)&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;e come vedremo nei prossimi post quello che colpisce maggiormente&amp;nbsp;è la sua semplicitià di utilizzo.&lt;/P&gt;
&lt;H4&gt;Installazione e distribuzione di CAPICOM&lt;/H4&gt;
&lt;P&gt;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 &lt;I&gt;capicom.dll&lt;/I&gt; tramite &lt;B&gt;regsvr32.exe, &lt;/B&gt;oppure installando la DLL con il setup dell’applicazione. 
&lt;P&gt;Una seconda modalità in ambiente enterprise è tramite i processi di software distribution. 
&lt;P&gt;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 
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&amp;lt;object classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679"&amp;nbsp; codebase = &lt;A href="http://hostname/myApp/capicom.dll#version=2,1,0,2" mce_href="http://hostname/myApp/capicom.dll#version=2,1,0,2"&gt;&lt;FONT color=#0065e2&gt;http://hostname/myApp/capicom.dll#version=2,1,0,2&lt;/FONT&gt;&lt;/A&gt;&amp;gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;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 &lt;I&gt;High&lt;/I&gt;. 
&lt;P&gt;La&amp;nbsp;quarta modalità, infine,&amp;nbsp;prevede la creazione di un file .INF e tramite le utility &lt;B&gt;makecab.exe&lt;/B&gt; o &lt;B&gt;cabarc.exe&lt;/B&gt;, si genera un file .CAB, lo si firma con &lt;STRONG&gt;signcode.exe&lt;/STRONG&gt;(Le ultime versioni di queste utility sono disponibili nel Microsoft Platform SDK.)&lt;STRONG&gt;,&lt;/STRONG&gt; 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 &lt;B&gt;guidgen.exe&lt;/B&gt;. Il vantaggio nell’utilizzo della terza modalità di installazione (file .CAB) è la minore dimensione del componente da scaricare. 
&lt;H4&gt;Sistemi supportati&lt;/H4&gt;
&lt;P&gt;Versione 1.0 
&lt;P&gt;Windows 95/98/ME with Internet Explorer 5 or later&lt;BR&gt;Windows NT® 4.0 with SP4+&lt;BR&gt;Windows 2000&lt;BR&gt;Windows XP/.Net Server 
&lt;P&gt;(se non per il supporto ad applicativi su W95 e NT4 non c'è ragione di usare la versione 1.0) 
&lt;P&gt;Versione 2.0 
&lt;P&gt;Windows 2000 Service Pack 4&lt;BR&gt;Windows Server 2003 Service Pack 1&lt;BR&gt;Windows Server 2003 Service Pack 2&lt;BR&gt;Windows XP Service Pack 2&lt;BR&gt;Windows Vista (nella sua ultima versione) 
&lt;P&gt;&lt;A class="" href="http://blogs.msdn.com/mariofontana/archive/2008/01/31/a-volte-ritornano-capicom-seconda-parte.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2008/01/31/a-volte-ritornano-capicom-seconda-parte.aspx"&gt;La seconda parte di questa serie di articoli sarà dedicata alla firma digitale con CAPICOM.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;--Mario&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7325732" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Sicurezza/default.aspx">Sicurezza</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/WInternals/default.aspx">WInternals</category></item></channel></rss>