Nei giorni scorsi, ho avuto il successo a metà strada con la sicurezza dei miei siti web. Finora, ho raggiunto il seguente:
-
Ottieni un certificato da letsencrypt.org, proteggendo i domini example1.com, example2.com ed example3.com (la dimensione della chiave RSA è 4096 bit, example1.com è il CN del certificato, example2.com e example3.com sono subjectAltNames)
-
Configura Apache per utilizzare solo TLSv1.2
-
Configura Apache per usare solo cifrari che considero sicuri (cioè senza RC4, senza SHA1, senza cifrari con CBC e così via) e che forniscono PFS (cioè solo cifrari che offrono scambio di chiavi DHE o ECDHE)
-
Configura gli host virtuali in Apache in modo che sia presente un host HTTP e un host HTTPS per example1.com, ma ancora solo host HTTP per esempio2. com e example3.com
Si noti che tutti e tre i domini / host virtuali sono in esecuzione sullo stesso indirizzo IP e che io uso il modulo Apache SSL (mod_ssl).
Questa configurazione funziona nel senso che posso visualizzare link , link , link e link esattamente come previsto all'interno dell'attuale (più recente) versioni di IE 11, FF e Chrome (attualmente non sono interessato a far funzionare le cose con altri browser).
I seguenti sono i frammenti rilevanti dalla mia configurazione di Apache.
File di configurazione per example1.com:
<Directory /home/www/example1>
Require all granted
AllowOverride none
Options IncludesNOEXEC
DirectoryIndex index.shtml
</Directory>
<VirtualHost example1.com:80>
ServerAdmin ...
DocumentRoot /home/www/example1
ServerName example1.com
ServerAlias *.example1.com
CustomLog ...
ErrorLog ...
</VirtualHost>
<VirtualHost example1.com:443>
ServerAdmin ...
DocumentRoot /home/www/example1
ServerName example1.com
ServerAlias *.example1.com
CustomLog ...
ErrorLog ...
SSLEngine on
SSLCompression off
SSLHonorCipherOrder on
SSLInsecureRenegotiation off
SSLOptions +StrictRequire
SSLCertificateFile /etc/letsencrypt/live/example1.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example1.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example1.com/chain.pem
SSLProtocol TLSv1.2
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256
</VirtualHost>
File di configurazione per esempio2.com (come sopra, ma senza la sezione host virtuale SSL):
<Directory /home/www/example2>
Require all granted
AllowOverride none
Options IncludesNOEXEC
DirectoryIndex index.shtml
</Directory>
<VirtualHost example2.com:80>
ServerAdmin ...
DocumentRoot /home/www/example2
ServerName example2.com
ServerAlias *.example2.com
CustomLog ...
ErrorLog ...
</VirtualHost>
Il file di configurazione per esempio3.com è simile a quello di example2.com con tutte le occorrenze di "esempio2" sostituite da "esempio3".
Il problema:
Non appena aggiungo la sezione host virtuale SSL per example2.com o / e example3.com, né FF né Chrome si connetteranno a qualsiasi dei siti HTTPS, cioè questo si rompe link che in precedenza funzionava. In altre parole, se cambio il file di configurazione example2.com in
<Directory /home/www/example2>
Require all granted
AllowOverride none
Options IncludesNOEXEC
DirectoryIndex index.shtml
</Directory>
<VirtualHost example2.com:80>
ServerAdmin ...
DocumentRoot /home/www/example2
ServerName example2.com
ServerAlias *.example2.com
CustomLog ...
ErrorLog ...
</VirtualHost>
<VirtualHost example2.com:443>
ServerAdmin ...
DocumentRoot /home/www/example2
ServerName example2.com
ServerAlias *.example2.com
CustomLog ...
ErrorLog ...
SSLEngine on
SSLCompression off
SSLHonorCipherOrder on
SSLInsecureRenegotiation off
SSLOptions +StrictRequire
SSLCertificateFile /etc/letsencrypt/live/example1.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example1.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example1.com/chain.pem
SSLProtocol TLSv1.2
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-DSS-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256
</VirtualHost>
e fai la stessa cosa per example3.com, questo interrompe tutti i siti HTTPS. A volte, IE, FF e Chrome saranno in grado di connettersi a uno di questi siti HTTPS, ma non è possibile prevedere quale e in quali circostanze (forse una cosa cache - non ne sono completamente sicuro).
Ho annusato il traffico rispettivo con Wireshark, ma sfortunatamente questo non ha portato a nulla: Apache interrompe l'handshake della connessione SSL con il codice di errore 40 / "handshake failure".
La cosa strana è che tutte le connessioni HTTPS (cioè link , link e link ) funzionano in modo affidabile con tutti e tre i browser se rimuovo la direttiva SSLCipherSuite
da ogni file di configurazione.
Sono consapevole che SNI avrebbe bisogno di TLSv1, ma la mia sensazione è che questo non sia un problema SNI. Secondo molti articoli, io non ho bisogno di SNI anche quando eseguo più host SSL virtuali sullo stesso indirizzo IP se tutti i nomi di dominio (nomi di host virtuali) sono nello stesso certificato e questa è esattamente la mia situazione Mi piacerebbe sottolineare ancora una volta che usando la direttiva
SSLCertificateFile /etc/letsencrypt/live/example1.com/cert.pem
in tutti e tre i file di configurazione non è un refuso poiché quel certificato contiene i tre nomi di dominio in esso contenuti.
Quindi, potrebbe piacere a qualcuno spiegare cosa sta succedendo lì e forse dare qualche suggerimento su come raggiungere il mio obiettivo (server cipher suite e restrizione del protocollo TLS come mostrato sopra, tutti i nomi di dominio in un certificato, tutti gli host virtuali (domini) allo stesso indirizzo IP)? Ho già fatto test con Apache 2.2 e 2.4, ma senza risultati.