<?xml version="1.0" encoding="Windows-1252"?><feed version="0.3" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns="http://purl.org/atom/ns#" xml:lang="it-it"><title>Il lato oscuro - Il blog di Alessandro Catorcini</title><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/" /><tagline type="text/html">Il lato oscuro - Il blog di Alessandro Catorcini</tagline><id>http://blogs.aspitalia.com/ale/</id><generator url="http://feed.aspitalia.com/" version="ASPItalia.com">feed.ASPItalia.com 'Weyoh' 4.8.818</generator><author><name>Il lato oscuro - Il blog di Alessandro Catorcini</name><url>http://blogs.aspitalia.com/ale/</url></author><modified>2008-08-20T10:34:51+00:00</modified><entry><title>Trovare il Page not Found...</title><id>http://blogs.aspitalia.com/ale/post2294/Trovare-Page-Not-Found.aspx</id><created>2008-06-04T04:28:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2294' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&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&#249; comune che ho sentito per questa reazione poco entusiastica &#232; che Il messaggio di errore medio passato all'utente &#232; tipicamente inutile: la pagina di errore notifica che si &#232; verificato un problema ma fa poco&#160;o niente per correggerlo o per proporre alternative. Si pu&#242; fare di meglio.&lt;/p&gt;&lt;p&gt;L'ultimo tentativo in ordine di tempo di fare qualcosa per risolvere questo problema &#232; 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=&quot;Pagina di errore di default di IIS&quot; hspace=&quot;0&quot; src=&quot;http://ecrn1g.blu.livefilestore.com/y1p1mK3Vjy2zbZ39O5zSg08NBFKRfenPGWJWBJaaP7jRqTqOKLg1sHt3X72iW6_NQMfviPY_oxLRRl-a7U0det4ZA/IE404errormsg.gif&quot; align=&quot;baseline&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;In una pagina molto pi&#249; utile:&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;Pagina di errore usando il Web Page Error Toolkit&quot; hspace=&quot;0&quot; src=&quot;http://ecrn1g.blu.livefilestore.com/y1p1mK3Vjy2zbZCowcnkGk8xn3wT8kB9xZU25mjQ-f-Ii8DgiwZORc8qKxv7s2keaSISjwUTky639p6LlCn3vvxQg/Webpageerrortoolkit.gif&quot; align=&quot;baseline&quot; border=&quot;0&quot; /&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 &#232; 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;&#160;&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;&#160;A presto&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET/&quot; rel=&quot;tag&quot;&gt;ASP.NET&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET_2.0/&quot; rel=&quot;tag&quot;&gt;ASP.NET 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/ASP.NET_3.5/&quot; rel=&quot;tag&quot;&gt;ASP.NET 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/IIS/&quot; rel=&quot;tag&quot;&gt;IIS&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Windows_Server/&quot; rel=&quot;tag&quot;&gt;Windows Server&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2294/Trovare-Page-Not-Found.aspx"/><issued>2008-06-04T06:28:00+00:00</issued><modified>2008-06-04T06:28:00+00:00</modified><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></entry><entry><title>Come scrivere in ASP.net un controllo che usa Silverlight solo se &amp;#232; gi&amp;#224; sul client</title><id>http://blogs.aspitalia.com/ale/post2287/Scrivere-ASP.net-Controllo-Usa-Silverlight-Gia-Client.aspx</id><created>2008-05-17T08:56:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2287' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;L'introduzione di Silverlight ha aperto la porta a design per le UI prima completamente impensabili. Il problema &#232; 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 &#232; &amp;quot;Come si fa a scrivere un controllo in ASP.net che sappia disegnarsi con Silverlight se &#232; 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 &#232; 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&#249; prosaico &#232; 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=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&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&#242; 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&#242; 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;&#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/Silverlight/&quot; rel=&quot;tag&quot;&gt;Silverlight&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/XAML/&quot; rel=&quot;tag&quot;&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2287/Scrivere-ASP.net-Controllo-Usa-Silverlight-Gia-Client.aspx"/><issued>2008-05-17T10:56:00+00:00</issued><modified>2008-05-17T10:56:00+00:00</modified><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></entry><entry><title>Legionari dell'Impero</title><id>http://blogs.aspitalia.com/ale/post2271/Legionari-Impero.aspx</id><created>2008-04-19T17:52:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2271' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;Ogni volta che interagisco con qualcuno dall'Italia, una delle domande che prima o poi arrivano &#232; 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 &#232; fuori portata. Ma come per vincere alla lotteria, il primo passo &#232; comprare il biglietto, per venire qui bisogna innanzitutto chiederlo. Sul sito di &lt;a href=&quot;http://www.microsoft.com/careers&quot;&gt;Microsoft Careers&lt;/a&gt;&#160; 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&#236; proprio dai form di questo sito. Soltanto nel mio gruppo (&lt;a href=&quot;http://www.live.com&quot;&gt;Live Search&lt;/a&gt;) stiamo cercando &lt;a href=&quot;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&quot;&gt;pi&#249; 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 &#232; {nome}@{cognome}.com dove a nome e cognome dovete sostituire i valori [:)] ) &lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2271/Legionari-Impero.aspx"/><issued>2008-04-19T19:52:00+00:00</issued><modified>2008-04-19T19:52:00+00:00</modified><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></entry><entry><title>Pizza, topologia e web services</title><id>http://blogs.aspitalia.com/ale/post2269/Pizza-Topologia-Web-Services.aspx</id><created>2008-04-17T04:33:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2269' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&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&#249; 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=&quot;http://tags.aspitalia.com/Off_Topic/&quot; rel=&quot;tag&quot;&gt;Off Topic&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2269/Pizza-Topologia-Web-Services.aspx"/><issued>2008-04-17T06:33:00+00:00</issued><modified>2008-04-17T06:33:00+00:00</modified><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></entry><entry><title>Autopsia di un'applicazione - Terza puntata: l'applicazione che si congela</title><id>http://blogs.aspitalia.com/ale/post2265/Autopsia-Applicazione-Terza-Puntata-Applicazione-Congela.aspx</id><created>2008-04-08T05:08:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2265' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Se diagnosticare perch&#233; un'applicazione si pianta non &#232; sempre facile, diagnosticare perch&#233; un'applicazione si congela o va in un loop infinito non lo &#232; 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 &#232; 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 &#232; disponibile, si possono usare altri tool pi&#249; pratici nell'arsenale del managed developer.&lt;/p&gt;&lt;p&gt;Deadlock: cos'&#232;? &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&#249; 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&#249; spesso di quanto sembri. Guardiamo con attenzione le condizioni:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;un processo ha pi&#249; 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'&#232; anche un timer thread. &lt;/li&gt;&lt;li&gt;tutti i thread possono accedere a tutte le risorse. Questa condizione &#232; 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 &#232; che l'host nativo del CLR pu&#242; essere notificato ogni volta che un thread &#232; 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&#242; 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&#242; 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=&quot;http://msdn2.microsoft.com/en-us/magazine/cc163618.aspx&quot;&gt;&lt;font color=&quot;#669966&quot;&gt;questo link per l'articolo&lt;/font&gt;&lt;/a&gt;&#160;e &lt;a href=&quot;http://msdn2.microsoft.com/en-us/magazine/cc164594.aspx&quot;&gt;&lt;font color=&quot;#669966&quot;&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 &#232; il problema peggiore e sar&#224; oggetto di un post futuro.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2265/Autopsia-Applicazione-Terza-Puntata-Applicazione-Congela.aspx"/><issued>2008-04-08T07:08:00+00:00</issued><modified>2008-04-08T07:08:00+00:00</modified><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></entry><entry><title>Autopsia di un'applicazione - seconda puntata gli MDA (Managed Debug Assistants)</title><id>http://blogs.aspitalia.com/ale/post2264/Autopsia-Applicazione-Puntata-MDA-Managed-Debug-Assistants.aspx</id><created>2008-04-07T07:45:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2264' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&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&#236; da dare l'opportunit&#224; 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=&quot;http://msdn2.microsoft.com/en-us/library/d21c150d.aspx&quot;&gt;&lt;font color=&quot;#669966&quot;&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=&quot;http://msdn2.microsoft.com/en-us/library/ms228991.aspx&quot;&gt;&lt;font color=&quot;#669966&quot;&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&#236; 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 &#232; passata ad un kernel thread ed &#232; 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;&#160;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;&#160;&lt;/p&gt;&lt;p&gt;Pu&#242; essere utile.&lt;/p&gt;&lt;p&gt;&#160;&lt;/p&gt;&lt;p&gt;A presto&lt;/p&gt;&lt;p&gt;&#160;&lt;/p&gt;&lt;p&gt;--Alessandro&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2264/Autopsia-Applicazione-Puntata-MDA-Managed-Debug-Assistants.aspx"/><issued>2008-04-07T09:45:00+00:00</issued><modified>2008-04-07T09:45:00+00:00</modified><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></entry><entry><title>Autopsia di un'applicazione - prima puntata</title><id>http://blogs.aspitalia.com/ale/post2247/Autopsia-Applicazione-Puntata.aspx</id><created>2008-03-06T06:14:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2247' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&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&#242; alcuni esempi e pattern che possono causare quei comportamenti e mostrer&#242; 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 &#232; 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&#249; creativo. Oggi &#232; molto pi&#249; difficile trovarsi un una situazione dove un'applicazione scritta nei Framework del XXI secolo sia cos&#236; 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&#224;):&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Un'eccezione sollevata nel codice non &#232; stata gestita &lt;/li&gt;&lt;li&gt;Si &#232; verificata una access violation nell'interop (cio&#232; sei andato a leggere memoria che non &#232; 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 &#232; 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&#242; 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&#242; succedere se si esagera con la profondit&#224; 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;&#160;&lt;/p&gt;&lt;p&gt;La domanda fondamentale &#232; &amp;quot;Perch&#233; un processo viene distrutto in questi casi&amp;quot;.&lt;/p&gt;&lt;p&gt;La risposta &#232; di una semplicit&#224; disarmante:&amp;quot;Perch&#233; &#232; l'unica azione che garantisce la correttezza dell'elaborazione e il pi&#249; possibile l'integrit&#224; dei dati&amp;quot;. Se si continua l'esecuzione in questi stati, &#232; 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&#249; sicuro per l'applicazione &#232; terminare il processo e generare un dump utile per scoprire cosa &#232; andato storto.&lt;/p&gt;&lt;p&gt;Questa considerazione &#232; 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;&#160; &amp;lt;runtime&amp;gt;&lt;br /&gt;&#160;&#160;&#160; &#160;&amp;lt;legacyUnhandledExceptionPolicy enabled=&amp;quot;true&amp;quot; /&amp;gt;&#160;&lt;br /&gt;&#160;&#160;&amp;lt;/runtime&amp;gt; &lt;br /&gt;&#160;&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=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Pattern/&quot; rel=&quot;tag&quot;&gt;Pattern&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2247/Autopsia-Applicazione-Puntata.aspx"/><issued>2008-03-06T07:14:00+00:00</issued><modified>2008-03-06T07:14:00+00:00</modified><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></entry><entry><title>Il CLR in un processo &amp;#232; come Highlander: ce ne pu&amp;#242; essere soltanto uno</title><id>http://blogs.aspitalia.com/ale/post2243/CLR-Processo-Highlander-Soltanto.aspx</id><created>2008-02-24T07:16:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2243' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Una delle ragioni principali per le quali il .NET Framework &#232; diventato popolare molto rapidamente &#232; che fa molto per proteggere i programmatori da se stessi&#242; errori come doppi free, access violations, leaks, sono stati ridotti e in certe ipotesi resi impossibili. Purtroppo, il costo di pi&#249; protezioni si paga con un accesso pi&#249; ostico ai livelli pi&#249; bassi del sistema e con il fatto che&#160;capire fino in fondo le assunzioni di base che si fanno quando si scrive codice in .NET non &#232; semplice.&lt;/p&gt;&lt;p&gt;Questo &#232; 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&#242; uscire da situazioni difficili.&lt;/p&gt;&lt;p&gt;Il primo argomento di cui&#160;voglio parlare&#160;&#232; 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&#242; essere caricata solo una versione del CLR, e una volta caricata, non pu&#242; essere scaricata o fatta ripartire da zero. Solo Silverlight fa eccezione a questa regola e pu&#242; 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&#224; 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 &#232; 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=&quot;http://msdn2.microsoft.com/en-us/library/aa537166.aspx&quot;&gt;&lt;font color=&quot;#669966&quot;&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 &#232; possibile firmare il codice con Authenticode.&lt;/p&gt;&lt;p&gt;Non c'&#232; nulla di sbagliato nel farlo. Quello dal quale bisogna guardarsi sono le assunzioni che si fanno.&lt;/p&gt;&lt;p&gt;Questo non &#232; un problema quando si ha a che fare con un processo host che &#232; 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&#242; 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&#236; 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&#242;, 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&#233; 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 &#232; 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 &#232; piuttosto semplice: basta registrare una callback tramite &lt;a href=&quot;http://msdn2.microsoft.com/en-us/library/ms230241.aspx&quot;&gt;&lt;font color=&quot;#669966&quot;&gt;LockCLRVersion&lt;/font&gt;&lt;/a&gt;&#160;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=&quot;http://tags.aspitalia.com/.NET_Framework/&quot; rel=&quot;tag&quot;&gt;.NET Framework&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_2.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.0/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.0&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/.NET_Framework_3.5/&quot; rel=&quot;tag&quot;&gt;.NET Framework 3.5&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2243/CLR-Processo-Highlander-Soltanto.aspx"/><issued>2008-02-24T08:16:00+00:00</issued><modified>2008-02-24T08:16:00+00:00</modified><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></entry><entry><title>Smitizzare HTTPS e le infrastrutture a chiave pubblica (PKI)</title><id>http://blogs.aspitalia.com/ale/post2241/Smitizzare-HTTPS-Infrastrutture-Chiave-Pubblica-PKI.aspx</id><created>2008-02-21T10:01:00+00:00</created><content type="text/html" mode="escaped">&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2241' border=&quot;0&quot; style=&quot;width:1px; height:1px;&quot; /&gt;&lt;p&gt;Per un utente finale, https &#232; pericolosamente simile al cugino http.&lt;/p&gt;&lt;p&gt;In realt&#224; molto di pi&#249; accade in modo nascosto e capire meglio la differenza aiuter&#224; 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 &#232; 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 &#232; 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 &#232; un dato utilizzato come parametro da un algoritmo di crittazione o decrittazione per cifrare o decifrare un insieme di dati. Una chiave pu&#242; essere parte di una coppia, in cui ci&#242; che &#232; cifrato con una delle chiavi pu&#242; essere solo decifrato dall'altra, o una chiave a s&#233; stante. Nel primo caso, una delle chiavi della coppia pu&#242; essere distribuita liberamente (chiave pubblica) e solo chi possiede l'altra (chiave privata) potr&#224; accedere all'informazione cifrata. Nel secondo caso, la chiave deve essere conosciuta da entrambe le parti della conversazione a priori perch&#233; 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&#249; lenti degli algoritmi a singola chiave privata (per esempio AES o Blowfish)&lt;/p&gt;&lt;p&gt;Un certificato &#232; l'unione di un'identit&#224; (per esempio un nome o l'url di un server) e una coppia di chiavi. Un certificato pu&#242; essere firmato usando la chiave di un altro certificato.&lt;/p&gt;&lt;p&gt;Una firma digitale &#232; 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 &#232; 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&#242; 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&#242; 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 &#232; 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&#236; 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 &#232; 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&#242; trovare lanciando MMC e inserendo lo snap-in dei certificati. Nell'albero a sinistra c'&#232; 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 &#232; stato firmato da un root, pu&#242; essere usato per firmare altri certificati, cos&#236; 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 &#232; davvero chi dice di essere e che il server &#232; davvero chi dice di essere la conversazione che avviene &#232; la seguente:&lt;/p&gt;&lt;p&gt;Client &amp;quot;Ciao Server. Sono Pino della Ragioneria. Questo &#232; il mio certificato.&#176;&#160; (nota - questo &#232; 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 &#232; registrata su una smartcard)&lt;/p&gt;&lt;p&gt;Server: &amp;quot;Ciao Pino della Ragioneria, il tuo certificato &#232; valido e firmato da qualcuno di cui mi fido, quindi sei davvero tu. Questo &#232; il mio di certificato&amp;quot;&lt;/p&gt;&lt;p&gt;Client: &amp;quot;Server, il tuo certificato &#232; 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&#176;&lt;/p&gt;&lt;p&gt;Server: &amp;quot;Pino, ho ricevuto la tua chiave di sessione e ti mander&#242; i dati criptati con essa. Mostra il famigerato lucchetto chiuso nel browser.&amp;quot;&lt;/p&gt;&lt;p&gt;&#160;&lt;/p&gt;&lt;p&gt;Capire come funziona questo handshake &#232; 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 &#232; nella fase in cui il client verifica l'identit&#224; 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&#233; ci&#242; avvenga &#232; 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&#224; che il browser segnali che il certificato usato dal server non &#232; fidato con il famigerato messaggio di warning.&lt;/p&gt;&lt;p&gt;Si pu&#242; 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 &#232; necessario essere amministratori della macchina client (ovviamente)&lt;/p&gt;&lt;p&gt;&#160;&lt;/p&gt;&lt;p&gt;Questo &#232; 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&#224;.&lt;/p&gt;&lt;p&gt;&#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href=&quot;http://tags.aspitalia.com/IIS/&quot; rel=&quot;tag&quot;&gt;IIS&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Security/&quot; rel=&quot;tag&quot;&gt;Security&lt;/a&gt;, &lt;a href=&quot;http://tags.aspitalia.com/Windows_Server/&quot; rel=&quot;tag&quot;&gt;Windows Server&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href=&quot;http://www.aspitalia.com/&quot;&gt;(C) 2008 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</content><link rel="alternate" type="text/html" href="http://blogs.aspitalia.com/ale/post2241/Smitizzare-HTTPS-Infrastrutture-Chiave-Pubblica-PKI.aspx"/><issued>2008-02-21T11:01:00+00:00</issued><modified>2008-02-21T11:01:00+00:00</modified><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></entry></feed>