Deshabilitar RC4 en el conjunto de cifrado SSL de un servidor Apache

17

Por favor, vea las secciones EDITAR en mi propia respuesta; Contienen una explicación a este enigma .

Estoy tratando de deshabilitar RC4 para un servidor Apache 2.2.9 que se ejecuta en un CentOS 6.5 VPS y parece que no puedo tener éxito.

Se instaló un certificado validado por un negocio recientemente adquirido y las conexiones SSL funcionan bien, pero quería configurar las cosas lo mejor posible para "fortalecer la seguridad", como dicen algunos tutoriales.

Verificando la configuración con Qualys SSL Labs, la página de resultados muestra "Este servidor acepta el cifrado RC4, que es débil. Grado limitado a B".

Sin embargo, he puesto esto en ssl.conf:

 SSLCipherSuite HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!SSLv2:!SSLv3

He guardado la secuencia de comandos dada en la respuesta a esta pregunta en un archivo llamado test-ssl-ciphers.sh y he cambiado la dirección IP a una dirección de bucle invertido. Este es el resultado de ./test-ssl-ciphers.sh | grep -i "RC4":

Testing ECDHE-RSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ECDHE-ECDSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing AECDH-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ADH-RC4-MD5...NO (sslv3 alert handshake failure)
Testing ECDH-RSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing ECDH-ECDSA-RC4-SHA...NO (sslv3 alert handshake failure)
Testing RC4-SHA...NO (sslv3 alert handshake failure)
Testing RC4-MD5...NO (sslv3 alert handshake failure)
Testing RC4-MD5...NO (sslv3 alert handshake failure)
Testing PSK-RC4-SHA...NO (no ciphers available)
Testing KRB5-RC4-SHA...NO (no ciphers available)
Testing KRB5-RC4-MD5...NO (no ciphers available)
Testing EXP-ADH-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-RC4-MD5...NO (sslv3 alert handshake failure)
Testing EXP-KRB5-RC4-SHA...NO (no ciphers available)
Testing EXP-KRB5-RC4-MD5...NO (no ciphers available)

Cada una de estas líneas contiene "NO", lo que, según el script, significa que el servidor no admite la combinación de cifrado especificada.

Además, el comando grep -i -r "RC4" /etc/httpdsolo me da el archivo ssl.conf mencionado anteriormente.

Además, ejecutar openssl ciphers -Ven mi suite de cifrado no muestra ningún cifrado RC4, lo que tiene sentido dada la cadena de configuración.

Por lo tanto, de alguna manera estoy perdido por qué los sitios web de verificación SSL me dicen que "el servidor acepta RC4". Incluso enumeran los siguientes cifrados como aceptados:

TLS_RSA_WITH_RC4_128_MD5
TLS_RSA_WITH_RC4_128_SHA
TLS_ECDHE_RSA_WITH_RC4_128_SHA

¿Alguien tiene una posible explicación? ¿Qué estoy haciendo algo mal? ¿Quizás haya otro lugar donde se configure ese soporte de RC4 o "aceptación"?

Gracias.

[ EDITAR ] Utilizando un CentOS 6.6 en una máquina virtual en casa, ejecuté el script nuevamente contra mi VPS usando su nombre de dominio en lugar de la dirección de bucle invertido. Esta configuración implica que la instancia de openssl proporciona la lista de cifrados en la máquina virtual: todavía no tengo RC4 entre los cifrados que producen SÍ.

AbVog
fuente

Respuestas:

16

Al instalar el certificado renovado, descubrí que el problema fue causado al especificar (para el dominio y para cada subdominio) en ISPConfig todo el conjunto de datos necesarios para HTTPS: certificado, clave privada, cadena de CA, etc.

Dicho de otra manera, eliminar el conjunto de datos llevó a la prueba de Qualys para calificar el dominio A y al mismo tiempo eliminar las advertencias sobre RC4. Volver a poner los detalles lleva a que vuelvan las advertencias y que la calificación se limite nuevamente a B, lo que no deja lugar a dudas sobre el vínculo de causalidad.

Es como si la entrega de los detalles para cada vhost de alguna manera creara un nuevo entorno en el que algunos valores predeterminados hayan anulado el conjunto de cifrado que he especificado en ssl.conf. Extraño.

La solución es agregar la especificación SSLCipherSuite en el área de texto de Directivas de Apache para cada vhost. Esto es lo que tengo en la configuración que me da una calificación de A:

SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder on
# Compression is disabled by default on my distribution (CentOS 6)
# SSLCompression off 
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

EDITAR (2017-05-16): Un hallazgo adicional sobre este problema: la especificación de SSLCipherSuitees obligatoria. No puedo entender por qué esa directiva específica, aunque se especifica a nivel de servidor, no se aplica automáticamente a las configuraciones de host virtual . Estoy ejecutando Apache 2.2.15 en CentOS 6.9.

EDITAR (2018-06-18): más información. Acabo de descubrir que la SSLCipherSuitedirectiva se puede especificar una sola vez y se aplicará a todos los hosts virtuales: en el archivo de configuración base mod_ssl (en CentOS 6, el archivo se encuentra en /etc/httpd/conf.d/ssl.conf), simplemente tiene que especificar la directiva fuera de El virtualhost predeterminado. La documentación de Apache 2.2 indica que el valor predeterminado de esta directiva es SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP. Creo que de aquí proviene el cifrado RC4: en ausencia de cualquier especificación, que fue el caso para mí ya que ninguna especificación estaba en el contexto "global", se aplica el valor predeterminado. Esta comprensión termina lo que ha sido un misterio para mí. Irónicamente, ¡estoy a punto de cambiar a CentOS 7 cuando encuentre esta explicación! HTH

AbVog
fuente
6
SSLCipherSuite HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!SSLv2:!SSLv3
                                                                    ^^^^^^^

Mala idea. Deshabilitar todos los cifrados SSLv3 resulta en deshabilitar los cifrados utilizables con TLS1.0 y TLS1.1 y deja solo unos pocos cifrados recientemente introducidos con TLS1.2 (si su servidor es compatible con TLS1.2)

Por lo tanto, de alguna manera estoy perdido por qué los sitios web de verificación SSL me dicen que "el servidor acepta RC4". Incluso enumeran los siguientes cifrados como aceptados:

Asegúrese de que las pruebas locales y externas accedan al mismo servidor (dirección IP). He visto muchos sitios donde se example.comencuentra en un host diferente www.example.comy, por lo tanto, las pruebas difieren.

Steffen Ullrich
fuente
Sí, el dominio raíz y sus subdominios están en el mismo VPS. Hay una dirección IP asociada con el VPS y uso ISPConfig para administrarlo. Gracias.
AbVog
Use SSLLabs . Compare la IP que le muestran con la IP que tiene su sistema. Asegúrese de no tener algún otro proxy (inverso) o CDN al frente que pueda afectar el resultado.
Steffen Ullrich
"Deshabilitar todos los cifrados SSLv3 resulta en deshabilitar los cifrados utilizables con TLS1.0 y TLS1.1 y deja solo unos pocos cifrados recién introducidos con TLS1.2 (si su servidor es compatible con TLS1.2)" Entonces, ¿cuál es la solución adecuada?
Rohn Adams
@RohnAdams: si el objetivo es deshabilitar RC4, entonces la parte '! RC4' está bien. El problema era la sobrebloqueo mediante el uso adicional de '! SSLv3'. En cuanto a los cifrados útiles para usar, vea Generador de cifrado de Mozilla .
Steffen Ullrich
2

Qualys SSL labs parece muy sensible a los hosts predeterminados, etc. Verifique que TODOS sus HTTPS VirtualHosts en esa dirección IP usen exactamente la misma configuración (aparte de los archivos de certificado), tuve un problema similar en el que algunas de las pruebas de Qualys probaron en mi VirtualHost objetivo y algunas de las pruebas parecían recoger un VirtualHost predeterminado. Mi vhost objetivo tenía solo un cifrado habilitado, pero Qualys estaba encontrando una lista mucho más grande del vhost predeterminado.

También encontré un script de mejor aspecto aquí que brinda información más exhaustiva sobre las pruebas SSL.

Geoff
fuente
2

Solo estaba mirando esto para uno de mis sitios. Sobre la base de la respuesta de @ AbVog, descubrí que mis directivas en realidad solo estaban dentro del vhost predeterminado. Cuando trasladé las directivas al contexto global, todo estuvo bien.

Como comentario aparte, también me encontré con https://cipherli.st/ que tiene una buena lista de configuración SSL para un montón de paquetes diferentes. La recomendación actual para apache es la siguiente:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff

# Requires Apache >= 2.4
SSLCompression off 
SSLSessionTickets Off
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)" 
boyvinall
fuente
0

En mi Fedora 25 con Apache / 2.4.25 los cifrados son manejados por las políticas de cifrado (ver / etc / cryptopolicies / backends). La configuración predeterminada tiene RC4 completamente deshabilitado, por lo que no es necesario manipular los cifrados en la configuración de Apache. Excepto por asegurarse de usar el último ssl.conf, ya que no está instalado de manera predeterminada, sino que se deja como ssl.conf.rpmnew en el directorio conf.d.

Para configurar SSL, solo tenía que especificar los certificados, ServerName y DocumentRoot. Para Squirrelmail que es.

SSLCertificateFile /etc/letsencrypt/live/mail.xxxx.dk/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mail.xxxx.dk/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mail.xxxx.dk/chain.pem
SSLCACertificateFile /etc/letsencrypt/live/mail.xxxx.dk/fullchain.pem
ServerName mail.xxxx.dk:443
DocumentRoot "/usr/share/squirrelmail"
John Damm Sørensen
fuente