Indicazione Nome Server (SNI)

L' IBM HTTP Server for i supporta l'Indicazione del nome server. Server Name Indicazione è un'estensione ai protocolli SSL e TLS che indica quale hostname il client sta tentando di connettersi all'inizio del processo di handshake.

Server Name Indicazione è un'estensione ai protocolli SSL e TLS che indica quale hostname il client sta tentando di connettersi all'inizio del processo di handshake. Ciò consente a un server di presentare più certificati sullo stesso indirizzo IP e numero di porta e di conseguenza consente di far scattare più siti web sicuri (HTTPS) senza richiedere tutti quei siti per utilizzare lo stesso certificato. È l'equivalente concettuale a HTTP/1.1 hosting virtuale per HTTPS.

Name - Based Virtual Hosting è un metodo molto popolare per identificare diversi host virtuali. Consente di utilizzare lo stesso indirizzo IP e lo stesso numero di porta per molti siti diversi. Quando le persone si spostano su SSL, sembra naturale supporre che lo stesso metodo possa essere utilizzato per avere molti host virtuali SSL sullo stesso server. Ma in realtà non è generalmente possibile senza il supporto SNI. Il motivo è che il protocollo SSL è uno strato separato che racchiude il protocollo HTTP. Quindi la sessione SSL è una transazione separata, che si svolge prima dell'inizio della sessione HTTP. Il server riceve una richiesta SSL su indirizzo IP X e porta Y (di solito 443). Dal momento che la richiesta SSL non conteneva alcun Host: campo, il server non aveva modo di decidere quale host virtuale SSL utilizzare. Di solito, ha appena usato il primo che ha trovato che corrisponde all'indirizzo di porta e IP specificato.

La soluzione è un'estensione al protocollo SSL chiamato Server Name Indication (RFC 4366), che consente al client di includere il nome hostname richiesto nel primo messaggio del suo handshake SSL (setup della connessione). Ciò consente al server di determinare il corretto host virtuale indicato per la richiesta e impostare di conseguenza la connessione fin dall'inizio.

Con SNI è possibile avere molti host virtuali che condividono lo stesso indirizzo IP e porta e ognuno può avere il proprio certificato univoco (e il resto della configurazione). Se sia il server Apache che il browser supportano SNI, il nome host è incluso nella richiesta SSL originale e il server web può selezionare l'host virtuale SSL corretto.

Il browser client deve inoltre supportare SNI. Di seguito alcuni browser che fanno:

  • Mozilla Firefox 2.0 o successivo
  • Opera 8.0 o successiva (con TLS 1.1 abilitato)
  • Internet Explorer 7.0 o versioni successive (su Vista o versioni successive, non funziona su XP)
  • Google Chrome (Vista o superiore. XP su Chrome 6 o newer. Mac OS X 10.5.7 o versione successiva su Chrome 5.0.342.1 o versione successiva)
  • Safari 3.2.1 o versioni successive (su Mac OS X 10.5.6 e Windows Vista o versioni successive)

Il primo host virtuale (predefinito) per gli host virtuali basati sul nome SSL deve includere TLSv1 come protocollo consentito, altrimenti Apache non accetterà le informazioni SNI dal client e sarà come se il client non supportasse affatto SNI.

Dal momento che il primo host virtuale (predefinito) verrà utilizzato per qualsiasi richiesta in cui il nome server fornito non corrisponde a un altro host virtuale, è importante che il primo host virtuale abbia il controllo di accesso più restrittivo, altrimenti i client possono accedere a risorse limitate inviando una richiesta per qualsiasi hostname sconosciuto. (Questo non è in realtà diverso dall'utilizzo di host virtuali senza SSL.)

Specificare entrambe le direttive SSLServerCert e ServerName per impostare il certificato del server e il nome dominio completo (FQDN) per quegli host virtuali specifici basati sul nome per avere il supporto SNI.

Esempio:

<VirtualHost *:443>
    SSLEngine On
    SSLAppName QIBM_HTTP_SERVER_APACHE1
    DocumentRoot /www/webserver/example1
    ServerName www.example1.com
    SSLServerCert QIBM_HTTP_SERVER_CERT1
</VirtualHost>
<VirtualHost *:443>
    SSLEngine On
    SSLAppName QIBM_HTTP_SERVER_APACHE2
    DocumentRoot /www/webserver/example2
    ServerName www.example2.com
    SSLServerCert QIBM_HTTP_SERVER_CERT2
</VirtualHost>