Path: blob/main/xml/it/docs/http/configuring_https_servers.xml
1 views
<!--1Copyright (C) Igor Sysoev2Copyright (C) Nginx, Inc.3-->45<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">67<article name="Configurazione di server HTTPS"8link="/it/docs/http/configuring_https_servers.html"9lang="it"10translator="Angelo Papadia"11rev="6"12author="Igor Sysoev"13editor="Brian Mercer">1415<section>1617<para>18Per configurare un server HTTPS, bisogna configurare il parametro19<literal>ssl</literal> nel20<link doc="ngx_http_core_module.xml" id="listen">socket in ascolto</link>21del blocco <link doc="ngx_http_core_module.xml" id="server"/>,22e specificare dove sono i file del certificato del server e della relativa23chiave private:2425<programlisting>26server {27listen 443 <b>ssl</b>;28server_name www.example.com;29ssl_certificate <b>www.example.com.crt</b>;30ssl_certificate_key <b>www.example.com.key</b>;31ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;32ssl_ciphers HIGH:!aNULL:!MD5;33...34}35</programlisting>3637Il certificato del server e' pubblico: e' inviato a tutti i client che38si connettono al server; la chiave privata al contrario non e' pubblica,39e dovrebbe essere salvata in un file con restrizioni d'accesso, e40comunque non leggibile dal processo master di nginx.41In alternativa, la chiave privata puo' essere salvata nel medesimo file42del certificato:4344<programlisting>45ssl_certificate www.example.com.cert;46ssl_certificate_key www.example.com.cert;47</programlisting>4849pure in questo caso i diritti d'accesso al file dovrebbero essere ristretti.50Anche quando certificato e chiave privata sono salvati entrambi51in un unico file, solo il certificato e' inviato al client.52</para>5354<para>55Le direttive <link doc="ngx_http_ssl_module.xml" id="ssl_protocols"/> e56<link doc="ngx_http_ssl_module.xml" id="ssl_ciphers"/> possono essere usate57per limitare l'uso alle sole versioni e cifrature forti di SSL/TLS nelle58connessioni.59nginx usa per default “<literal>ssl_protocols SSLv3 TLSv1</literal>” e60“<literal>ssl_ciphers HIGH:!aNULL:!MD5</literal>” sin dalla versione 1.0.5,61per cui una configurazione esplicita ha senso solo per le versioni di nginx62piu' vecchie. Dalle versioni 1.1.13 e 1.0.12 nginx usa per default63“<literal>ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2</literal>”.64</para>6566<para>67La modalita' di cifratura CBC e' potenzialmente vulnerabile ad una serie68di attacchi, in particolare ad un attacco BEST (vedi69<link url="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-3389">CVE-2011-3389</link>).70La configurazione della cifratura puo' essere modificata in maniera da71utilizzare RC4-SHA:7273<programlisting>74ssl_ciphers RC4:HIGH:!aNULL:!MD5;75ssl_prefer_server_ciphers on;76</programlisting>77</para>7879</section>808182<section id="optimization" name="Ottimizzazione di server HTTPS">8384<para>85Le operazioni SSL utilizzano pesantemente la CPU. Su sistemi86multiprocessore e' bene avviare processi worker in numero almeno pari a87quello dei core.88L'operazione piu' gravosa per la CPU e' l'handshake SSL.89Ci sono due modi per minimizzare il numero di tali operazioni per client:90il primo consiste nell'abilitare connessioni keepalive per inviare diverse91richieste tramite un'unica connessione; il secondo prevede di riutilizzare92i parametri della sessione SSL in maniera tale da evitare l'handshake SSL93per connessioni parallele e susseguenti.94Le sessioni sono salvate in una cache di sessione SSL, condivisa fra i95worker e configurata dalla direttiva96<link doc="ngx_http_ssl_module.xml" id="ssl_session_cache"/>.9798Un megabyte di cache contiene circa 4000 sessioni. Il timeout di default della99cache e' di 5 minuti; puo' essere aumentato intervenendo sulla direttiva100<link doc="ngx_http_ssl_module.xml" id="ssl_session_timeout"/>.101Segue una configurazione di esempio ottimizzata per un sistema multicore con10210 megabyte di cache di sessione condivisa:103104<programlisting>105<b>worker_processes auto</b>;106107http {108<b>ssl_session_cache shared:SSL:10m</b>;109<b>ssl_session_timeout 10m</b>;110111server {112listen 443 ssl;113server_name www.example.com;114<b>keepalive_timeout 70</b>;115116ssl_certificate www.example.com.crt;117ssl_certificate_key www.example.com.key;118ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;119ssl_ciphers HIGH:!aNULL:!MD5;120...121</programlisting>122</para>123124</section>125126127<section id="chains" name="Catene di certificati SSL">128129<para>130Capita talvolta che alcuni certificati server firmati da autorita' di131certificazione ben note siano tranquillamente accettati da alcuni browser,132ma mostrino invece problemi con altri. Cio' succede quando' l'autorita'133emittente ha firmato il certificato usandone uno intermedio che non e'134presente nell'elenco delle autorita' di certificazione distribuito con135uno specifico browser.136In tal caso l'autorita' fornisce un gruppo di certificati che dovrebbero137essere concatenati al certificato server firmato.138Il certificato server deve comparire prima dei certificati concatenati139nel file risultante:140141<programlisting>142$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt143</programlisting>144145Il file che ne deriva va usato con la direttiva146<link doc="ngx_http_ssl_module.xml" id="ssl_certificate"/>:147148<programlisting>149server {150listen 443 ssl;151server_name www.example.com;152ssl_certificate www.example.com.chained.crt;153ssl_certificate_key www.example.com.key;154...155}156</programlisting>157158Se il certificato server ed il gruppo di certificati sono stati concatenati159nell'ordine sbagliato, nginx non riuscira' a partire e mostrera' il160seguente messaggio di errore:161162<programlisting>163SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed164(SSL: error:0B080074:x509 certificate routines:165X509_check_private_key:key values mismatch)166</programlisting>167168dato che nginx ha tentato di usare la chiave privata non con il certificato169server ma con il primo certificato del gruppo.170</para>171172<para>173Di solito i browser salvano i certificati intermedi che ricevono se sono174firmati da autorita' di certificazione riconosciute, per cui browser molto175usati potrebbero gia' avere i certificati intermedi richiesti, e quindi176non avere problemi anche quando ricevono un certificato privo della177relativa concatenazione di certificati.178Comunque, per assicurare che il server invii la concatenazione di certificati179completa, e' possibile usare da linea di comando il programma180<command>openssl</command>, ad esempio:181182<programlisting>183$ openssl s_client -connect www.godaddy.com:443184...185Certificate chain1860 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US187/1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc188/OU=MIS Department/<b>CN=www.GoDaddy.com</b>189/serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)190i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.191/OU=http://certificates.godaddy.com/repository192/CN=Go Daddy Secure Certification Authority193/serialNumber=079692871941 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.195/OU=http://certificates.godaddy.com/repository196/CN=Go Daddy Secure Certification Authority197/serialNumber=07969287198i:/C=US/O=The Go Daddy Group, Inc.199/OU=Go Daddy Class 2 Certification Authority2002 s:/C=US/O=The Go Daddy Group, Inc.201/OU=Go Daddy Class 2 Certification Authority202i:/L=ValiCert Validation Network/O=<b>ValiCert, Inc.</b>203/OU=ValiCert Class 2 Policy Validation Authority204/CN=http://www.valicert.com//[email protected]205...206</programlisting>207208In questo esempio, il soggetto (“<i>s</i>”, vale a dire "<i>subject</i>")209del certificato server #0 <literal>www.GoDaddy.com</literal> e' firmato da210un emittente (“<i>i</i>”, vale a dire "<i>issuer</i>") che a sua volta e'211il soggetto del certificato #1, il quale e' firmato da un emittente che e'212il soggetto del certificato #2, che e' finalmente firmato dalla autorita'213di certificazione ben nota <i>ValiCert, Inc.</i>, il cui certificato e'214presente nella base dati precaricata del browser215("che al mercato mio padre compro'").216</para>217218<para>219Se il gruppo di certificati non fosse stato aggiunto, sarebbe stato220visualizzato il solo certificato #0.221</para>222223</section>224225226<section id="single_http_https_server" name="Un server unico per HTTP e HTTPS">227228<para>229E' possibile configurare un singolo server che tratti sia richieste HTTP,230sia richieste HTTPS:231232<programlisting>233server {234listen 80;235listen 443 ssl;236server_name www.example.com;237ssl_certificate www.example.com.crt;238ssl_certificate_key www.example.com.key;239...240}241</programlisting>242243<note>244Prima della versione 0.7.14, SSL non poteva essere abilitato245selettivamente per singoli socket in ascolto, come nell'esempio246precedente: SSL poteva solo essere abilitato per l'intero server,247usando la direttiva <link doc="ngx_http_ssl_module.xml" id="ssl"/>,248e rendendo quindi impossibile la configurazione di un server249unico per HTTP e HTTPS.250Il parametro <literal>ssl</literal> della direttiva251<link doc="ngx_http_core_module.xml" id="listen"/> e' stato aggiunto252per risolvere questo problema. L'uso della direttiva253<link doc="ngx_http_ssl_module.xml" id="ssl"/>254e' pertanto sconsigliato nelle versioni recenti.255</note>256</para>257258</section>259260261<section id="name_based_https_servers" name="Server HTTPS name-based">262263<para>264Quando si configurano due o piu' server HTTPS in ascolto su un singolo265indirizzo IP, sorge spesso un problema:266267<programlisting>268server {269listen 443 ssl;270server_name www.example.com;271ssl_certificate www.example.com.crt;272...273}274275server {276listen 443 ssl;277server_name www.example.org;278ssl_certificate www.example.org.crt;279...280}281</programlisting>282283Con questa configurazione un browser riceve il certificato del server di default,284vale a dire <literal>www.example.com</literal>, indipendentemente da quale sia285il nome del server richiesto. Cio' e' causato dal comportamento del protocollo286SSL: la connessione SSL si stabilisce prima che il browser invii una richiesta287HTTP, percio' quando nginx ancora non sa quale sara' il nome del server richiesto;288per tale ragione, non puo' fare altro che offrire il certificato del server di default.289</para>290291<para>292Il metodo classico per risolvere questo problema consiste nell'assegnare293un indirizzo IP distinto a ciascun server HTTPS:294295<programlisting>296server {297listen 192.168.1.1:443 ssl;298server_name www.example.com;299ssl_certificate www.example.com.crt;300...301}302303server {304listen 192.168.1.2:443 ssl;305server_name www.example.org;306ssl_certificate www.example.org.crt;307...308}309</programlisting>310</para>311312313<section id="certificate_with_several_names"314name="Un certificato SSL con molti nomi">315316<para>317Ci sono altre maniere tramite cui condividere un singolo indirizzo IP318fra molti server HTTPS, tutte comunque non prive di problemi.319Ad esempio, e' possibile usare un certificato con diversi nomi di server320nel campo SubjectAltName, per esempio321<literal>www.example.com</literal> and <literal>www.example.org</literal>,322tuttavia la lunghezza del campo SubjectAltName e' limitata.323</para>324325<para>326Un'altra tecnica prevede l'uso di un certificato il cui nome e' definito con327caratteri jolly, per esempio <literal>*.example.org</literal>.328Un certificato con caratteri jolly va bene per tutti i sottodomini del329dominio specificato, ma per un solo livello: in questo caso ad esempio330verra' riconosciuta corrispondenza con <literal>www.example.org</literal>,331ma non con <literal>example.org</literal> e <literal>www.sub.example.org</literal>.332I due metodi mostrati possono essere combinati: nel campo SubjectAltName333un certificato puo' contenere sia nomi esatti sia nomi con caratteri jolly,334ad esempio <literal>example.org</literal> e <literal>*.example.org</literal>.335</para>336337<para>338Nel caso in cui si usi un certificato con nomi multipli, e' bene339indicare la posizione del relativo file e della chiave nel livello340<i>http</i> della configurazione, in maniera da avere una singola341copia in memoria da far ereditare a tutti i server:342343<programlisting>344ssl_certificate common.crt;345ssl_certificate_key common.key;346347server {348listen 443 ssl;349server_name www.example.com;350...351}352353server {354listen 443 ssl;355server_name www.example.org;356...357}358</programlisting>359</para>360361</section>362363364<section id="sni" name="Server Name Indication">365366<para>367Una soluzione piu' generale per l'uso di server HTTPS multipli su un singolo368indirizzo IP e' data dalla369<link url="http://en.wikipedia.org/wiki/Server_Name_Indication">estensione370TLS Server Name Indication</link> (SNI, RFC 6066), che consente ad un371browser di indicare il nome del server richiesto durante l'handshake SSL e,372percio', permette al server di sapere quale certificato dovrebbe essere373usato durante la connessione. Purtroppo, SNI ha un supporto piuttosto374limitato nei browser; al momento e' supportato a partire dalle seguenti375versioni:376</para>377378<para>379<list type="bullet">380381<listitem>382Opera 8.0;383</listitem>384385<listitem>386MSIE 7.0 (ma solo su Windows Vista o superiore);387</listitem>388389<listitem>390Firefox 2.0 e altri browser che usano Mozilla Platform rv:1.8.1;391</listitem>392393<listitem>394Safari 3.2.1 (la versione per Windows supporta SNI su Vista o superiore);395</listitem>396397<listitem>398Chrome (la versione per Windows supporta SNI su Vista o superiore).399</listitem>400401</list>402<note>403Con SNI e' possibile passare solo nomi di dominio, tuttavia alcuni browser404potrebbero erroneamente consentire di passare come nome anche l'indirizzo405IP del server.406E' bene comunque non fare affidamento su questo comportamento.407</note>408</para>409410<para>411Per poter usare SNI in nginx, e' necessario che sia supportato sia nella412libreria OpenSSL con cui il binario e' stato compilato, sia nella413libreria a cui e' linkato dinamicamente in esecuzione.414OpenSSL supporta SNI sin dalla versione 0.9.8f, a patto che sia stata415compilata con l'opzione di configurazione <nobr>“--enable-tlsext”</nobr>;416dalla versione 0.9.8j tale opzione e' abilitata per default.417Se nginx e' compilato con il supporto a SNI, allora l'esecuzione con418il parametro “-V” mostra:419420<programlisting>421$ nginx -V422...423TLS SNI support enabled424...425</programlisting>426427Di contro, se nginx e' stato compilato con il supporto a SNI, ma la libreria428OpenSSL a cui e' linkato dinamicamente ne e' priva, viene mostrato:429430<programlisting>431nginx was built with SNI support, however, now it is linked432dynamically to an OpenSSL library which has no tlsext support,433therefore SNI is not available434</programlisting>435</para>436437</section>438439</section>440441442<section id="compatibility" name="Compatibilita'">443444<para>445<list type="bullet">446447<listitem>448Il parametro “-V” mostra lo stato del supporto a SNI449dalla versione 0.8.21 e 0.7.62 in poi.450</listitem>451452<listitem>453Il parametro <literal>ssl</literal> della direttiva454<link doc="ngx_http_core_module.xml" id="listen"/>455e' supportato456dalla versione 0.7.14 in poi;457prima della versione 0.8.21 poteva essere specificato solo458insieme al parametro <literal>default</literal>.459</listitem>460461<listitem>462SNI e' supportato463dalla versione 0.5.32 in poi.464</listitem>465466<listitem>467La cache condivisa di sessione SSL e' supportata468dalla versione 0.5.6 in poi.469</listitem>470471</list>472</para>473474<para>475<list type="bullet">476477<listitem>478Versioni 0.7.65, 0.8.19 e successive: i protocolli SSL default sono SSLv2, TLSv1,479e TLSv1.2 (se supportati dalla libreria OpenSSL).480</listitem>481482<listitem>483Versioni 0.7.64, 0.8.18 e precedenti: i protocolli SSL default sono SSLv2,484SSLv3, e TLSv1.485</listitem>486487</list>488</para>489490<para>491<list type="bullet">492493<listitem>494Versioni 1.0.5 e successive: i sistemi di cifratura SSL default sono495“<literal>HIGH:!aNULL:!MD5</literal>”.496</listitem>497498<listitem>499Versioni 0.7.65, 0.8.20 e successive: i sistemi di cifratura SSL default sono500“<literal>HIGH:!ADH:!MD5</literal>”.501</listitem>502503<listitem>504Versione 0.8.19: i sistemi di cifratura SSL default sono505“<literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM</literal>”.506</listitem>507508<listitem>509Versioni 0.7.64, 0.8.18 e precedenti: i sistemi di cifratura SSL default sono<br/>510“<literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP</literal>”.511</listitem>512513</list>514</para>515516517</section>518519520</article>521522523