<?xml version="1.0" encoding="Windows-1252"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Il lato oscuro - Il blog di Alessandro Catorcini</title><link>http://blogs.aspitalia.com/ale/</link><description>Il lato oscuro - Il blog di Alessandro Catorcini</description><language>it-it</language><managingEditor>noreply(at)aspitalia.com(Il lato oscuro - Il blog di Alessandro Catorcini)</managingEditor><webMaster>daniele(at)aspitalia.com(Daniele Bochicchio)</webMaster><copyright>1998-2008 ASPItalia.com/Il lato oscuro - Il blog di Alessandro Catorcini</copyright><generator>Generated by feed.ASPItalia.com 'Weyoh' 4.8.818</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><image><title>Il lato oscuro - Il blog di Alessandro Catorcini</title><url>http://blogs.aspitalia.com/blogs.gif</url><link>http://blogs.aspitalia.com/ale/</link></image><item><title>Trovare il Page not Found...</title><link>http://blogs.aspitalia.com/ale/post2294/Trovare-Page-Not-Found.aspx</link><pubDate>Wed, 04 Jun 2008 04:28:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2294' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Alzi la mano chi non detesta la classica pagina di errore per un HTTP 404 - Page not Found.&lt;/p&gt;&lt;p&gt;La ragione più comune che ho sentito per questa reazione poco entusiastica è che Il messaggio di errore medio passato all'utente è tipicamente inutile: la pagina di errore notifica che si è verificato un problema ma fa poco o niente per correggerlo o per proporre alternative. Si può fare di meglio.&lt;/p&gt;&lt;p&gt;L'ultimo tentativo in ordine di tempo di fare qualcosa per risolvere questo problema è il Web Page Error Toolkit che abbiamo rilasciato oggi.&lt;/p&gt;&lt;p&gt;E' una piccola applicazione, altamente customizzabile e rilasciata in Shared Source che consente di sostituire la pagina statica di errore con una pagina completamente controllata dal sito che la ospita che contiene i risultati di una query a Live Search. &lt;/p&gt;&lt;p&gt;Usarla, cambia la solita pagina di errore di IIS&lt;/p&gt;&lt;p&gt;&lt;img alt="Pagina di errore di default di IIS" hspace="0" src="http://ecrn1g.blu.livefilestore.com/y1p1mK3Vjy2zbZ39O5zSg08NBFKRfenPGWJWBJaaP7jRqTqOKLg1sHt3X72iW6_NQMfviPY_oxLRRl-a7U0det4ZA/IE404errormsg.gif" align="baseline" border="0" /&gt;&lt;/p&gt;&lt;p&gt;In una pagina molto più utile:&lt;/p&gt;&lt;p&gt;&lt;img alt="Pagina di errore usando il Web Page Error Toolkit" hspace="0" src="http://ecrn1g.blu.livefilestore.com/y1p1mK3Vjy2zbZCowcnkGk8xn3wT8kB9xZU25mjQ-f-Ii8DgiwZORc8qKxv7s2keaSISjwUTky639p6LlCn3vvxQg/Webpageerrortoolkit.gif" align="baseline" border="0" /&gt;&lt;/p&gt;&lt;p&gt;Dove cercare i risultati (quali domini), quanti risultati mostrare, che lingua utilizzare, se usare o no il correttore ortografico per suggerire alternative, quali messaggi mostrare, sono tutti parametri sotto il controllo totale del webmaster.&lt;/p&gt;&lt;p&gt;La query iniziale è settata da un oggetto che implementa IKeywordExtractor. Il toolkit ne contiene tre esempi, in cui il default usa il contenuto del tag &amp;lt;a&amp;gt; che mandava all'URL fallato. Per esempio, se una pagina conteneva il frammento&lt;/p&gt;&lt;p&gt;&amp;lt;a href=&amp;quot;linkRotto.html&amp;quot;&amp;gt;Esempio di pagina di errore intelligente&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Il keyword extractor di default usa come query iniziale &amp;quot;esempio di pagina di errore intelligente&amp;quot;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Per ora abbiamo rilasciato il codice in ASP.net 2.0 o superiore e IIS 5 o superiore. Presto usciranno le versioni in PHP e Java.&lt;/p&gt;&lt;p&gt; A presto&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_2.0/" rel="tag"&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_3.5/" rel="tag"&gt;ASP.NET 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/IIS/" rel="tag"&gt;IIS&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Server/" rel="tag"&gt;Windows Server&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>Misc, .NET Framework, .NET Framework 2.0, ASP.NET, ASP.NET 2.0, ASP.NET 3.5, IIS, Windows Server</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2294/Trovare-Page-Not-Found.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2294/Trovare-Page-Not-Found.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2294.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2294</trackback:ping></item><item><title>Come scrivere in ASP.net un controllo che usa Silverlight solo se &amp;#232; gi&amp;#224; sul client</title><link>http://blogs.aspitalia.com/ale/post2287/Scrivere-ASP.net-Controllo-Usa-Silverlight-Gia-Client.aspx</link><pubDate>Sat, 17 May 2008 08:56:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2287' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;L'introduzione di Silverlight ha aperto la porta a design per le UI prima completamente impensabili. Il problema è che non tutti hanno Silverlight, e non tutti vogliono o possono installarla per vedere la tua pagina.&lt;/p&gt;&lt;p&gt;Il problema che dovevo risolvere è &amp;quot;Come si fa a scrivere un controllo in ASP.net che sappia disegnarsi con Silverlight se è installata e abilitata ma che diventi caro vecchio HTML (magari con un po' di AJAX per essere alla moda) se non la trova.&lt;/p&gt;&lt;p&gt;La soluzione è talmente banale da non essere nemmeno divertente.&lt;/p&gt;&lt;p&gt;Tra i vari modi di chiamare Silverlight dentro il browser, il più prosaico è il caro, vecchio Object tag. &lt;/p&gt;&lt;p&gt;Ora, andando a spulciare tra le specifiche dell'HTML, si scopre che se un object tag contiene HTML, questo viene usato nel caso che ci sia un errore nell'istanziare l'oggetto, altrimenti viene ignorato.&lt;/p&gt;&lt;p&gt;Questo vuol dire che se si seguono i seguenti passi:&lt;/p&gt;&lt;p&gt;creare il file XAML o XBAP e aggiungerlo al progetto rinominandolo .slight (per esempio) e assicurarsi che questo file sia compilato come una risorsa dell'assebly del controllo. Questo fa si' che l'applicazione Silverlight sia distribuita insieme ai binari del custom control.&lt;/p&gt;&lt;p&gt;Nel metodo Render(ByVal writer As System.Web.UI.HtmlTextWriter) del controllo polimorfico, aggiungere&lt;/p&gt;&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;p&gt;With(writer)&lt;br /&gt;.AddAttribute(&amp;quot;ID&amp;quot;, &amp;quot;SilverlightPlugInID&amp;quot;)&lt;br /&gt;.AddAttribute(&amp;quot;Data&amp;quot;, &amp;quot;data:application/x-silverlight,&amp;quot;)&lt;br /&gt;.AddAttribute(&amp;quot;Type&amp;quot;, &amp;quot;application/x-silverlight&amp;quot;)&lt;br /&gt;.AddAttribute(&amp;quot;width&amp;quot;, &amp;quot;1000px&amp;quot;)&lt;br /&gt;.AddAttribute(&amp;quot;height&amp;quot;, &amp;quot;500px&amp;quot;)&lt;br /&gt;.RenderBeginTag(&amp;quot;object&amp;quot;)&lt;br /&gt;.AddAttribute(&amp;quot;name&amp;quot;, &amp;quot;source&amp;quot;)&lt;br /&gt;.AddAttribute(&amp;quot;value&amp;quot;, Page.ClientScript.GetWebResourceUrl(Me.GetType(), &amp;quot;NomeDelMioAssembly.NomeDelMioFileXAMLoXBAP.slight&amp;quot;))&lt;br /&gt;.RenderBeginTag(&amp;quot;param&amp;quot;)&lt;br /&gt;.RenderEndTag() 'param&lt;br /&gt;.AddAttribute(&amp;quot;name&amp;quot;, &amp;quot;onError&amp;quot;)&lt;br /&gt;.AddAttribute(&amp;quot;value&amp;quot;, &amp;quot;onErrorHandler&amp;quot;)&lt;br /&gt;.RenderBeginTag(&amp;quot;param&amp;quot;)&lt;br /&gt;.RenderEndTag() 'param&lt;br /&gt;.AddAttribute(&amp;quot;name&amp;quot;, &amp;quot;onResize&amp;quot;)&lt;br /&gt;.AddAttribute(&amp;quot;value&amp;quot;, &amp;quot;onResizeHandler&amp;quot;)&lt;br /&gt;.RenderBeginTag(&amp;quot;param&amp;quot;)&lt;br /&gt;.RenderEndTag() 'param&lt;/p&gt;&lt;p&gt;&amp;lt; Genera qui l'HTML downlevel &amp;gt; &lt;/p&gt;&lt;p&gt;.RenderEndTag() 'object&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;End With&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Se si usa Silverlight 1.0, lo script che costituisce l'applicazione Silverlight viene iniettato in uno script block. In questo caso, lo scambio dei dati tra ASP.net e Silverlight può avvenire scrivendo in un tag script gli oggetti JSON che saranno consumati dall'applicazione. &lt;/p&gt;&lt;p&gt;Se si usa Silverlight 2.0, si può scrivere una data island e usare l'HTML bridge.&lt;/p&gt;&lt;p&gt;Questa soluzione funziona con Internet Explorer 7 e 8 beta e con Firefox 2.0 e Safari su Windows.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>Misc, Silverlight, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2287/Scrivere-ASP.net-Controllo-Usa-Silverlight-Gia-Client.aspx</guid><slash:comments>0</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2287/Scrivere-ASP.net-Controllo-Usa-Silverlight-Gia-Client.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2287.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2287</trackback:ping></item><item><title>Legionari dell'Impero</title><link>http://blogs.aspitalia.com/ale/post2271/Legionari-Impero.aspx</link><pubDate>Sat, 19 Apr 2008 17:52:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2271' border="0" style="width:1px; height:1px;" /&gt;Ogni volta che interagisco con qualcuno dall'Italia, una delle domande che prima o poi arrivano è la classica &amp;quot;Ma come ci sei finito a Redmond?&amp;quot;, come se per essere qui dovessi avere tre gambe e due teste. Con questo post vorrei sfatare un mito e lanciare una piccola sfida. Lavorare in un product development team in Microsfot a Redmond non è fuori portata. Ma come per vincere alla lotteria, il primo passo è comprare il biglietto, per venire qui bisogna innanzitutto chiederlo. Sul sito di &lt;a href="http://www.microsoft.com/careers"&gt;Microsoft Careers&lt;/a&gt;  si possono vedere le migliaia di posizioni aperte in tutto il mondo. Quando lo feci io (nel secolo scorso ormai, il lontano 1999) il mio CV partì proprio dai form di questo sito. Soltanto nel mio gruppo (&lt;a href="http://www.live.com"&gt;Live Search&lt;/a&gt;) stiamo cercando &lt;a href="http://members.microsoft.com/careers/search/results.aspx?start=1&amp;amp;interval=89&amp;amp;AllCl=Y&amp;amp;SortCol=DatePosted&amp;amp;SortOrder=DEF"&gt;più di cento&lt;/a&gt; tra developer e developer in test. Siamo a caccia da mesi di developer per l'ottimizzazione della rilevanza per le pagine web in Italiano, che tra gli altri requisiti devono essere fluenti o madrelingua in Italiano. Se avete passione per la tecnologia e se siete disposti a venire fin qui per seguirla, provate. Nel caso abbiate domande, contattatemi direttamente (il mio email personale è {nome}@{cognome}.com dove a nome e cognome dovete sostituire i valori [:)] ) &lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>Misc</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2271/Legionari-Impero.aspx</guid><slash:comments>1</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2271/Legionari-Impero.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2271.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2271</trackback:ping></item><item><title>Pizza, topologia e web services</title><link>http://blogs.aspitalia.com/ale/post2269/Pizza-Topologia-Web-Services.aspx</link><pubDate>Thu, 17 Apr 2008 04:33:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2269' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Oggi sono finalmente riuscito a vedere di persona tutta la truppa di ASPItalia &amp;amp;c. qui sotto la pioggia di Seattle dopo quasi tre anni (dal lancio di VS 2005).&lt;/p&gt;&lt;p&gt;La più che dignitosa pizza di Guido, la cameriera dalla scollatura generosa ma discreta, le profonde discussioni tecnico-goliardiche su argomenti vari, dalla topologia alle strategie di typing e verioning sui Web Services hanno reso l'incontro strepitoso.&lt;/p&gt;&lt;p&gt;Arrivederci a presto&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Off_Topic/" rel="tag"&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>Misc, Off Topic</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2269/Pizza-Topologia-Web-Services.aspx</guid><slash:comments>4</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2269/Pizza-Topologia-Web-Services.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2269.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2269</trackback:ping></item><item><title>Autopsia di un'applicazione - Terza puntata: l'applicazione che si congela</title><link>http://blogs.aspitalia.com/ale/post2265/Autopsia-Applicazione-Terza-Puntata-Applicazione-Congela.aspx</link><pubDate>Tue, 08 Apr 2008 05:08:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2265' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Se diagnosticare perché un'applicazione si pianta non è sempre facile, diagnosticare perché un'applicazione si congela o va in un loop infinito non lo è praticamente mai. Ci sono due ragioni fondamentali per un application hang: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;un loop infinito&lt;/li&gt;&lt;li&gt;un deadlock&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;mentre individuare il primo è relativamente semplice se avviene nel vostro codice - basta attaccare un debugger, fare un break e leggere lo stack-trace, individuare un deadlock di solito richiede riti voodoo e interventi del mago di fiducia.&lt;/p&gt;&lt;p&gt;Se la fattucchiera non è disponibile, si possono usare altri tool più pratici nell'arsenale del managed developer.&lt;/p&gt;&lt;p&gt;Deadlock: cos'è? &lt;/p&gt;&lt;p&gt;Per avere un deadlock una serie di condizioni deve essere verificata allo stesso tempo: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;il processo ha più di un thread&lt;/li&gt;&lt;li&gt;tutti i thread possono accedere a tutte le risorse&lt;/li&gt;&lt;li&gt;le risorse possono essere acquisite da un solo thread alla volta&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Il deadlock avviene quando un thread A prende possesso della risorsa 1 (per esempio un socket handle di rete), mentre il thread B prende possesso della risorsa 2 (per esempio un handle di file); se a questo punto il thread A cerca di acquisire la risorsa 2 e il thread B cerca di acquisire la risorsa 1, entrambi i thread si sospenderanno in eterno aspettandosi l'un l'altro.&lt;/p&gt;&lt;p&gt;Anche se la condizione teorica sembra complessa, i deadlock capitano più spesso di quanto sembri. Guardiamo con attenzione le condizioni:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;un processo ha più di un thread. Anche se sembra una cosa banale, ogni applicazione scritta con .NET ne ha almeno tre: l'execution thread, il GC thread e il finalizer thread. Se poi si usano timer, c'è anche un timer thread. &lt;/li&gt;&lt;li&gt;tutti i thread possono accedere a tutte le risorse. Questa condizione è vera a meno che non sia applicata una policy nel codice del processo (con eccezioni, come l'STA thread per la UI e la message pump)&lt;/li&gt;&lt;li&gt;Molte risorse non sono intrinsecamente condivisibili (per esempio un file in scrittura)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Se sospetti che la tua applicazione stia esibendo un comportamento compatibile con un deadlock, puoi provare ad usare un tool che Joe Duffy ha scritto usando le hosting API del CLR.&lt;/p&gt;&lt;p&gt;Uno dei comportamenti che possono essere personalizzati tramite queste API è che l'host nativo del CLR può essere notificato ogni volta che un thread è creato, distrutto, sospeso o messo in condizione di essere eseguito. Questo tool, crea un log dei thread presenti nel processo ed esegue un algoritmo di deadlock detection ad ogni cambiamento di stato. Se un deadlock viene identificato, l'host solleva un'eccezione critica che può essere catturata se il processo girava con un debugger attaccato. In questo modo si viene allertati nel momento in cui avviene la presa del lock che genera il deadlock e si può intervenire sul codice.&lt;/p&gt;&lt;p&gt;Il tool e l'eccellente articolo che lo accompagnano si possono scaricare seguendo &lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc163618.aspx"&gt;&lt;font color="#669966"&gt;questo link per l'articolo&lt;/font&gt;&lt;/a&gt; e &lt;a href="http://msdn2.microsoft.com/en-us/magazine/cc164594.aspx"&gt;&lt;font color="#669966"&gt;questo per il codice&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I lettori attenti avranno notato che ho glissato elegantemente sul caso dei loop infiniti nel codice non vostro. Questo è il problema peggiore e sarà oggetto di un post futuro.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>Diagnostica, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2265/Autopsia-Applicazione-Terza-Puntata-Applicazione-Congela.aspx</guid><slash:comments>1</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2265/Autopsia-Applicazione-Terza-Puntata-Applicazione-Congela.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2265.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2265</trackback:ping></item><item><title>Autopsia di un'applicazione - seconda puntata gli MDA (Managed Debug Assistants)</title><link>http://blogs.aspitalia.com/ale/post2264/Autopsia-Applicazione-Puntata-MDA-Managed-Debug-Assistants.aspx</link><pubDate>Mon, 07 Apr 2008 07:45:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2264' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;A partire dal .NET Framework 2.0, abbiamo introdotto un nuovo strumento per il debugging dei problemi tradizionalmente difficili da diagnosticare.&lt;/p&gt;&lt;p&gt;I cosiddetti MDA (Managed Debugging Assistants) consentono di trattare alcune condizioni come eccezioni così da dare l'opportunità di attaccare un debugger.&lt;/p&gt;&lt;p&gt;Per avere la lista completa degli MDA fate riferimento a questa pagina su MSDN: &lt;a href="http://msdn2.microsoft.com/en-us/library/d21c150d.aspx"&gt;&lt;font color="#669966"&gt;Diagnosing Errors with the Managed Debugging Assistants&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Giusto per dare un'aneddoto che mostra la potenza degli MDA, concentriamo l'attenzione su &lt;a href="http://msdn2.microsoft.com/en-us/library/ms228991.aspx"&gt;&lt;font color="#669966"&gt;invalidOverlappedToPInvoke&lt;/font&gt;&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;Nel 2005, quando le date per il release to manifacturing (RTM) di Visual Studio 2005 e SQL Server 2005 stavano avvicinandosi rapidamente, eravamo alla dispearata ricerca delle cause di un numero anomalo di NT Heap corruptions che lo stress testing stava trovando. Dopo uno stillicidio di due mesi, decidemmo di dedicare l'intero reliability team di entrambi i prodotti a scovare il colpevole. Dopo quattro settimane di immersione full time in memory dump e stack traces, la causa fu trovata in un'innocente funzione che faceva I/O sulla rete attraverso un I/O completion port.&lt;/p&gt;&lt;p&gt;Questo meccanismo dell'OS consente di trasferire il controllo dell'operazione ad un kernel thread e gestisce il messaging con l'applicazione chiamante. I dati sono scambiati attraverso una struct OVERLAPPED allocata dal caller in user mode e scritta dal kernel thread.&lt;/p&gt;&lt;p&gt;Il codice che aveva causato il patatrac non aveva fatto nulla di terribile, ed era formalmente corretto (motivo per cui non lo avevamo trovato immediatamente). L'unico problema era che la struttura OVERLAPPED era allocata sulla GC heap e non era pinned. Questo faceva sì che in certi casi la struttura venisse processata dal garbage collector prima che l'operazione di I/O potesse finire. Quando questo succedeva, il kernel thread scriveva sull'NT Heap handle che gli era stata passata, ma questa memoria era nel migliore dei casi free memory nel GC Heap o qualche altro oggetto (da cui le corruption).&lt;/p&gt;&lt;p&gt;Dopo questa avventura, introducemmo questo MDA, che genera un'eccezione a runtime ogni volta che una struttura OVERLAPPED allocata tramite P/Invoke è passata ad un kernel thread ed è raccolta dal garbage collector prima del tempo.&lt;/p&gt;&lt;p&gt;Per cui, se la vostra applicazione vi sta facendo impazzire e le avete provate tutte, forse un semplice&lt;/p&gt;&lt;p&gt;&lt;code&gt; Windows Registry Editor Version 5.00 &lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework] &amp;quot;MDA&amp;quot;=&amp;quot;1&amp;quot; &lt;/code&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Può essere utile.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;A presto&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;--Alessandro&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>Diagnostica, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, .NET Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2264/Autopsia-Applicazione-Puntata-MDA-Managed-Debug-Assistants.aspx</guid><slash:comments>2</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2264/Autopsia-Applicazione-Puntata-MDA-Managed-Debug-Assistants.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2264.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2264</trackback:ping></item><item><title>Autopsia di un'applicazione - prima puntata</title><link>http://blogs.aspitalia.com/ale/post2247/Autopsia-Applicazione-Puntata.aspx</link><pubDate>Thu, 06 Mar 2008 06:14:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2247' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Vorrei spendere qualche tempo per parlare di diverse tecniche di diagnosi di un'applicazione. In questa serie di post cominceremo ad analizzare le ragioni per le quali un'applicazione scritta usando il .NET Framework si pianta, presenterò alcuni esempi e pattern che possono causare quei comportamenti e mostrerò alcune tecniche diagnostiche per risalire alle cause prime di problemi profondi (interop signature mismatch e data corruption) molto difficili da diagnosticare con i tool usati comumente.&lt;/p&gt;&lt;p&gt;La prima puntata è una chiaccherata sulle ragioni di morte di un processo che contiene in CLR.&lt;/p&gt;&lt;p&gt;Qualche anno fa, quando si scriveva in C o C++ era facile piantare un programma. Bastava dimenticarsi di assegnare a null un puntatore assegnato a qualcosa che era stato deallocato e il tuo programma si piantava nel modo più creativo. Oggi è molto più difficile trovarsi un una situazione dove un'applicazione scritta nei Framework del XXI secolo sia così fragile.&lt;/p&gt;&lt;p&gt;Quando un'applicazione scritta usando il .NET Framework si pianta, succede uno dei seguenti eventi ritenuti catastrofici dal runtime (in ordine di probabilità):&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Un'eccezione sollevata nel codice non è stata gestita &lt;/li&gt;&lt;li&gt;Si è verificata una access violation nell'interop (cioè sei andato a leggere memoria che non è tua) &lt;ol&gt;&lt;li&gt;causata dal codice nativo eseguito &lt;/li&gt;&lt;li&gt;causata da un errore nel codice di marshalling (signature sbagliata, convenzioni di allocazione non rispettate tra caller e callee, etc.) &lt;/li&gt;&lt;li&gt;heap corruption causata da codice nativo &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Una risorsa critica per l'esecuzione del programma non è disponibile. Quando questo succede, spesso il programma ha un leak di risorse native (le alloca e non le rilascia mai) o un cattivo uso del Dispose Pattern che lo portano ad una morte prematura per soffocamento. Le risorse la mancanza delle quali può uccidere il processo sono &lt;ol&gt;&lt;li&gt;Memoria &lt;/li&gt;&lt;li&gt;System Handles &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Stack overflow (raro - può succedere se si esagera con la profondità di una query o di una ricorsione) &lt;/li&gt;&lt;li&gt;Un bug nel CLR che causa una access violation (se ne trovate uno dopo il CLR V2 vi pago da bere :-) ) &lt;/li&gt;&lt;/ol&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;La domanda fondamentale è &amp;quot;Perché un processo viene distrutto in questi casi&amp;quot;.&lt;/p&gt;&lt;p&gt;La risposta è di una semplicità disarmante:&amp;quot;Perché è l'unica azione che garantisce la correttezza dell'elaborazione e il più possibile l'integrità dei dati&amp;quot;. Se si continua l'esecuzione in questi stati, è garantito che alcuni degli invarianti che il programmatore ha posto come ipotesi per il funzionamento dell'applicazione sono stati violati.&lt;/p&gt;&lt;p&gt;In questo caso sia per ragioni di correttezza sia di sicurezza, il comportamento più sicuro per l'applicazione è terminare il processo e generare un dump utile per scoprire cosa è andato storto.&lt;/p&gt;&lt;p&gt;Questa considerazione è la ragione dietro alla decisione di cambiare il comportamento di default del runtime in caso di una eccezione non gestita. Mentre .NET 1.1 consente di proseguire, .NET 2.0 e superiori termina il processo a meno che non si setti un parametro di configurazione esplicitamente.&lt;/p&gt;&lt;p&gt;&amp;lt;configuration&amp;gt; &lt;br /&gt;  &amp;lt;runtime&amp;gt;&lt;br /&gt;     &amp;lt;legacyUnhandledExceptionPolicy enabled=&amp;quot;true&amp;quot; /&amp;gt; &lt;br /&gt;  &amp;lt;/runtime&amp;gt; &lt;br /&gt; &amp;lt;/configuration&amp;gt;&lt;/p&gt;&lt;p&gt;La prossima volta parleremo di MDA (Managed Debugging Assistants) uno strumento potente e poco conosciuto per la diagnostica di problemi seri e difficili da identificare altrimenti.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Pattern/" rel="tag"&gt;Pattern&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>Diagnostica, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, Pattern</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2247/Autopsia-Applicazione-Puntata.aspx</guid><slash:comments>3</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2247/Autopsia-Applicazione-Puntata.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2247.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2247</trackback:ping></item><item><title>Il CLR in un processo &amp;#232; come Highlander: ce ne pu&amp;#242; essere soltanto uno</title><link>http://blogs.aspitalia.com/ale/post2243/CLR-Processo-Highlander-Soltanto.aspx</link><pubDate>Sun, 24 Feb 2008 07:16:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2243' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Una delle ragioni principali per le quali il .NET Framework è diventato popolare molto rapidamente è che fa molto per proteggere i programmatori da se stessiò errori come doppi free, access violations, leaks, sono stati ridotti e in certe ipotesi resi impossibili. Purtroppo, il costo di più protezioni si paga con un accesso più ostico ai livelli più bassi del sistema e con il fatto che capire fino in fondo le assunzioni di base che si fanno quando si scrive codice in .NET non è semplice.&lt;/p&gt;&lt;p&gt;Questo è il primo di una serie di posting che parleranno di modi non ovvi in cui le cose possono andare storte, e su come si può uscire da situazioni difficili.&lt;/p&gt;&lt;p&gt;Il primo argomento di cui voglio parlare è una limitazione poco conosciuta, ma dalle conseguenze imprevedibili nei casi in cui si violino i suoi invarianti: quando gira codice di .NET in un processo, può essere caricata solo una versione del CLR, e una volta caricata, non può essere scaricata o fatta ripartire da zero. Solo Silverlight fa eccezione a questa regola e può coesistere con un desktop CLR nello stesso processo.&lt;/p&gt;&lt;p&gt;Quando un'applicazione (per esempio Microsoft Office o Adobe Photoshop) espone un modello di estensibilità tramite COM, questo consente a codice di terze parti (l'add-in) di interagire con le strutture dell'applicazione, spesso all'interno dei confini del processo. E' del tutto possibile (e piuttosto banale) esporre tipi di .NET come oggetti COM. Oppure è piuttosto semplice seguire le ricette che anche alcuni articoli di MSDN presentano per scrivere piccole shim che usano le hosting API del CLR per fare partire codice di .NET nel processo (vedi l'articolo di Siew-Moi Khor e Andrew Whitechapel &amp;quot;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa537166.aspx"&gt;&lt;font color="#669966"&gt;Isolating Microsoft Office Extensions with the COM Shim Wizard Version 2.0&lt;/font&gt;&lt;/a&gt;&amp;quot;) - questo consente di aggirare il fatto che senza una shim dedicata non è possibile firmare il codice con Authenticode.&lt;/p&gt;&lt;p&gt;Non c'è nulla di sbagliato nel farlo. Quello dal quale bisogna guardarsi sono le assunzioni che si fanno.&lt;/p&gt;&lt;p&gt;Questo non è un problema quando si ha a che fare con un processo host che è scritto in modo da prevedere che qualcuno degli add-in nel processo potrebbero richiedere di avere un arbitro se ci fossero delle richieste divergenti, ma può creare un problema quasi indebuggabile altrimenti.&lt;/p&gt;&lt;p&gt;Tempo fa mi trovai davanti ad un problema interessante. Un grosso cliente usava un add-in di Excel per fare dei complicati calcoli finanziari, e la potenza di .NET aveva fatto sì che avessero portato tutta l'applicazione da VBA e COM. Eravamo ancora agli albori di VSTO, quindi l'add-in era una semplice shim che chiamava CoreBindToRuntimeEx per caricare in memoria il CLR ed eseguire gli assembly dell'applicazione.&lt;/p&gt;&lt;p&gt;Le performance erano ottime e i risultati della sperimentazione iniziale altamente positivi. Nonappena iniziarono il deploy, però, circa il 40% delle workstation crashava Excel al boot. L'unico rimedio sembrava disinstallare in nuovo add-in. Il problema sembrava essere completamente casuale, presentandosi su macchine con le stesse applicazioni installate.&lt;/p&gt;&lt;p&gt;Dopo un paio di giorni arrivammo alla soluzione: quello che importava era non solo la presenza delle stesse applicazioni, ma l'ordine nel quale erano state installate. Questo perché Excel caricava gli add-in nell'ordine in cui erano stati installati, e uno degli add-in che erano installati da un'altra suite di utility era stato scritto usando .NET 1.1.&lt;/p&gt;&lt;p&gt;La sequenza delle operazioni quindi diventava&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Fai il boot di Excel&lt;/li&gt;&lt;li&gt;carica il primo add-in scritto con .NET&lt;/li&gt;&lt;li&gt;carica e fai partire il CLR specificato carica gli assembly richiesti&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;A questo punto se per caso il CLR caricato e fatto partire era la versione 1.1, l'add-in compilato per 2.0 falliva il load, e l'eccezione non gestita veniva propagata tramite COM fino alla soppressione del processo.&lt;/p&gt;&lt;p&gt;Successivi Service Pack di Office e l'avvento di VSTO hanno oggi risolto questo problema almeno per Office, ma ogni volta che si carica o si usa codice .NET in un processo che non è in grado di arbitrare le versioni del runtime, bisogna ricordarsi di gestire il caso in cui il proprio non sia l'unico add-in che cerca di caricare il CLR nel processo, e che molto probabilmente gli altri non l'hanno fatto ;-)&lt;/p&gt;&lt;p&gt;Per quelli di voi che scrivono applicazioni estensibili tramite COM, se volete supportare veramente add-in scritti usando il .NET Framework dovete scrivere un arbitro per il loader del CLR. Farlo è piuttosto semplice: basta registrare una callback tramite &lt;a href="http://msdn2.microsoft.com/en-us/library/ms230241.aspx"&gt;&lt;font color="#669966"&gt;LockCLRVersion&lt;/font&gt;&lt;/a&gt; e dirottare tutte le chiamate che provano a caricare a fare partire un CLR a passare dal vostro codice di arbitraggio.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>CLR Hosting, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2243/CLR-Processo-Highlander-Soltanto.aspx</guid><slash:comments>4</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2243/CLR-Processo-Highlander-Soltanto.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2243.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2243</trackback:ping></item><item><title>Smitizzare HTTPS e le infrastrutture a chiave pubblica (PKI)</title><link>http://blogs.aspitalia.com/ale/post2241/Smitizzare-HTTPS-Infrastrutture-Chiave-Pubblica-PKI.aspx</link><pubDate>Thu, 21 Feb 2008 10:01:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2241' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Per un utente finale, https è pericolosamente simile al cugino http.&lt;/p&gt;&lt;p&gt;In realtà molto di più accade in modo nascosto e capire meglio la differenza aiuterà molto in situazioni in cui sia richiesto di usare https come trasporto sicuro.&lt;/p&gt;&lt;p&gt;Https o http su SSL nacque negli anni '90 come una prima applicazione di SSL per la tramissione sicura di dati. E' visto come uno degli architravi della nascita dell'e-commerce.&lt;/p&gt;&lt;p&gt;Il principio fondamentale su cui SSL si basa è semplice: un client e un server verificano il proprio &amp;quot;pedigree&amp;quot; e si scambiano una chiave di sessione con la quale criptare il traffico tra loro.&lt;/p&gt;&lt;p&gt;Il &amp;quot;pedigree&amp;quot; in questione è costituito da una serie di messaggi criptati e firmati con una coppia di chiavi pubblica/privata contenuti in un certificato.&lt;/p&gt;&lt;p&gt;Smitizziamo un po' il gergo dell'https e dell'SSL&lt;/p&gt;&lt;p&gt;Una chiave è un dato utilizzato come parametro da un algoritmo di crittazione o decrittazione per cifrare o decifrare un insieme di dati. Una chiave può essere parte di una coppia, in cui ciò che è cifrato con una delle chiavi può essere solo decifrato dall'altra, o una chiave a sé stante. Nel primo caso, una delle chiavi della coppia può essere distribuita liberamente (chiave pubblica) e solo chi possiede l'altra (chiave privata) potrà accedere all'informazione cifrata. Nel secondo caso, la chiave deve essere conosciuta da entrambe le parti della conversazione a priori perché ci possa essere una conversazione cifrata.&lt;/p&gt;&lt;p&gt;E' da notare come gli algoritmi di crittazione/decrittazione a chiave pubblica (per esempio RSA) siano ordini di grandezza più lenti degli algoritmi a singola chiave privata (per esempio AES o Blowfish)&lt;/p&gt;&lt;p&gt;Un certificato è l'unione di un'identità (per esempio un nome o l'url di un server) e una coppia di chiavi. Un certificato può essere firmato usando la chiave di un altro certificato.&lt;/p&gt;&lt;p&gt;Una firma digitale è definita come lo hash di un insieme di dati e il nome del principal di un certificato. Una volta che un insieme di dati ha una firma digitale, modificare i dati in qualunque modo rende lo hash diverso da quello contenuto nella firma e quindi rende evidente che i dati sono stati alterati.&lt;/p&gt;&lt;p&gt;A questo punto è ovvio che se uso la mia chiave privata di una coppia di chiavi contenute in un certificato a mio nome per generare lo hash di una firma digitale, questo ha due effetti:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Chi riceve quei dati può verificare la firma con la mia chiave pubblica e certificare che quei dati vengono veramente da me &lt;/li&gt;&lt;li&gt;Chi riceve quei dati può verificare che quei dati non sono stati modificati da nessuno e che sono esattamente gli stessi identici dati che sono stati da me inviati. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;a questo punto abbiamo il primo ingrediente per stabilire una connessione sicura.&lt;/p&gt;&lt;p&gt;L'inghippo a questo punto diventa come fare a sapere se la chiave pubblica che ho trovato nel certificato pubblico che mi hai dato è davvero la tua.&lt;/p&gt;&lt;p&gt;Qui entra in gioco il concetto di Public Key Infrastructure (PKI) e di Certification Authority (CA).&lt;/p&gt;&lt;p&gt;Non tutti i certificati sono uguali. Alcuni certificati sono firmati da altri certificati, che sono firmati da altri certificati e così via.&lt;/p&gt;&lt;p&gt;Nel mondo esiste un gruppo di certificati speciali. Sono i cosiddetti Trusted Root (la migliore traduzione che mi viene in mente è le &amp;quot;fonti di fiducia&amp;quot;).&lt;/p&gt;&lt;p&gt;Questi certificati sono stati verificati con una procedura rigorosa al di fuori delle normali trasmissioni e i loro possessori si sono impegnati a seguire procedure altrettanto rigorose per emettere e firmare certificati.&lt;/p&gt;&lt;p&gt;La lista di questi trusted root universali si può trovare lanciando MMC e inserendo lo snap-in dei certificati. Nell'albero a sinistra c'è un nodo &amp;quot;Trusted Root Certification Authorities&amp;quot;.&lt;/p&gt;&lt;p&gt;Tornando ad un certificato, si chiama catena della fiducia (chain of trust) il fatto che l'atto di firmare un certificato implica certificare il legame tra il nome della risorsa e le chiavi crittografiche. Iterando questo, un certificato che è stato firmato da un root, può essere usato per firmare altri certificati, così trasferendo la verifica implicita che anche questi certificati di secondo o n-esimo livello sono verificati.&lt;/p&gt;&lt;p&gt;Tornando al nostro problema con SSL e HTTPS, per verificare che un client è davvero chi dice di essere e che il server è davvero chi dice di essere la conversazione che avviene è la seguente:&lt;/p&gt;&lt;p&gt;Client &amp;quot;Ciao Server. Sono Pino della Ragioneria. Questo è il mio certificato.°  (nota - questo è facoltativo e succede solo se il client usa il certificato per autenticarsi. Talvolta questo si fa per avere connessioni ad alta sicurezza, per esempio quando la chiave privata è registrata su una smartcard)&lt;/p&gt;&lt;p&gt;Server: &amp;quot;Ciao Pino della Ragioneria, il tuo certificato è valido e firmato da qualcuno di cui mi fido, quindi sei davvero tu. Questo è il mio di certificato&amp;quot;&lt;/p&gt;&lt;p&gt;Client: &amp;quot;Server, il tuo certificato è firmato dalla chiave di un certificato di cui mi fido. usando la tua chiave pubblica ho criptato una chiave privata che vorrei usare per questa sessione°&lt;/p&gt;&lt;p&gt;Server: &amp;quot;Pino, ho ricevuto la tua chiave di sessione e ti manderò i dati criptati con essa. Mostra il famigerato lucchetto chiuso nel browser.&amp;quot;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Capire come funziona questo handshake è la chiave per tutti i problemi che ho trovato nei forum di ASPItalia attorno a configurare https e i certificati.&lt;/p&gt;&lt;p&gt;In particolare, dove le cose possono andare storte è nella fase in cui il client verifica l'identità del server. Questa fase richiede che il certificato che il server usa per identificarsi si possa ricollegare ad una Trusted Root Certification Authority.&lt;/p&gt;&lt;p&gt;Perché ciò avvenga è necessaria una delle seguenti condizioni:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;avete comprato un certificato SSL da una Certification Authority riconosciuta &lt;/li&gt;&lt;li&gt;avete reso la vostra CA fidata presso i client che si collegheranno &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Il caso 2 diventa interessante nello scenario in cui si voglia usare https come il trasporto per un web service aziendale che si voglia aprire soltanto a clienti interni. Per fare questo si deve settare IIS con un certificato https generato dalla propria CA e si installa il certificato root della propria CA sui client tra i Trusted Root CA. &lt;/p&gt;&lt;p&gt;Questo ultimo passaggio eviterà che il browser segnali che il certificato usato dal server non è fidato con il famigerato messaggio di warning.&lt;/p&gt;&lt;p&gt;Si può andare oltre, e richiedere che i client si identifichino con un certificato rilasciato dalla stessa CA. Questo consente di integrare un'autenticazione a user-password (qualcosa che sai) con un autenticazione a token (qualcosa che hai).&lt;/p&gt;&lt;p&gt;E' da notare che per installare una nuova Trusted Root CA è necessario essere amministratori della macchina client (ovviamente)&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Questo è il mio primo post ospitato dagli amici di ASPItalia. Grazie a Daniele, Stefano, Ricky, Ricciolo e tutti quelli che mi sto dimenticando in questa lista per la cortese ospitalità.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/IIS/" rel="tag"&gt;IIS&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Security/" rel="tag"&gt;Security&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Server/" rel="tag"&gt;Windows Server&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>Crittografia e Infrastrutture a Chiavi Pubbliche (PKI), IIS, Security, Windows Server</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2241/Smitizzare-HTTPS-Infrastrutture-Chiave-Pubblica-PKI.aspx</guid><slash:comments>2</slash:comments><wfw:comments>http://blogs.aspitalia.com/ale/post2241/Smitizzare-HTTPS-Infrastrutture-Chiave-Pubblica-PKI.aspx#feedback</wfw:comments><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2241.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2241</trackback:ping></item></channel></rss>