<?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 : Crittografia</title><link>http://blogs.msdn.com/mariofontana/archive/tags/Crittografia/default.aspx</link><description>Tags: Crittografia</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Ancora sull’Application Security : SSL è superato dalle specifiche WS-* ??</title><link>http://blogs.msdn.com/mariofontana/archive/2009/06/22/ancora-sull-application-security-ssl-superato-dalle-specifiche-ws.aspx</link><pubDate>Mon, 22 Jun 2009 08:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9784759</guid><dc:creator>mfontana</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9784759.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9784759</wfw:commentRss><description>&lt;P&gt;Non credevo di suscitare tanto interesse &lt;A href="http://blogs.msdn.com/mariofontana/archive/2009/06/16/la-sicurezza-applicativa-indietro-di-almeno-10-anni-rispetto-al-software-development.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2009/06/16/la-sicurezza-applicativa-indietro-di-almeno-10-anni-rispetto-al-software-development.aspx"&gt;con questo mio precedente post&lt;/A&gt; :-)&amp;nbsp;ma ne sono contento perchè questo conferma una buona sensibilità verso l’application security.&lt;/P&gt;
&lt;P&gt;Ho ricevuto molte email riguardo l’uso di SSL alcune delle quali mi chiedevano se&amp;nbsp; tale protocollo è da considerarsi ancora sicuro. Vedo di sintetizzare un po’ di miei pensieri… sperando di continuare il dibattito :-)&lt;/P&gt;
&lt;H3&gt;&lt;B&gt;SSL è superato dal WS-*?&lt;/B&gt; &lt;/H3&gt;
&lt;P&gt;Assolutamente NO... e ci mancherebbe altro! Sono due mattoni importanti per la messa in sicurezza di un sistema. Sono complementari anche se hanno molte "funzionalità" in comune. Infatti, in alcuni contesti devono essere utilizzati obbligatoriamente entrambi, come ad esempio durante lo scambio di un &lt;STRONG&gt;UsernameToken &lt;/STRONG&gt;definito dalla specifica WS-Security:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;lt;xsd:element name="&lt;B&gt;UsernameToken&lt;/B&gt;"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;xsd:complexType&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsd:sequence&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsd:element ref="Username"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsd:element ref="Password" minOccurs="0"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/xsd:sequence&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsd:attribute name="Id" type="xsd:ID"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;xsd:anyAttribute namespace="##other"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/xsd:complexType&amp;gt; &lt;BR&gt;&amp;lt;/xsd:element&amp;gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Infatti, in questo caso durante lo scambio del token il network si deve fare carico dell’encryption del canale! Volendo schematizzare le affinità e le differenze tra l’uso di SSL e lo stack WS-*:&lt;/P&gt;
&lt;H4&gt;Affinità: &lt;/H4&gt;
&lt;P&gt;- Entrambi garantiscono Autenticazione, Integrità e riservatezza sebbene lo stack WS-* tramite XMLENC e XMLDSIG sia molto più espressivo. &lt;/P&gt;
&lt;P&gt;- E’ sempre il sistemista che interviene sulle configurazioni del server per SSL come può intervenire sulle policy del servizio per modificare le caratteristiche dei messaggi SOAP (+ o -).&lt;/P&gt;
&lt;H4&gt;Differenze:&lt;/H4&gt;
&lt;P&gt;molte! Prima di tutto WS-* prevede il supporto a SOAP mentre SSL no, WS-* NON è applicabile in tutti i contesti di Web-Applications invece SSL si. &lt;/P&gt;
&lt;P&gt;SSL è implementato al livello 5 della famosa pila mentre i WS-* sono in quello definito “nuovo layer 8”. Questo comporta alcune considerazioni di sicurezza importanti..prima tra tutte che il livello 4 (TCP) e 5 da un punto di vista di sicurezza si occupano solamente del mittente. Non è una cosa da poco. Si pensi agli scenari &lt;B&gt;SOA&lt;/B&gt; e &lt;B&gt;SaaS&lt;/B&gt;. SSL è semplicemente un canale cifrato &lt;U&gt;tra due end-point&lt;/U&gt; e non è possibile estendere il conteso di cifratura ad altri server (intermediari) creando possibili “vulnerabilità” nel flusso dei dati. &lt;B&gt;Il contesto di sicurezza dell’applicazione NON è la sommatoria dei singoli contesti&lt;/B&gt;. WS-Security &amp;amp; family, al contrario spostando le informazioni di sicurezza direttamente all’interno dell’header del messaggio SOAP, consente di avere un numero arbitrario di intermediari e di protocolli di rete anche non sicuri garantendo però il contesto di sicurezza dell’applicazione.&lt;/P&gt;
&lt;P&gt;SSL è un protocollo“state-full” ovvero deve mantenere uno “stato” tra il client e il server; il client instaura una connessione con un determinato server e il suo flusso non può essere deviato ad altri server (l’handshake tra il client e il server ha lo scopo di scambiarsi delle chiavi simmetriche – tramite delle chiavi asimmetriche - che entrambi utilizzano per cifrare il canale) perchè non sono in possesso delle corrette chiavi simmetriche per decifrare i dati. In questo scenario è indispensabile ricorrere ad un intervento sistemistico impostando i valori di “&lt;STRONG&gt;affinity&lt;/STRONG&gt;” che associano un client sempre allo stesso server riducendo notevolmente la scalabilità applicativa. Al contrario &lt;B&gt;WS-Security&lt;/B&gt;, basando interamente la propria struttura a livello del messaggio può usufruire di scelte infrastrutturali più scalabili. &lt;/P&gt;
&lt;P&gt;Se ci spostiamo su &lt;B&gt;WS-SecureConversation&lt;/B&gt;, lo scenario cambia nuovamente, ritorniamo alla necessità di avere una chiave simmetrica condivisa, o meglio, un contesto di sicurezza condiviso (SCT- Security Context Token).Per risolvere la ridondanza dei servizi si hanno 3 opzioni: &lt;/P&gt;
&lt;P&gt;1) Sistemistico tramite affinity proprio come SSL.&lt;/P&gt;
&lt;P&gt;2) Misto:tramite un database di SCT condiviso da tutti i server bilanciati.&lt;/P&gt;
&lt;P&gt;3) Applicativo, estendendo lo schema del SCT. (possibili problemi di compatibilità con terze parti o comunque con software non aware del nuovo schema)&lt;/P&gt;
&lt;P&gt;&lt;B&gt;&lt;/B&gt;&lt;/P&gt;
&lt;H4&gt;Considerazioni su SSL&lt;/H4&gt;
&lt;P&gt;SSL è un ottimo protocollo crittografico ma per quanto riguarda la sicurezza (non la crittografia) siamo ben lontani !! Innanzitutto il meccanismo di protezione non è efficace per quegli utenti “distratti” che non vanno a verificare TUTTE LE VOLTE l’URL nel browser con l’indirizzo specificato nel certificato. Inoltre, il famoso warning di incongruenza di dati del certificato viene sempre ignorato (= OK) permettendo, se va male, l’attacchi basato su ip-spoofing,ecc... E’ anche vera una riflessioncina : a prescindere da tutto, se un amministratore di un sito gestisce così il protocollo SSL c’è da chiedersi come gestisca l’intero sistema ...Mah..&lt;/P&gt;
&lt;P&gt;A questo proposito a partire da &lt;STRONG&gt;Windows Vista&lt;/STRONG&gt; è stato introdotto il supporto agli &lt;B&gt;Extended Validation SSL Certificates &lt;/B&gt;&lt;A href="http://www.microsoft.com/windows/ev" mce_href="http://www.microsoft.com/windows/ev"&gt;http://www.microsoft.com/windows/ev&lt;/A&gt;. Sicuramente utile ma prima di tutto devono essere adottatti largamente dai gestori dei siti!!!!&lt;/P&gt;
&lt;P&gt;SSL fonda la sua sicurezza pesantemente sulla robustezza dei cifrari asimmetrici e simmetrici utilizzati (come anche WS-*), cambia spesso la chiave di sessione (5min di default) e mitiga il reply tramite il &lt;I&gt;Connect_id.&lt;/I&gt;&lt;/P&gt;
&lt;P&gt;A questo punto volendo schematizzare i pro e i contro nell’ uso di SSL : 
&lt;TABLE border=1 cellSpacing=0 cellPadding=0 width=594&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=316&gt;
&lt;P&gt;&lt;B&gt;&lt;I&gt;SSL PRO&lt;/I&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=276&gt;
&lt;P&gt;&lt;B&gt;&lt;I&gt;SSL CONTRO&lt;/I&gt;&lt;/B&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=316&gt;
&lt;P&gt;Standard&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=276&gt;
&lt;P&gt;Dispendioso per la CPU&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=316&gt;
&lt;P&gt;Autenticazione, integrità e riservatezza&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=276&gt;
&lt;P&gt;Session oriented&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=316&gt;
&lt;P&gt;Nessun vincolo di linguaggi di programmazione&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=276&gt;
&lt;P&gt;Implementazione solo su HTTP (non per motivi tecnici o di specifica).&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=316&gt;
&lt;P&gt;Nessun vincolo di pattern di sicurezza applicativa&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=276&gt;
&lt;P&gt;Valido solo su singolo hop&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=316&gt;
&lt;P&gt;“Gratis” per chi disegna ed implementa le applicazioni.&lt;/P&gt;&lt;/TD&gt;
&lt;TD vAlign=top width=276&gt;
&lt;P&gt;Non assicura i dati una volta arrivati al server.&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD vAlign=top width=316&gt;&amp;nbsp;&lt;/TD&gt;
&lt;TD vAlign=top width=276&gt;
&lt;P&gt;NON ESONERA GLI SVILUPPATORI DALLO SCRIVERE CODICE SICURO J&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;H3&gt;Attacchi e Contromisure&lt;/H3&gt;
&lt;P&gt;Di &lt;STRONG&gt;SSL &lt;/STRONG&gt;ormai si sa (quasi) tutto. Gli attacchi principali al protocollo SSL sono noti mentre per lo stack WS-* se ne conoscono ancora relativamente pochi. &lt;/P&gt;
&lt;P&gt;Per quanto riguarda SSL l’ultimo in ordine di tempo è l’ attacco basato sul &lt;B&gt;&lt;I&gt;BVO(Bad-version Oracle)&lt;/I&gt;&lt;/B&gt;. (nulla a che vedere con il famoso produttore di Database :-) )&lt;/P&gt;
&lt;P&gt;SSL/TLS utilizza l’encoding &lt;STRONG&gt;PKCS#1 &lt;/STRONG&gt;(v1.5) per l’encryption del pre-master-secret (valore utilizzato per la derivazione delle session keys).Un hacker che riesce a recuperare il premaster-secret può decifrare l’intera sessione SSL.L’attacco principale è una derivazione dell’attacco di &lt;STRONG&gt;Bleichenbacher &lt;/STRONG&gt;per il PKCS#1.Parte dal presupposto che il meccanismo di versioning del PKCS#1 permette di creare un side-channel che permetta di invertire l’encryption recuperando il premaster-secret e/o firmarndosi come server!Questo attacco riesce entro le 54 ore con chiavi asimmetriche a 1024.&lt;/P&gt;
&lt;P&gt;Inoltre, se si dispone di proxy server sarebbe consigliato configurare l’analisi dei primi passi del traffico dell’handshake di SSL per evitare che venga fatto del tunneling di un protocollo non autorizzato su una porta aperta (443 di default). &lt;/P&gt;
&lt;P&gt;Per quanto riguarda le contromisure agli attacchi a &lt;STRONG&gt;SOAP/WS-* siamo messi (forse) peggio&lt;/STRONG&gt;! Già durante la WPC 2007 ho presentato un sunto di vari attacchi a partire da SOAP fino alle specifiche più complesse come WS-Security e spero a breve di riuscire a sintetizzarli in uno o più post !! In questo articolo prendiamo in esame uno degli aspetti più importanti di WS-Security : la dipendenza da &lt;STRONG&gt;XMLENC &lt;/STRONG&gt;e &lt;STRONG&gt;XMLDISG (&lt;/STRONG&gt;per sapere come sono fatti leggete &lt;A href="http://blogs.msdn.com/mariofontana/archive/2007/10/30/specifiche-di-base-xml-digital-signature-in-pillole.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2007/10/30/specifiche-di-base-xml-digital-signature-in-pillole.aspx"&gt;qui&lt;/A&gt; e &lt;A href="http://blogs.msdn.com/mariofontana/archive/2007/11/22/specifiche-di-base-xml-encryption-in-pillole.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2007/11/22/specifiche-di-base-xml-encryption-in-pillole.aspx"&gt;qui&lt;/A&gt;&lt;STRONG&gt;). &lt;/STRONG&gt;Infatti da alcuni anni orami sono noti vari attacchi di tipo DoS a queste strutture. L’attacco verte sulla funzione di &lt;STRONG&gt;verifica/decrypt dei dati&lt;/STRONG&gt;. Ad esempio in XMLDSIG l’elemento &lt;EM&gt;Reference &lt;/EM&gt;raccoglie l’informazione da firmare. Lo schema di Reference :&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;lt;element name="Reference" type="ds:ReferenceType"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;complexType name="ReferenceType"&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sequence&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;element ref="ds:Transforms" minOccurs="0"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;element ref="ds:DigestMethod"/&amp;gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;element ref="ds:DigestValue"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/sequence&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;attribute name="Id" type="ID" use="optional"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;attribute name="URI" type="anyURI" use="optional"/&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;attribute name="Type" type="anyURI" use="optional"/&amp;gt; &lt;BR&gt;&amp;nbsp; &amp;lt;/complexType&amp;gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;mostra chiaramente che il contenuto da firmare non è il documento stesso, ma bensi l’hash del documento (&lt;EM&gt;DigestMethod &lt;/EM&gt;e &lt;EM&gt;DigestValue&lt;/EM&gt;) più le informazioni di rappresentazione.&lt;/P&gt;
&lt;P&gt;Poichè il processo di verifica della firma prevede il ricalcolo dell’hash dell’oggetto firmato, cosa succede se l’URI del Reference indica ad esempio il SP1 di Windows 2003 ?? Il Thread di IIS che sta processando il codice applicativo si scarica 315 Mb per poter calcolare l’hash... moltiplichiamo la richiesta n volte e, etvoilà...&lt;STRONG&gt;HABEMUS DoS Attack&lt;/STRONG&gt;...&lt;/P&gt;
&lt;P&gt;Contromisure? Beh, applicative e di content analisys da parte dei firewall. In alcuni contesti è possibile implementare alcuni pattern di sicurezza come il &lt;I&gt;Message Validator&lt;/I&gt; oppure dedicare uno o più &lt;I&gt;Perimeter Service Router&lt;/I&gt; applicativi.&lt;/P&gt;
&lt;P&gt;In sintesi le contromisure per gli attacchi a SSL sono di competenza dei sistemisti :-) mentre quelli a livello applicativo spesso sono distribuiti tra sistemisti e architetti/sviluppatori. &lt;/P&gt;
&lt;P&gt;E’ però importante sottolineare che &lt;U&gt;per quanto riguarda la messa in sicurezza di una applicazione l’uso di SSL o WS-* &lt;B&gt;non significa NULLA o quasi&lt;/B&gt;&lt;/U&gt;. &lt;B&gt;Gli attacchi applicativi tipo Buffer Overrun, SQL-Injection, XSS, Code-inj.,Canonicalization attacks, Ecc... avvengono ne più ne meno...perchè il 95% di codesti attacchi è riconducibile ad un unico antipattern tipico di chi sviluppa : (mancanza) di INPUT VALIDATION !!!!&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;Qunidi, alla domanda più ricorrente che ci sia in questo ambito &lt;STRONG&gt;:”quando una applicazione può esserer considerata (più) sicura? &lt;/STRONG&gt;non posso che rispondere in questo&amp;nbsp; modo &lt;STRONG&gt;: quando è stata sviluppata seguendo il processo di SDL fin dal principio :-)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;--Mario&lt;/P&gt;
&lt;P&gt;PS : Se volete saperne di più sulla sicurezza applicativa, da cosa è composta e come dovrebbe essere affrontata leggete questo mio post dal titolo : &lt;A href="http://blogs.msdn.com/mariofontana/archive/2007/11/02/perch-la-sicurezza-applicativa-cos-ostica.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2007/11/02/perch-la-sicurezza-applicativa-cos-ostica.aspx"&gt;Perchè la sicurezza applicativa è così ostica ?&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9784759" 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></item><item><title>C’è ancora chi usa l’ MD5 nelle nuove applicazioni?? Certo !</title><link>http://blogs.msdn.com/mariofontana/archive/2009/04/29/c-ancora-chi-usa-l-md5-nelle-nuove-applicazioni-certo.aspx</link><pubDate>Wed, 29 Apr 2009 12:53:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9575437</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9575437.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9575437</wfw:commentRss><description>&lt;p&gt;Segnalo &lt;a href="http://geekinfosecurity.blogspot.com/2009/04/lalgoritmo-md5-e-le-analisi-di.html" target="_blank"&gt;questo bel post&lt;/a&gt; di &lt;strong&gt;Roberto Scaccia&lt;/strong&gt; sul’analisi di sicurezza del codice e l’utilizzo dell’algoritmo MD5… &lt;/p&gt;  &lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9575437" 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></item><item><title>Visualizzare messaggi SOAP protetti da SSL</title><link>http://blogs.msdn.com/mariofontana/archive/2009/03/31/visualizzare-messaggi-soap-protetti-da-ssl.aspx</link><pubDate>Tue, 31 Mar 2009 12:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9514184</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9514184.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9514184</wfw:commentRss><description>&lt;p&gt;Durante la mia sessione alla conferenza &lt;em&gt;Basta!Italia &lt;/em&gt;ho fatto vedere come analizzare il traffico SOAP tra due servizi protetti da SSL presenti sulla stessa macchina di sviluppo (scenario molto comune quando si programma :-). L’obiettivo era quello di visualizzare il &lt;em&gt;Security Token &lt;/em&gt;di tipo Username &amp;amp; Password definito da WS-Security all’interno dell’header SOAP. Nel caso specifico, poichè le &lt;strong&gt;Windows Web Services API &lt;/strong&gt;(&lt;em&gt;WWSAPI&lt;/em&gt;) non sono in grado di garantire la sicurezza a livello di messaggio, l’obiettivo era quello di visualizzare il Token creato dalle &lt;em&gt;WWSAPI &lt;/em&gt;anche se usavamo SSL per il trasporto !!&lt;/p&gt;  &lt;p&gt;Anche in questo caso, come in quello precedente, le impostazioni che faremo sono da considerarsi solo per le macchine degli sviluppatori e non in produzione !! Userò ancora il tag &lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;lt;WARNING&amp;gt;&lt;/font&gt;&lt;/strong&gt; per evidenziare le configurazioni pericolose per la produzione.&lt;/p&gt;  &lt;p&gt;In questo scenario ho fatto le seguenti configurazioni:   &lt;br /&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;lt;WARNING&amp;gt;&lt;/font&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Nel file hosts ho configurato : 127.0.0.1 &lt;b&gt;BastaConferenceWebServices.com&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;Certificati:&lt;/li&gt;    &lt;ol&gt;     &lt;li&gt;Verificare che il nostro Reverse-Proxy (Charles, ma si può utilizzare anche Fiddler) abbia installato il proprio certificato in &lt;em&gt;Current User-&amp;gt;Trusted Root Certification Authorities&lt;/em&gt;.&lt;/li&gt;      &lt;li&gt;Creare il certificato SSL via &lt;em&gt;makecert.exe&lt;/em&gt; (o via CA) con il parametro : &lt;em&gt;-n &amp;quot;BastaConferenceWebServices.com&amp;quot; (Maggiori info &lt;a href="http://blogs.msdn.com/mariofontana/archive/2009/03/30/windows-web-services-api-configurazione-certificati-e-sicurezza-per-gli-esempi-con-ssl.aspx" target="_blank"&gt;qui&lt;/a&gt;) &lt;/em&gt;&lt;/li&gt;      &lt;li&gt;Installare il certificato appena creato in &lt;em&gt;Local Computer -&amp;gt;Trusted Root Certification Authorities &lt;/em&gt;e in &lt;em&gt;Local Computer –&amp;gt;Personal &lt;/em&gt;.&lt;/li&gt;      &lt;li&gt;Associare il certificato appena creato con la porta 127.0.0.1:8444 via netsh.exe (Maggiori info &lt;a href="http://blogs.msdn.com/mariofontana/archive/2009/03/30/windows-web-services-api-configurazione-certificati-e-sicurezza-per-gli-esempi-con-ssl.aspx" target="_blank"&gt;qui&lt;/a&gt;) &lt;/li&gt;      &lt;li&gt;Impostare l’URL reservation (con l’utility : &lt;em&gt;netsh http add urlacl – maggiori info sempre &lt;a href="http://blogs.msdn.com/mariofontana/archive/2009/03/30/windows-web-services-api-configurazione-certificati-e-sicurezza-per-gli-esempi-con-ssl.aspx" target="_blank"&gt;qui&lt;/a&gt; &lt;/em&gt;) dato che sicuramente il Web Service &lt;strong&gt;NON&lt;/strong&gt; lo faremo girare con le credenziai di amministratore, nemmeno durante lo sviluppo… vero??? ;-)&lt;/li&gt;   &lt;/ol&gt;    &lt;li&gt;Configurare Charles come Reverse Proxy     &lt;br /&gt;      &lt;br /&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/VisualizzareimessaggiSOAPprotettidaSSL_AB71/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/VisualizzareimessaggiSOAPprotettidaSSL_AB71/image_thumb_1.png" width="428" height="343" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Dare OK e lanciare il Web Service e il client.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;lt;/WARNING&amp;gt;&lt;/font&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Alla fine della configurazione dovremo avere uno scenario di questo tipo: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/VisualizzareimessaggiSOAPprotettidaSSL_AB71/image_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/VisualizzareimessaggiSOAPprotettidaSSL_AB71/image_thumb.png" width="542" height="295" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;dove il client parla sulla &lt;strong&gt;2051&lt;/strong&gt; pensando di parlare con il nostro &lt;em&gt;Web Service&lt;/em&gt;. Sulla &lt;strong&gt;2051 &lt;/strong&gt;c’è il Reverse Proxy che crea la connessione SSL con il client, accetta il messaggio SOAP, lo logga e diventa il client SSL per il Web Service (vero) sulla &lt;strong&gt;8444&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Vi sembra familiare?? Ebbene si. Questo è il tipico esempio di attacco &lt;strong&gt;&lt;font color="#ff0000"&gt;Man-in-the-Middle&lt;/font&gt;&lt;/strong&gt;, ma usato a fin di bene :-). Prima che venga il dubbio che quindi SSL non è sicuro ricordo che nessun protocollo è veramente sicuro se sono amministratore di tutto l’ambiente !!!&amp;#160; &lt;/p&gt;  &lt;p&gt;Infatti in questo modo possiamo visualizzare il messaggio del client: &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Envelope&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;… TRONCATO…&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Header&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:Action&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;s:mustUnderstand&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;http://Example.org/ICalculator/Add&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:Action&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:MessageID&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;urn:uuid:1bcbe628-18e6-484b-8ed4-363d59ad0fae&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:MessageID&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:To&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;s:mustUnderstand&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;https://BastaConferenceWebServices.com:2051/example&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:To&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:Security&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;s:mustUnderstand&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;xmlns:o&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Timestamp&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Created&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;2009-03-26T15:21:04.786Z&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Created&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Expires&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;2009-03-26T15:26:04.786Z&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Expires&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Timestamp&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:UsernameToken&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:Username&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;usr1&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:Username&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:Password&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;Type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pwd1&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:Password&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:UsernameToken&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:Security&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Header&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Add&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://Example.org&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;b&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;2&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;b&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Add&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Envelope&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt; Con relativa risposta :&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Envelope &lt;span style="color: red"&gt;… TRONCATO…&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Header&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:Action&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;s:mustUnderstand&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;http://Example.org/ICalculator/AddResponse&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:Action&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:RelatesTo&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;urn:uuid:1bcbe628-18e6-484b-8ed4-363d59ad0fae&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;a:RelatesTo&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:Security&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;s:mustUnderstand&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;1&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;xmlns:o&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Timestamp&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Created&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;2009-03-26T15:21:05.921Z&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Created&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;Expires&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;2009-03-26T15:26:05.921Z&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Expires&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;Timestamp&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;o:Security&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Header&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;AddResponse&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;xmlns&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;http://Example.org&lt;/span&gt;&amp;quot;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;result&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 3&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;result&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;AddResponse&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;#160; &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Body&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;s:Envelope&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&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=9514184" 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></item><item><title>Windows Web Services API : Configurazione Certificati e sicurezza per gli esempi con SSL</title><link>http://blogs.msdn.com/mariofontana/archive/2009/03/30/windows-web-services-api-configurazione-certificati-e-sicurezza-per-gli-esempi-con-ssl.aspx</link><pubDate>Mon, 30 Mar 2009 14:07:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9513771</guid><dc:creator>mfontana</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/9513771.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=9513771</wfw:commentRss><description>&lt;P&gt;Tutti gli esempi che ho creato nei post precedenti erano su HTTP quindi senza sfruttare la sicurezza di trasporto (SSL). Ora vediamo quali passi sono necessari per configurare la comunicazione su SSL (&lt;A href="http://msdn.microsoft.com/en-us/library/dd323341(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/dd323341(VS.85).aspx"&gt;uso questo esempio su MSDN&lt;/A&gt; )&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;IMPORTANTE !!! &lt;/STRONG&gt;In questo post alcune delle configurazioni che faccio sui certificati digitali possono risultare molto pericolose su macchine di produzione… In un ambiente di produzione il rilascio,l’installazione e la manutenzione dei certificati deve essere seguito secondo i processi definiti dalla PKI !! Al contrario, sulle macchine dei sviluppatori spesso risulta necessario farsi delle configurazioni ad hoc per essere autonomi rispetto ai colleghi sistemisti :-) :-). Per facilitare la cosa metterò un tag &lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt; &lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;su tutte quelle procedure da non riprodurre in produzione !!&lt;/P&gt;
&lt;P&gt;Innanzitutto i passaggi per impostare i progetti client e service e il processo di creazione dei file .c e .h dal wsdl sono sempre i medesimi descritti &lt;A href="http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2009/03/26/windows-web-services-api-step-by-step-per-il-client.aspx"&gt;qui&lt;/A&gt; e &lt;A href="http://blogs.msdn.com/mariofontana/archive/2009/03/27/windows-web-services-api-step-by-step-per-creare-un-web-service.aspx" target=_blank mce_href="http://blogs.msdn.com/mariofontana/archive/2009/03/27/windows-web-services-api-step-by-step-per-creare-un-web-service.aspx"&gt;qui&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;Per far si che il nostro Web Service possa utilizzare il protocollo SSL è necessario configurare quale certificato verrà utilizzato per l’inizializzazione del protocollo. Ce lo ricorda anche un commento nel codice presente in tutti gli esempi su MSDN che utilizzano SSL&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;// NOTE: At the server, the SSL certificate for the listen URI must be &lt;BR&gt;// registered with http.sys using a tool such as httpcfg.exe.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Questa operazione andrà eseguita perchè faremo noi l’hosting del Web Service all’interno di una Win32 console al posto di IIS !! &lt;/P&gt;
&lt;P&gt;In questo post utilizzerò l’utility &lt;EM&gt;netsh.exe &lt;/EM&gt;invece di &lt;EM&gt;httpcfg.exe&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Per prima cosa dovremo procurarci un certificato digitale X509v3. Se non riusciamo ad avere in tempo un certificato da una CA allora seguite questi semplici passi:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;usiamo l’utility &lt;EM&gt;makecert.exe&lt;/EM&gt; per creare ed installare il certificato nel &lt;EM&gt;certificate store &lt;/EM&gt;di Windows. (maggiori info sui &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 mce_href="http://blogs.msdn.com/mariofontana/archive/2008/02/01/tutto-quello-che-un-architetto-deve-sapere-sui-certificati-digitali-e-windows.aspx"&gt;certificati&lt;/A&gt; e sugli &lt;A 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;store&lt;/A&gt; in Windows). Apriamo una console di Visual Studio in Administrator mode e lanciamo :&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;makecert -r -pe -n "CN= 127.0.0.1" -b 01/01/2009 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;/WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Tramite questo comando abbiamo creato un certificato per “Ensure the identity of a remote computer” e “All issuance policies” ed è stato installato nel certificate store della macchina (local machine). Apriamo la mmc dei certificati e clicchiamo sul certificato in &lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; e dovremmo vedere una cosa simile a quanto riportato in figura.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_10.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_10.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_4.png" width=511 height=334 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_4.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;a questo punto se proviamo a lanciare il nostro esempio riceviamo il seguente errore : &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x803d0014 &lt;BR&gt;There was an error communicating with the endpoint at '&lt;/EM&gt;&lt;A href="https://127.0.0.1:8999/examplex" mce_href="https://127.0.0.1:8999/examplex"&gt;&lt;EM&gt;https://127.0.0.1:8999/example’&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;. &lt;BR&gt;The connection with the server was terminated abnormally&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;questo perchè non abbiamo ancora creato il binding tra l’URI e il certificato digitale nel nostro kernel mode http listener(Http.sys) e quindi il protocollo SSL non può funzionare.&amp;nbsp; Infatti se lanciamo il seguente comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http show sslcert&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;abbiamo una lista dei certificati configurati per SSL con relativo IP:port e hash del certificato! Ovviamente il nostro &lt;EM&gt;127.0.0.1:8999 &lt;/EM&gt;non esiste. Quindi lo creiamo lanciando il seguente comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http add sslcert ipport=&lt;STRONG&gt;127.0.0.1:8999&lt;/STRONG&gt; certhash=a455de0b81ce3251d177d9fb74c62fe237a49ae1 appid={00112233-4455-6677-8899-AABBCCDDEEFF}&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In questo caso abbiamo impostato il parametro &lt;STRONG&gt;&lt;EM&gt;ipport=127.0.0.1:8999 &lt;/EM&gt;&lt;/STRONG&gt;e &lt;EM&gt;certhash &lt;/EM&gt;con l’hash del nostro certificato appena creato. Per ottenere il valore dell’hash dobbiamo aprire il certificato e alla voce &lt;EM&gt;Thumbprint &lt;/EM&gt;nella tab &lt;EM&gt;Details &lt;/EM&gt;copiare il contenuto. &lt;STRONG&gt;Ricordarsi di togliere gli spazi !!!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_12.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_12.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_5.png" width=395 height=356 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_5.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;se ora rilanciamo il comando &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;netsh http show sslcert&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;potremo vedere il nuovo binding sulla porta 8999&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_14.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_14.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_6.png" width=390 height=147 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_6.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Se proviamo ora a lanciare il nostro esempio riceviamo un altro errore:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x803d000a &lt;BR&gt;There was an error communicating with the endpoint at '&lt;/EM&gt;&lt;A href="https://127.0.0.1:8999/example’" mce_href="https://127.0.0.1:8999/example’"&gt;&lt;EM&gt;https://127.0.0.1:8999/example’&lt;/EM&gt;&lt;/A&gt;&lt;EM&gt;. &lt;BR&gt;The certificate authority is invalid or incorrect&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;infatti come si vede anche dalla &lt;STRONG&gt;figura 1&lt;/STRONG&gt; il certificato che abbiamo creato ed installato non è valido dal punto di vista della “&lt;EM&gt;Certification path&lt;/EM&gt;”. Per rimediare a questo problema basta copiare il certificato da &lt;BR&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; &lt;/P&gt;
&lt;P&gt;a&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Certificates (Local Computer)-&amp;gt;Trusted Root Certification Authorities-&amp;gt;Certificates &lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;FONT color=#ff0000&gt;&amp;lt;/WARNING!!&amp;gt;&lt;/FONT&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;a quel punto, se riclicchiamo sul certificato all’interno di &lt;EM&gt;Certificates (Local Computer)-&amp;gt;Personal-&amp;gt;Certificates&lt;/EM&gt; avremo :&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_8.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_8.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_3.png" width=335 height=209 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;che ci assicura che tutta la “&lt;EM&gt;Certification path&lt;/EM&gt;” è corretta.&lt;/P&gt;
&lt;P&gt;Finalmente, se ora lanciamo il&amp;nbsp; Web Service e il client il tutto funziona con il protocollo SSL !!!! Finito?? Non direi :-) &lt;/P&gt;
&lt;H3&gt;NOOOOO… UN WEB SERVICE CHE GIRA SOLO COME ADMINISTRATOR???&lt;/H3&gt;
&lt;P&gt;In effetti, se ci fermiamo qui i nostri Web Services girano solo se hanno le credenziali di amministratore !!! Orrore !!! Infatti se creiamo due local &lt;EM&gt;Users demo1 &lt;/EM&gt;e &lt;EM&gt;demo2 (aggiungere la policy longon locally se si tratta del server) &lt;/EM&gt;e dalla nostra console amministrativa lanciamo &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;runas /user:demo1 cmd.exe (dopo l’invio ci chiede la password)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;runas /user:demo2 cmd.exe (dopo l’invio ci chiede la password)&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;se nella cmd di &lt;EM&gt;demo1&lt;/EM&gt; ad esempio lanciamo il nostro service (che prima funzionava nella console che gira come admin) avremo come risposta :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;Failure: errorCode=0x80070005 &lt;BR&gt;Unable to add URL to HTTP URL group. &lt;BR&gt;&lt;STRONG&gt;Access is denied.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Per superare questo ultimo scoglio dobbiamo assegnare i permessi ad un gruppo di utenti (o ad un singolo utente nel nostro caso, per semplicità) per un determinato &lt;EM&gt;HTTP URL namespace&lt;/EM&gt;. Con questa operazione di fatto diamo la possibilità di creare dei servizi di listener su determinati URL a tutti i processi che girano con le credenziali definite. Questa operazione verrà effettuata, ad esempio, durante il processo di installazione dei nostri servizi. Per fare questa operazione lanciamo il comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http add urlacl url=http&lt;B&gt;s&lt;/B&gt;://127.0.0.1:8999/example user=demo1&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;e possiamo visualizzare il nuovo namespace reservation tramite il comando :&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http show urlacl&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_16.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_16.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_7.png" width=421 height=134 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_7.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;a questo punto se rilanciamo il servizio sempre dalla console &lt;EM&gt;demo1&lt;/EM&gt; … funzionerà !!!&amp;nbsp; mentre se lo lanciamo dalla console &lt;EM&gt;demo2 &lt;/EM&gt;no !! &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_18.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_18.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_8.png" width=561 height=297 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_8.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;La prova del nove? Dalla console amministrativa lanciate il comando:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;I&gt;Netsh http delete urlacl url=https://127.0.0.1:8999/example&lt;/I&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;che cancella nuovamente la reservation e vedrete che se rilanciate il vostro Web service sempre dalla console &lt;EM&gt;demo1&lt;/EM&gt; non funzionerà nuovamente :-)&lt;/P&gt;
&lt;H3&gt;Un paio di Curiosità &lt;/H3&gt;
&lt;P&gt;1) &lt;STRONG&gt;Dove vengono registrate le info di &lt;EM&gt;netsh.exe&lt;/EM&gt; ?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Tutte le impostazioni vengono salvate nel registy :&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\&lt;STRONG&gt;SslBindingInfo&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_22.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_22.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_2.png" width=503 height=102 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;e in &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\&lt;STRONG&gt;UrlAclInfo&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_20.png" mce_href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_20.png"&gt;&lt;IMG style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=image border=0 alt=image src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_1.png" width=505 height=254 mce_src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/WindowsWebServicesAPIConfigurazioneCerti_EF96/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;2) Quali API devo utilizzare per crearmi programmaticamente una URL reservation?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Le API di riferimento sono le &lt;/STRONG&gt;&lt;STRONG&gt;&lt;A href="http://msdn.microsoft.com/en-us/library/aa364622(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/aa364622(VS.85).aspx"&gt;HTTP Server API Reference&lt;/A&gt;. &lt;BR&gt;Alla fine il tutto si risolve tramite le API &lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;ULONG HttpInitialize( __in HTTPAPI_VERSION Version, &lt;BR&gt;&lt;/EM&gt;&lt;EM&gt;__in ULONG Flags, &lt;BR&gt;__reserved PVOID pReserved );&lt;/EM&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;e&lt;/STRONG&gt;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;&lt;PRE&gt;&lt;EM&gt;ULONG HttpSetServiceConfiguration(
  __in  HANDLE ServiceHandle,
  __in  HTTP_SERVICE_CONFIG_ID ConfigId,
  __in  PVOID pConfigInformation,
  __in  ULONG ConfigInformationLength,
  __in  LPOVERLAPPED pOverlapped
);&lt;/EM&gt;&lt;/PRE&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Stavo per scrivere il wrapper in C# via p/Invoke ma grazie a Keith Brown &lt;A href="http://www.pluralsight.com/community/blogs/keith/archive/2005/10/17/15632.aspx" target=_blank mce_href="http://www.pluralsight.com/community/blogs/keith/archive/2005/10/17/15632.aspx"&gt;ho risparmiato almeno un’oretta di lavoro&lt;/A&gt; :-). Anche in questo caso, esclusi i vari controlli il tutto si riduce nelle due chiamate alle HTTP API.&lt;/P&gt;&lt;EM&gt;&lt;/EM&gt;
&lt;P&gt;&lt;EM&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;// Inizializzazioni varie delle HTTP API&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;…&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;// Impostazione delle ACL&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;int errorCode = HttpInitialize(httpApiVersion,HTTP_INITIALIZE_CONFIG, IntPtr.Zero);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;errorCode = HttpSetServiceConfigurationAcl(IntPtr.Zero, HttpServiceConfigUrlAclInfo,ref configInfo, Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET)),IntPtr.Zero);&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;//Chiamte a Funzioni HTTPAPI di CleanUp…&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;…&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Infine, mi raccomando di ricordarsi di cancellare o disattivare gli utenti locali demo1 e demo2 e di cancellare i certificati quanto prima !!!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;--Mario&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9513771" 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/CryptoAPI/default.aspx">CryptoAPI</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/Win7/default.aspx">Win7</category><category domain="http://blogs.msdn.com/mariofontana/archive/tags/C_2F00_C_2B002B00_/default.aspx">C/C++</category></item><item><title>A volte ritornano... CAPICOM - parte 3 - Encryption</title><link>http://blogs.msdn.com/mariofontana/archive/2008/02/14/a-volte-ritornano-capicom-parte-3-encryption.aspx</link><pubDate>Thu, 14 Feb 2008 12:58:35 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7689254</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/7689254.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=7689254</wfw:commentRss><description>&lt;p&gt;In crittografia l’informazione in chiaro viene chiamata “plaintext” mentre lo stesso dato cifrato viene denominato “ciphertext”.  &lt;p&gt;L’encryption è la procedura che converte il paintext in ciphertext, il decription è la funzione inversa che converte il ciphertext in plaintext. &lt;br&gt;Con CAPICOM è possibile effettuare due distinte operazioni di encryption : a chiave segreta e a chiave pubblica. La prima viene chiamata anche cifratura a chiave simmetrica o “shared secret” utilizzabile tramite l’interfaccia &lt;em&gt;IEncryptedData&lt;/em&gt;; la seconda utilizza nuovamente le funzionalità delle chiavi asimmetriche. Quest’ultima viene esposta tramite l’interfaccia &lt;em&gt;IEnvelopedData&lt;/em&gt;.  &lt;h2&gt;IEncryptedData&lt;/h2&gt; &lt;p&gt;La cifratura a chiave simmetrica ha la caratteristica di utilizzare la stessa chiave, detta anche session key, per cifrare e decifrare  &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/CAPICOMEncryption_F1B7/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="224" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/CAPICOMEncryption_F1B7/image_thumb_1.png" width="484" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Queste chiavi sono un numero random con dimensioni che possono variare da 40 a 2000 bit, spesso generate partendo da un hash. CAPICOM quando genera le chiavi di sessione tramite la cifratura a blocchi le calcola in CBC mode (cipher block chaining) con un Initialization vector (IV) uguale a zero. Infatti questa è la modalità di default della API &lt;em&gt;CryptDeriveKey&lt;/em&gt; utilizzata appunto per la generazione delle session key non casuali.&lt;/p&gt; &lt;p&gt;&lt;em&gt;IEncryptedData &lt;/em&gt;mette a disposizione due proprietà e tre metodi. Le due proprietà, &lt;em&gt;Content &lt;/em&gt;e &lt;em&gt;Algorithm &lt;/em&gt;indicano rispettivamente il testo da cifrare e l’algoritmo da utilizzare. Quest’ultimo inoltre permette di specificare anche la lunghezza della chiave. Tuttavia se il tipo di algoritmo o la lunghezza della chiave non è fornito dal CSP in uso, CAPICOM cerca nei restanti CSP Microsoft la disponibilità del servizio. Sulla documentazione MSDN trovate l’ordine di ricerca che CAPICOM effettua in questo caso.  &lt;p&gt;I tre metodi, &lt;em&gt;SetSecret&lt;/em&gt;, &lt;em&gt;Encrypt &lt;/em&gt;e &lt;em&gt;Decrypt &lt;/em&gt;permettono rispettivamente di impostare la password, cifrare e decifrare.  &lt;p&gt;Il seguente esempio rappresenta il minimo codice per cifrare con l’algoritmo AES.  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Dim enc As New CAPICOM.EncryptedData  &lt;p&gt;Dim cipher As String  &lt;p&gt;Dim secret as String  &lt;p&gt;secret = “:P@assword@01#"  &lt;p&gt;//ENCRYPTION  &lt;p&gt;enc.Content = “WoW…This is a secret!!!!"  &lt;p&gt;enc.Algorithm = CAPICOM_ENCRYPTION_ALGORITHM_AES  &lt;p&gt;enc.SetSecret (secret)  &lt;p&gt;cipher = enc.Encrypt(CAPICOM_ENCODE_BASE64)  &lt;p&gt;//a questo punto cipher contiene il secret cifrato ed encodato in BASE64  &lt;p&gt;//DECRYPTION  &lt;p&gt;Dim plaintext As String  &lt;p&gt;Dim dec As New CAPICOM.EncryptedData  &lt;p&gt;dec.Algorithm = CAPICOM_ENCRYPTION_ALGORITHM_AES  &lt;p&gt;dec.SetSecret (secret)  &lt;p&gt;dec.Decrypt (cipher)  &lt;p&gt;plaintext = dec.Content  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Quindi, tramite l’interfaccia &lt;em&gt;IEncryptedData&lt;/em&gt;, è possibile che &lt;i&gt;n &lt;/i&gt;persone siano in grado di cifrare e decifrare i loro documenti con il solo vincolo di essere a conoscenza della chiave di sessione (shared secret appunto). Non sempre questa condizione può essere accettabile, soprattutto quando si rende necessario inviare la chiave di sessione tramite una infrastruttura non sicura come ad esempio Internet. La distribuzione delle chiavi in crittografia è sempre stato uno dei più grossi problemi da affrontare. &lt;/p&gt; &lt;p&gt;Prima di passare a IEnvelopedData facciamo un altro esempio:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/CAPICOMEncryption_F1B7/image_2.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="416" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/CAPICOMEncryption_F1B7/image_thumb.png" width="395" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Una volta premuto il tasto Encrypt si ottiene il seguente output:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;MIGUBgkrBgEEAYI3WAOggYYwgYMGCisGAQQBgjdYAwGgdTBzAgMCAAECAmYCAgIA&lt;br&gt;gAQIRSuTnPybKWEEEDko8rnajaH9lHfFe4s8IvgESDkTa5RySG7MX4SXPI9KU1vk&lt;br&gt;xMG08Ne3tm7ziGYoL4PVaKruDNRUKz5ccRZrRKvlpwrl59L/ZwBVLYHfxfkhjae1&lt;br&gt;Oj3uY3zk2g==&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;che rappresenta il testo cifrato encodato in BASE64.&lt;/p&gt; &lt;p&gt;Come vedete il codice JScript per queste operazioni è molto semplice.&lt;/p&gt; &lt;p&gt;function btnEncryptData_onclick()&lt;br&gt; {&lt;br&gt;&lt;span style="color: rgb(0,128,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // only attempt to has if data has been supploed&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (txtPlainText.value != &lt;span style="color: rgb(163,21,21)"&gt;""&lt;/span&gt; &amp;amp; pwdSecret.value != &lt;span style="color: rgb(163,21,21)"&gt;""&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// instantiate the CAPICOM objects&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var EncryptedData = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; ActiveXObject(&lt;span style="color: rgb(163,21,21)"&gt;"CAPICOM.EncryptedData"&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// clear the cipher text&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtCipherText.value = &lt;span style="color: rgb(163,21,21)"&gt;""&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// Setup the Algorithm object based off of the users choice&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncryptedData.Algorithm.KeyLength = rdoKeyLength.value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncryptedData.Algorithm.Name = rdoAlgorithm.value;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// Set the secret to be used when deriving the key&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncryptedData.SetSecret(pwdSecret.value,CAPICOM_SECRET_PASSWORD);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// Provide the Encrypted Data object with the text to encrypt&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncryptedData.Content = txtPlainText.value;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// Encrypt the data and return it in Base64 to the txtCipherText object&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;try&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtCipherText.value = EncryptedData.Encrypt(CAPICOM_ENCODE_BASE64);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;catch&lt;/span&gt; (e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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;&amp;nbsp; alert(e.description);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// clear the plain text&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtPlainText.value = &lt;span style="color: rgb(163,21,21)"&gt;""&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// clean up&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncryptedData = &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;mentre la funzione di Decrypt :&lt;/p&gt; &lt;p&gt;function btnDecryptData_onclick()&lt;br&gt;{&lt;br&gt;&lt;span style="color: rgb(0,128,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // only attempt to has if data has been supploed&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (txtCipherText.value != &lt;span style="color: rgb(163,21,21)"&gt;""&lt;/span&gt; &amp;amp; pwdSecret.value != &lt;span style="color: rgb(163,21,21)"&gt;""&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// instantiate the CAPICOM objects&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var EncryptedData = &lt;span style="color: rgb(0,0,255)"&gt;new&lt;/span&gt; ActiveXObject(&lt;span style="color: rgb(163,21,21)"&gt;"CAPICOM.EncryptedData"&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// clear the cipher text&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtPlainText.value = &lt;span style="color: rgb(163,21,21)"&gt;""&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// The EncryptedData object stores the encryption algorith and key length&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// allong with the CipherText so that the all the relying party needs to know&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// is the password that was used to derive the secret key.&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// Set the secret to be used when deriving the secret key&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncryptedData.SetSecret(pwdSecret.value,CAPICOM_SECRET_PASSWORD);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// dencrypt the data in the txtCipherText field&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;try&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncryptedData.Decrypt(txtCipherText.value);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;catch&lt;/span&gt; (e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(e.description);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// set the data to the txtPlainText field&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtPlainText.value = EncryptedData.Content;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// clear the cipher text&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtCipherText.value = &lt;span style="color: rgb(163,21,21)"&gt;""&lt;/span&gt;;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// clean up&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EncryptedData = &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&lt;/p&gt; &lt;p&gt;Può risultare utile la funzione JScript per determinare se CAPICOM è installato in locale:&lt;/p&gt; &lt;p&gt;function IsCAPICOMInstalled()&lt;br&gt;{&lt;br&gt;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;typeof&lt;/span&gt;(oCAPICOM) == &lt;span style="color: rgb(163,21,21)"&gt;"object"&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;( (oCAPICOM.&lt;span style="color: rgb(0,0,255)"&gt;object&lt;/span&gt; != &lt;span style="color: rgb(0,0,255)"&gt;null&lt;/span&gt;) )&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// We found CAPICOM!&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; &lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&lt;/p&gt; &lt;p&gt;Come diceva un mio amico : Semplice ma funzionale :-)&lt;/p&gt; &lt;p&gt;&lt;font face="Trebuchet MS"&gt;In un prossimo post parlerò di un problemino di compatibilità con il resto del mondo di &lt;em&gt;IEncryptedData &lt;/em&gt;e ovviamente come risolverlo!!&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; &lt;h2&gt;IEnvelopedData&lt;/h2&gt; &lt;p&gt;Il secondo metodo di cifratura esposto da &lt;em&gt;IEnvelopedData &lt;/em&gt;combina la cifratura simmetrica con quella asimmetrica. Innanzitutto CAPICOM internamente genera una session key con la quale cifra il documento &lt;strong&gt;(1)&lt;/strong&gt;. La session key viene a sua volta cifrata con la chiave pubblica presente nel certificato di uno o più destinatari (2) ed infine il pacchetto PKCS#7 risultante contiene il documento cifrato e uno copia della chiave di sessione cifrata per ogni destinatario &lt;strong&gt;(3) &lt;/strong&gt;rendendo di fatto sicuro l’invio della chiave e del documento tramite qualsiasi infrastruttura. A questo punto per il destinatario del documento è semplice decodificare il messaggio: deve decriptare la session key con la propria chiave privata e successivamente può riottenere il documento in chiaro.  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/CAPICOMEncryption_F1B7/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="394" alt="image" src="http://blogs.msdn.com/blogfiles/mariofontana/WindowsLiveWriter/CAPICOMEncryption_F1B7/image_thumb_2.png" width="492" border="0"&gt;&lt;/a&gt;  &lt;p&gt;&amp;nbsp; &lt;p&gt;Con CAPICOM&amp;nbsp; non è necessario preoccuparsi dei dettagli crittografici in quanto l’interfaccia &lt;em&gt;IEnvelopedData &lt;/em&gt;espone tre proprietà : &lt;i&gt;Content&lt;/i&gt;, &lt;i&gt;Algorithm&lt;/i&gt; e &lt;i&gt;Recipients.&lt;/i&gt; Analogamente all’interfaccia &lt;em&gt;IEncryptedData &lt;/em&gt;la proprietà &lt;em&gt;Content &lt;/em&gt;indica il testo in chiaro che dovrà essere inviato, mentre A&lt;i&gt;lgorithm&lt;/i&gt; rappresenta l’algoritmo di encryption. &lt;i&gt;Recipients &lt;/i&gt;è una collection di destinatari identificati tramite il loro certificato. I metodi &lt;i&gt;Encrypt&lt;/i&gt; e &lt;i&gt;Decrypt&lt;/i&gt; sono autoesplicativi. Il contenuto del messaggio da inviare contiene le seguenti informazioni: le chiavi di sessione cifrate, il messaggio criptato e i certificati di tutti i destinatari.  &lt;p&gt;Sebbene nella documentazione non sia espressamente dichiarato, il formato del file generato da &lt;em&gt;IEnvelopedData &lt;/em&gt;è lo standard PKCS#7.  &lt;p&gt;La modalità di verifica dell’interfaccia &lt;em&gt;IEnvelopedData &lt;/em&gt;avviene tramite il metodo &lt;em&gt;Decrypt &lt;/em&gt;il quale verifica che nello store &lt;em&gt;MY &lt;/em&gt;dei certificati installati localmente sia presente un certificato contenuto nel messaggio. In questo contesto è opportuno precisare che &lt;em&gt;IEnvelopedData &lt;/em&gt;non è il formato S/MIME e che è necessario scrivere del codice custom che estende le funzioni di CAPICOM con i requirements della specifica S/MIME.  &lt;p&gt;&amp;nbsp; &lt;p&gt;--Mario  &lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7689254" 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></item><item><title>Certificati, Store e un po' di utilities via CryptoAPI</title><link>http://blogs.msdn.com/mariofontana/archive/2008/02/06/un-po-di-esempi-via-cryptoapi.aspx</link><pubDate>Wed, 06 Feb 2008 12:38:53 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7487620</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/7487620.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=7487620</wfw:commentRss><description>&lt;p&gt;Oggi ho dovuto riesumare i ricordi sulle &lt;em&gt;CryptoAPI&lt;/em&gt; e &lt;em&gt;C SDK&lt;/em&gt;. Ecco un po' di codice per la gestione dei certificati X509, i certificate store, i key containers e un po' di utilities che possono risultare utili :-)&lt;/p&gt; &lt;p&gt;Attenzione, se riutilizzate il codice verificate che si integri con il vostro sistema di Exception Management!!&lt;/p&gt; &lt;h2&gt;Certificati&lt;/h2&gt; &lt;p&gt;/**************************************************************************&lt;/p&gt; &lt;p&gt;* Function: void CSpy_DumpExtraCertInfo(PCCERT_CONTEXT pcert)&lt;/p&gt; &lt;p&gt;*&lt;/p&gt; &lt;p&gt;* Purpose :&amp;nbsp; Print additional Certificate information&lt;/p&gt; &lt;p&gt;**************************************************************************/&lt;/p&gt;&lt;br&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; CSpy_DumpExtraCertInfo(PCCERT_CONTEXT pcert)&lt;/p&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR szName[1000];&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PCCERT_CONTEXT pCurrentCert;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PCCERT_CONTEXT pIssuerCert;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD dwVerificationFlags;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPWSTR lpszString = (LPWSTR)malloc(&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR) * MAX_PATH);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SYSTEMTIME stNotBefore,stNotAfter;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp; dwBitLen;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp; dwData;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PBYTE pThumbprint;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PBYTE pData;&lt;/p&gt;&lt;br&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;__try&lt;/span&gt;{&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// display leaf name&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!CertNameToStr(pcert-&amp;gt;dwCertEncodingType,&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;Subject,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szName, (DWORD)&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR)*(_tcslen(szName)+1)))&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x building subject name\n"&lt;/span&gt;, GetLastError());&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; subject: %s\n"&lt;/span&gt;, szName);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!CertNameToStr(pcert-&amp;gt;dwCertEncodingType,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;Issuer,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szName, (DWORD)&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR)*(_tcslen(szName)+1)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x building issuer name\n"&lt;/span&gt;, GetLastError());&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; issuer: %s\n"&lt;/span&gt;, szName);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; serial number: "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwData = pcert-&amp;gt;pCertInfo-&amp;gt;SerialNumber.cbData;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;for&lt;/span&gt; (DWORD n = 0; n &amp;lt; dwData; n++)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%02X"&lt;/span&gt;,pcert-&amp;gt;pCertInfo-&amp;gt;SerialNumber.pbData[dwData - (n + 1)]);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;( n&amp;gt;0&amp;amp;&amp;amp;(1== n % 2))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileTimeToSystemTime(&amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;NotBefore, &amp;amp;stNotBefore);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wsprintf(lpszString, L&lt;span style="color: rgb(163,21,21)"&gt;"%02d/%02d/%d"&lt;/span&gt;,stNotBefore.wDay, stNotBefore.wMonth, stNotBefore.wYear);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; NotBefore : %s\n"&lt;/span&gt;,lpszString);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FileTimeToSystemTime(&amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;NotAfter, &amp;amp;stNotAfter);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; wsprintf(lpszString, L&lt;span style="color: rgb(163,21,21)"&gt;"%02d/%02d/%d"&lt;/span&gt;,stNotAfter.wDay, stNotAfter.wMonth, stNotAfter.wYear);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; NotAfter : %s\n"&lt;/span&gt;,lpszString);&lt;/p&gt;&amp;nbsp; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;//Thumbprint&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; Thumbprint : "&lt;/span&gt;);&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (!CertGetCertificateContextProperty(pcert, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_SHA1_HASH_PROP_ID, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwData))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"Error : CertGetCertificateContextProperty() failed in retrieve memory settings.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (NULL == (pThumbprint = (BYTE*) malloc(dwData)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"Error [E_OUTOFMEMORY]: malloc() failed.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (!CertGetCertificateContextProperty(pcert, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_SHA1_HASH_PROP_ID, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pThumbprint, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwData))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"Error : CertGetCertificateContextProperty() failed.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;for&lt;/span&gt; (DWORD n = 0; n &amp;lt; dwData; n++)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%02X"&lt;/span&gt;,pThumbprint[n]);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;( n&amp;gt;0&amp;amp;&amp;amp;(1== n % 2))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(pThumbprint);&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;//UI description&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CertGetCertificateContextProperty(pcert, &lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_DESCRIPTION_PROP_ID, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwData))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (NULL == (pData = (BYTE*) malloc(dwData)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"Error [E_OUTOFMEMORY]: malloc() failed.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CertGetCertificateContextProperty(pcert, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_DESCRIPTION_PROP_ID, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pData, &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwData))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; Description=%s\n"&lt;/span&gt;,pData);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(pData);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color: rgb(0,128,0)"&gt;//end od UI&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DumpCertificateExtensions(pcert);&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;//Public Key Infos&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; Public Key :\n"&lt;/span&gt;);&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (0 != (dwBitLen = CertGetPublicKeyLength(&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MY_ENCODING_TYPE,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp; length=%i\n"&lt;/span&gt;, dwBitLen);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x in CertGetPublicKeyLength\n"&lt;/span&gt;, GetLastError());&lt;/p&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp; Algorithm ID= "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//TODO: Add a new function to decode CRYPT_ALGORITHM_IDENTIFIER&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; counter=0;&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo.Algorithm.pszObjId[counter] != &lt;span style="color: rgb(163,21,21)"&gt;'\0'&lt;/span&gt;)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%c"&lt;/span&gt;,pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo.Algorithm.pszObjId[counter++]);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp; Key="&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwData = pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo.PublicKey.cbData;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;for&lt;/span&gt; (DWORD n = 0; n &amp;lt; dwData; n++)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%02X"&lt;/span&gt;,pcert-&amp;gt;pCertInfo-&amp;gt;SubjectPublicKeyInfo.PublicKey.pbData[n]);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;( n&amp;gt;0&amp;amp;&amp;amp;(1== n % 2))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" "&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//_tprintf(L"&amp;nbsp; Private Key : %s",(CSpy_CertificateHasPrivateKey(pcert))?L"Present":L"Not present");&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; Private Key : "&lt;/span&gt;);&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CSpy_CertificateHasPrivateKey(pcert))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"YES\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DumpCSPInfos(pcert);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"NO\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;// display certificate chain&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCurrentCert = pcert;&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(pCurrentCert != NULL)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwVerificationFlags = 0;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pIssuerCert = CertGetIssuerCertificateFromStore(pcert-&amp;gt;hCertStore,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCurrentCert,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwVerificationFlags);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(pIssuerCert == NULL)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(pCurrentCert != pcert)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CertFreeCertificateContext(pCurrentCert);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;break&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!CertNameToStr(pIssuerCert-&amp;gt;dwCertEncodingType,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pIssuerCert-&amp;gt;pCertInfo-&amp;gt;Subject,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szName, (DWORD)&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR)*(_tcslen(szName)+1)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x building subject name\n"&lt;/span&gt;, GetLastError());&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; CA subject: %s\n"&lt;/span&gt;, szName);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!CertNameToStr(pIssuerCert-&amp;gt;dwCertEncodingType,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;pIssuerCert-&amp;gt;pCertInfo-&amp;gt;Issuer,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; szName, (DWORD)&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR)*(_tcslen(szName)+1)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"**** Error 0x%x building issuer name\n"&lt;/span&gt;, GetLastError());&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; CA issuer: %s\n\n"&lt;/span&gt;, szName);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(pCurrentCert != pcert)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CertFreeCertificateContext(pCurrentCert);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCurrentCert = pIssuerCert;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pIssuerCert = NULL;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color: rgb(0,128,0)"&gt;//end__try&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__finally&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;}&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;br&gt;* Function: bool CSpy_CertificateHasPrivateKey(PCCERT_CONTEXT pcert)&lt;br&gt;*&lt;br&gt;* Purpose :&amp;nbsp; Test if a certificate has the private key&lt;br&gt;**************************************************************************/&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;bool&lt;/span&gt; CSpy_CertificateHasPrivateKey(PCCERT_CONTEXT pcert)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD cb = 0;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; CertGetCertificateContextProperty(pcert, &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_KEY_PROV_INFO_PROP_ID, &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL, &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;cb)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; !=0; &lt;span style="color: rgb(0,128,0)"&gt;//to avoid Compiler warning (level 3) C4800&lt;br&gt;&lt;/span&gt;}&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;br&gt;* Function: UINT CSpy_DumpCertificateExtensions(PCCERT_CONTEXT pCertContext)&lt;br&gt;*&lt;br&gt;* Purpose :&amp;nbsp; Display cert extensions. Return number of extensions&lt;br&gt;**************************************************************************/&lt;br&gt;&lt;br&gt;&lt;/span&gt;UINT CSpy_DumpCertificateExtensions(PCCERT_CONTEXT pCertContext)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp; N. Ext. : %d\n"&lt;/span&gt;,pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension&amp;gt;0)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;for&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; x =0; x &amp;lt;(&lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt;)pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension;x++)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp; Critical=%s&amp;nbsp; "&lt;/span&gt;,(pCertContext-&amp;gt;pCertInfo-&amp;gt;rgExtension-&amp;gt;fCritical)? L&lt;span style="color: rgb(163,21,21)"&gt;"Yes"&lt;/span&gt;:L&lt;span style="color: rgb(163,21,21)"&gt;"NO"&lt;/span&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; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" OID="&lt;/span&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; &lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; n=0;&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; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(pCertContext-&amp;gt;pCertInfo-&amp;gt;rgExtension-&amp;gt;pszObjId[n]!=&lt;span style="color: rgb(163,21,21)"&gt;'\0'&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"%c"&lt;/span&gt;,(TCHAR)pCertContext-&amp;gt;pCertInfo-&amp;gt;rgExtension-&amp;gt;pszObjId[n++]);&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; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n"&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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; pCertContext-&amp;gt;pCertInfo-&amp;gt;rgExtension++;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;span style="color: rgb(0,128,0)"&gt;//endfor(int x =0; x &amp;lt;pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension;x++)&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color: rgb(0,128,0)"&gt;//endif (pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension&amp;gt;0)&lt;br&gt;&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; pCertContext-&amp;gt;pCertInfo-&amp;gt;cExtension;&lt;br&gt;}&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;h2&gt;Certificate Store&lt;/h2&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;* Function: void CSpy_DumpStore(TCHAR *storeName)&lt;/p&gt; &lt;p&gt;*&lt;/p&gt; &lt;p&gt;* Purpose :&amp;nbsp; Open a list all certificate in a store&lt;/p&gt; &lt;p&gt;**************************************************************************/&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; CSpy_DumpStore(TCHAR *storeName)&lt;/p&gt;&lt;/span&gt; &lt;p&gt;{&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; HCERTSTORE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hCertStore;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PCCERT_CONTEXT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCertContext = NULL;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwFlags=0;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dwStrType = CERT_OID_NAME_STR;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cbNameLen;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *sz;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;long&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nCerts=0;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (_tcsclen(storeName) &amp;gt; MAX_PATH )&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; storeName[MAX_PATH] = &lt;span style="color: rgb(163,21,21)"&gt;'\0'&lt;/span&gt;;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\nDumping '%s' Store.....\n"&lt;/span&gt;,storeName);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//--------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Begin Processing by opening a certificate store.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!(hCertStore=CertOpenStore(&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_STORE_PROV_SYSTEM,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MY_ENCODING_TYPE,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CERT_SYSTEM_STORE_CURRENT_USER|CERT_STORE_OPEN_EXISTING_FLAG ,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; storeName)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError(L&lt;span style="color: rgb(163,21,21)"&gt;"The store did not open."&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;(pCertContext = CertEnumCertificatesInStore(&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hCertStore,&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCertContext))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//--------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get and display&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the name of subject of the certificate.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!(cbNameLen = CertGetNameString(pCertContext,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,NULL,NULL,0)))&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError(L&lt;span style="color: rgb(163,21,21)"&gt;"CertGetName 1 failed."&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(!(sz = (TCHAR*) malloc(&lt;span style="color: rgb(0,0,255)"&gt;sizeof&lt;/span&gt;(TCHAR) *cbNameLen+1)))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError(L&lt;span style="color: rgb(163,21,21)"&gt;"Memory allocation failed."&lt;/span&gt;);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CertGetNameString(pCertContext,CERT_NAME_SIMPLE_DISPLAY_TYPE,0,NULL,(LPWSTR)sz,cbNameLen+1))&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\nCertificate n. %d Version=V%d :(%s)."&lt;/span&gt;,nCerts+1,pCertContext-&amp;gt;pCertInfo-&amp;gt;dwVersion+1,sz);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DisplayError(L&lt;span style="color: rgb(163,21,21)"&gt;"CertGetName failed."&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(sz);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSpy_DumpExtraCertInfo(pCertContext);&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nCerts++;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;span style="color: rgb(0,128,0)"&gt;// End of while loop&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n=&amp;gt;Total : %s store contains %d certificates"&lt;/span&gt;,storeName,nCerts);&amp;nbsp; &lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//--------------------------------------------------------------------&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//&amp;nbsp;&amp;nbsp; Close the store.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="color: rgb(0,128,0)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(CertCloseStore(hCertStore,CERT_CLOSE_STORE_CHECK_FLAG))&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt; == g_bverbose)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"The store is closed. All certificates are released.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;else&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0,0,255)"&gt; &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;/span&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;true&lt;/span&gt; == g_bverbose)&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"The store was closed, but certificates still in use.\n"&lt;/span&gt;);&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt; &lt;p&gt;}&lt;/p&gt;&lt;pre class="code"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;h2&gt;Key Containers&lt;/h2&gt;
&lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;br&gt;* Function: DWORD CSpy_DeleteKeyContainer(PCCERT_CONTEXT pCertContext)&lt;br&gt;*&lt;br&gt;* Purpose :&amp;nbsp; &lt;br&gt;**************************************************************************/&lt;br&gt;&lt;br&gt;&lt;/span&gt;DWORD CSpy_DeleteKeyContainer(PCCERT_CONTEXT pCertContext)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD nRetCode = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD cb = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRYPT_KEY_PROV_INFO * pKeyProvInfo = NULL;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__try&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HCRYPTPROV hCryptProv;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (!CryptAcquireContext(&amp;amp;hCryptProv, &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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pKeyProvInfo-&amp;gt;pwszContainerName,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pKeyProvInfo-&amp;gt;pwszProvName,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pKeyProvInfo-&amp;gt;dwProvType,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRYPT_DELETEKEYSET))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; CSpy_DisplayError (L&lt;span style="color: rgb(163,21,21)"&gt;"Unable to Delete the context."&lt;/span&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; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;" %s "&lt;/span&gt;,pKeyProvInfo-&amp;gt;pwszContainerName);&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; &lt;span style="color: rgb(0,0,255)"&gt;__leave&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__finally&lt;br&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; (pKeyProvInfo)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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; free(pKeyProvInfo);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;return&lt;/span&gt; nRetCode;&lt;br&gt;&lt;br&gt;}&lt;/p&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Utilities&lt;/h2&gt;
&lt;p&gt;&lt;span style="color: rgb(0,128,0)"&gt;/**************************************************************************&lt;br&gt;* Function: VOID DumpBinaryData( PBYTE pBuffer, ULONG uLen )&lt;br&gt;*&lt;br&gt;* Purpose :&amp;nbsp; DumpBinaryData()&lt;br&gt;**************************************************************************/&lt;br&gt;&lt;/span&gt;VOID CSpy_DumpBinaryData( PBYTE pBuffer, ULONG uLen )&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR&amp;nbsp; *p = (TCHAR *)pBuffer;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TCHAR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD&amp;nbsp;&amp;nbsp;&amp;nbsp; dw;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; UINT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = 0;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"{\n&amp;nbsp; "&lt;/span&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;while&lt;/span&gt;( i &amp;lt; uLen ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c = *p;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dw = (DWORD)(c);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"0x%02X, "&lt;/span&gt;, dw &amp;amp; 0xFF );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p++;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;if&lt;/span&gt; ((i % 8) == 0)&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; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n&amp;nbsp; "&lt;/span&gt; );&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _tprintf(L&lt;span style="color: rgb(163,21,21)"&gt;"\n}\n"&lt;/span&gt; );&lt;br&gt;}&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;--Mario&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7487620" 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/CryptoAPI/default.aspx">CryptoAPI</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>Due parole sulla sicurezza degli algoritmi crittografici.</title><link>http://blogs.msdn.com/mariofontana/archive/2008/02/04/due-parole-sulla-sicurezza-degli-algoritmi-crittografici.aspx</link><pubDate>Mon, 04 Feb 2008 03:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7357852</guid><dc:creator>mfontana</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mariofontana/comments/7357852.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mariofontana/commentrss.aspx?PostID=7357852</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;Questo è&amp;nbsp;un micro sunto da ricordare quando si progetta un nuovo software oppure quando si valutano degli applicativi sviluppati da terzi.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;La robustezza di un sistema di cifratura a chiave simmetrica è dovuto a due fattori : la robustezza dell'algoritmo e la lunghezza delle chiavi. La robustezza di un algoritmo non è provato in modo analitico ma, al contrario, è dato dalla non violabilità dell'algoritmo stesso per molti anni da parte della comunità di cryptoanalisti.A questa regola esiste però una sola eccezione : One-time pad. Questa tecnica prevede che la chiave utilizzata sia lunga quanto il plain text, che sia un numero random e infine tale chiave deve essere utilizzata solo una volta. Se la chiave generata non è veramente random anche questa tecnica può essere violata come avvenne per il progetto VENONA dove gli Stati Uniti furono in grado, per decenni, di decifrare vari messaggi spia sovietici perchè durante la seconda guerra mondiale i Sovietici inziarono ad riutilizzare le stesse chiavi.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;Gli algoritmi a chiave simmetrica si dividono in 2 grandi famigli : Stream Cipher e Block Cipher. Gli algoritmi Stream Chiper, usati principalmente nelle telecomunicazioni., cifrano carattere per carattere di un plain text rendendo più veloci e meno complessi da realizzare con hardware. I Block cipher invece cifrano a blocchi il plain text. La lunghezza delle chiavi è importante perchè se l’algoritmo di cifratura è "sicuro" un attacker generalmente deve utilizzare il brute force attack per risalire al plain text.Al contrario se l'algoritmo non è sicuro è possibile che alcune proprietà matematiche possano essere esposte e quindi utilizzate per violare il codice nonostante la chiave simmetrica sia molto grande. Questa infelice situazione capita spesso quando si cerca di modificare un algoritmo standard “per renderlo più sicuro”.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;Se una chiave simmetrica è lunga &lt;I&gt;k&lt;/I&gt; bits allora il numero totale di combinazioni è dato da 2^&lt;I&gt;k&lt;/I&gt;. Quindi maggiore è la chiave maggiore è il numero di combinazioni. Per &lt;I&gt;k&lt;/I&gt; = 40 il numero di chiavi è pari a 2^40. Il tempo di break per un codice codificato con una chiave di queste dimensioni è di poche ore per un centinaio di computer in rete. Per &lt;I&gt;k &lt;/I&gt;= 56, utilizzato dall’algoritmo DES, il tempo di break era di qualche mese. Già da qualche anno è stato reso noto che la Electronic Frontier Foundation&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Arial','sans-serif'"&gt; ha realizzato &lt;/SPAN&gt;una macchina specializzata nella ricerca di chiavi crittografiche DES riuscendo a violare la&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;cifratura in soli 3 giorni. Infine per &lt;I&gt;k&lt;/I&gt; = 128 il tempo di break per un codice codificato con una chiava di queste dimensioni è di 2^128 = Circa 10^25 anni (l'universo ha 10^10 anni).&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;Anche la natura dei dati potrebbe rappresentare un punto di vulnerabilità nel nostro sistema di crittografia. Molti plaintext, ad esempio, iniziano con gli stessi dati: le lettere commerciali, gli header dei files di word o di un eseguibile. Un caso a parte, invece, lo occupano i numeri di carta di credito che introducono due punti deboli. Il primo causato dalla conoscenza delle iniziali di questi numeri : tutte le carte VISA iniziano con 4, Mastercard con numeri da 51 a 55 e Amex da 34 a 37. Il secondo punto debole, invece,&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;è dovuto alla lunghezza fissa e alla relazione matematica che lega tali numeri (modulo10)&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;Per risolvere questa serie di problemi sono stati introdotti gli "Initialization Vectors". Gli IV (generalmente utilizzati in concomitanza con i block cipher in CBC mode) sono un blocco di bits random che viene aggiunto all'inizio del plaintext prima dell'encryption. Questo permette di propagare e di mascherare tutte le regolarità del ciphertext. Le CryptoAPI, le classi del framework .NET e CAPICOM, si occupano di gestire internamente gli IV.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;Specificando “high encryption” si indica la dimensione delle chiavi simmetriche a 128 bits. Viceversa, quando si indicano le chiavi asimmetriche per encryption o firma digitale la lunghezza delle chiavi è maggiore (512-1024-2048 bits o supp). Generalmente algoritmi a chiave pubblica/privata devono utilizzare chiavi a lunghezza superiore rispetto a quelle usate negli algoritmi a chiave simmetrica per ottenere lo stesso grado di sicurezza. &lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;B&gt;BASTA CON QUESTO DES!!!!&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;&lt;B&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;DES è un algoritmo di tipo "block cipher" e cifra a blocchi di 64bits. La chiave è di 56 bits ma viene espressa a 64bits utilizzando ogni ottavo bit come parity checking.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;Semplificando, l'algoritmo utilizza due tecniche base per l'encryption chiamati : &lt;I&gt;confusion&lt;/I&gt; e &lt;I&gt;diffusion&lt;/I&gt;;ovvero una sostituzione seguita da una permutazione (chiamato round). DES ha 16 rounds ovvero applica la stessa combinazione di tecniche sul plaintext 16 volte. Dopo la prima permutazione il blocco è diviso in due parti da 32bits (parte destra e sinistra). In seguito avvengono 16 rounds in cui i dati vengono combinati con la chiave. Dopo il 16 round la parte destra e la parte sinistra vengono riunite e dopo l'ultima permutazione (che è l'inverso di quella iniziale) si ha il risulatato dell'algoritmo.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;DES è stato "matematicamente" ideato dalla NSA e successivamente implementato da IBM nel 1976. Da 20 anni a questa parte è stato ipotizzato che l'algoritmo contenesse delle "back doors" che permettessero a NSA di decifrare facilmente i dati cifrati con DES. Pur non avendo mai dimostrato la presenza di tali back- door&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;nell’ algoritmo fu ideato TRIPLE-DES che matematicamente non offre alcuna sicurezza aggiuntiva rispetto a DES, ma quantomeno dovrebbe eliminare eventuali back-doors. &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;Quando usare DES? Solo quando c'è necessità di garantire la compatibilità con vecchi sistemi. In tutti gli altri casi... &lt;STRONG&gt;BASTA DES &lt;/STRONG&gt;!!! Al contrario il successore di DES è il nuovo algoritmo Rijndael (ideato da Joan Deamen e Vincent Rijmen) chiamato anche AES (Advanced Encryption Standard) algoritmo a chiave variabile di 128,192 o 256 bits.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&lt;STRONG&gt;Raccomandazioni se non si&amp;nbsp;può&amp;nbsp;progettare per WIndows Server 2008 e Windows Vista come baseline:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;Encryption : Uso di AES-128 o superiore.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;Firma Digitale : RSA con chiavi a 2048 o superiori.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;Hashing : SHA-256 o SHA-512. Se poi avete solo 160 bit a disposizione è preferibile utilizzare SHA-256 e prelevare i primi 160 bits rispetto all'uso di SHA1.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt" mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;--Mario&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7357852" 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></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></channel></rss>