En los últimos días, tuve medio éxito con la protección de mis sitios web. Hasta ahora, he logrado lo siguiente:
-
Obtenga un certificado de letsencrypt.org, asegurando los dominios example1.com, example2.com y example3.com (el tamaño de la clave RSA es 4096 bits, example1.com es el CN del certificado, example2.com y example3.com son subjectAltNames)
-
Configure Apache para utilizar solo TLSv1.2
-
Configure Apache para usar solo cifrados que estoy considerando seguro (es decir, sin RC4, sin SHA1, sin cifrados con CBC y así sucesivamente) y que proporcionan PFS (es decir, solo cifrados que ofrecen intercambio de claves DHE o ECDHE)
-
Configure los hosts virtuales en Apache para que haya un host HTTP y un host HTTPS para example1.com, pero todavía solo hosts HTTP para example2. com y example3.com
Tenga en cuenta que los tres dominios / hosts virtuales se ejecutan en la misma dirección IP y que uso el módulo Apache SSL (mod_ssl).
Esta configuración funciona en el sentido de que puedo ver enlace , enlace , enlace y enlace exactamente como se pretende desde el actual (las versiones más recientes) de IE 11, FF y Chrome (actualmente no estoy interesado en hacer que las cosas funcionen con otros navegadores).
Los siguientes son los fragmentos relevantes de mi configuración de Apache.
Archivo de configuración para 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>
Archivo de configuración para example2.com (como el anterior, pero sin la sección de host virtual 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>
El archivo de configuración para example3.com es similar al de example2.com con todas las apariciones de "example2" reemplazadas por "example3".
El problema:
Tan pronto como agregue la sección de host virtual SSL para example2.com y / y example3.com, ni FF ni Chrome se conectarán a cualquiera de los sitios HTTPS, es decir, esto rompe enlace que anteriormente ha estado funcionando. En otras palabras, si cambio el archivo de configuración example2.com a
<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>
y haga lo mismo con example3.com, esto rompe todos los sitios HTTPS. A veces, IE, FF y Chrome podrán conectarse a uno de estos sitios HTTPS, pero no se puede predecir a cuál y bajo qué circunstancias (quizás sea una cuestión de caché, no estoy completamente seguro).
He olfateado el tráfico respectivo con Wireshark, pero desafortunadamente, eso no condujo a nada: Apache simplemente aborta el protocolo de enlace de la conexión SSL con el código de error 40 / "falla del protocolo de enlace".
Lo extraño es que todas las conexiones HTTPS (es decir, enlace , enlace y enlace ) funcionan de manera confiable con los tres navegadores si elimino la directiva SSLCipherSuite
de cada archivo de configuración.
Soy consciente de que SNI necesitaría TLSv1, pero creo que esto no es un problema de SNI. De acuerdo con varios artículos, no necesito SNI incluso cuando ejecuto varios hosts SSL virtuales en la misma dirección IP si todos los nombres de dominio (nombres de host virtual) están en el mismo certificado , y esa es exactamente mi situación. Me gustaría subrayar una vez más que utilizando la directiva
SSLCertificateFile /etc/letsencrypt/live/example1.com/cert.pem
en los tres archivos de configuración no es un error tipográfico, ya que ese certificado contiene los tres nombres de dominio.
Por lo tanto, podría complacer a alguien lo que está sucediendo allí y quizás dar algunas sugerencias sobre cómo lograr mi objetivo (conjunto de cifrado del lado del servidor y protocolo de restricción TLS como se muestra arriba, todos los nombres de dominio en un certificado, todos los hosts virtuales (dominios) en la misma dirección IP)? Ya he realizado pruebas con Apache 2.2 y 2.4, pero sin éxito.