Recibo un error: SSL3_GET_RECORD: error de descifrado o registro incorrecto mac

7

Tengo mi propio servidor (donde lo estoy ejecutando Apache/2.4.27), y hoy me di cuenta de que (Brave y Google Chrome, diferentes computadoras) recibo de mis sitios web este error;

This site can’t provide a secure connection

mywebsite.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR

Y lo extraño es que recibo este error cada quinto clic en mi sitio web.

Desde mi archivo conf:

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mywebsite/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mywebsite/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/mywebsite/chain.pem
SSLCompression off

de options-ssl-apache.conf;

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder     on
SSLCompression          off

He comprobado el archivo de registro del sitio web pero nada, tampoco nada aquí; /var/log/apache2/error.log

Estoy tratando de averiguar qué está causando este error, alguna idea de dónde puedo encontrar más información o incluso mejor, ¿cómo resolver este problema?

EDITAR:

Si lo intento openssl s_client -connect mywebsite.com:443, volverá:

Estoy usando: OpenSSL 1.1.0f

CONNECTED(00000003)

...

3073276480:error:1408F119:SSL routines:ssl3_get_record:decryption failed or bad record mac:../ssl/record/ssl3_record.c:469:

OTRA EDICIÓN:

Como @quadruplebucky sugirió, cambié options-ssl-apache.conf a:

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite           HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1
SSLHonorCipherOrder     on
SSLCompression          off

#SSLSessionTickets       off

También intenté agregar SSLProtocol all -SSLv2 -SSLv3a mi archivo de conf virtualhost, y al mismo tiempo cambié un par de cosas aquí;/etc/apache2/mods-available/ssl.conf

#SSLCipherSuite HIGH:!aNULL
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

SSLHonorCipherOrder on

#   The protocols to enable.
#   Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2
#   SSL v2  is no longer supported
SSLProtocol all -SSLv2 -SSLv3

EDITAR:

Después de cambiar LogLevel en Infoél devuelve:

[Sat Jul 08 13:34:53.374307 2017] [ssl:info] [pid 8710] [client] AH02008: SSL library error 1 in handshake (server mywebsite:443)
[Sat Jul 08 13:34:53.374717 2017] [ssl:info] [pid 8710] SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message
[Sat Jul 08 13:34:53.374750 2017] [ssl:info] [pid 8710] [client] AH01998: Connection closed to child 1 with abortive shutdown (server mywebsite:443)

EDITAR:

Si ejecuto con la opción -crlf, así:

openssl s_client -crlf -connect mywebsite:443

¿No obtengo ningún error?

Una cosa más si cambio LogLevel para depurar, antes de ese error obtengo esto:

[Tue Jul 11 23:00:38.641568 2017] [core:debug] [pid 26561] protocol.c(1273): [client 188.64.25.162:23165] AH00566: request failed: malformed request line
[Tue Jul 11 23:00:38.641634 2017] [headers:debug] [pid 26561] mod_headers.c(900): AH01503: headers: ap_headers_error_filter()

Entonces, después de esto, ese mismo error sucederá:

SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message

openssl version
OpenSSL 1.1.0f  25 May 2017
usuario134969
fuente
No debería ser posible que ningún error de configuración de punto final provoque 'descifrado o mac incorrecto' (alerta 20). ¿Hay algo en la red entre estos clientes y este servidor, como un firewall, IDS, IPS, DLP o incluso un enrutador 'inteligente'? ¿Puede probar repetidamente (ya que esto puede depender de los datos y, por lo tanto, cuasialeatorio) conectarse desde el propio servidor o desde una máquina en el mismo segmento que el servidor?
dave_thompson_085
mostrar los contenidos relevantes del * .443 virtualhost (todo el virtualhost si es necesario), también la salida de "apachectl -S" para que podamos descartar la configuración incorrecta.
ezra-s
mensaje de error quejas sobre SSL v3, sin embargo, en su configuración Es discapacitados ...
alexus
Dices que estás usando OpenSSL 1.1.0f. ¿Es eso tanto en el servidor como en la máquina donde emitió los comandos s_client anteriores? ¿En qué plataforma se está ejecutando su servidor? Es posible que desee ver si el error ocurre con conjuntos de cifrado específicos, por ejemplo, ¿qué sucede si agrega "-cipher AES128-SHA" al final de su comando s_client?
Matt Caswell
ninjaed: @alexus: los nombres de funciones y archivos y algunos literales ssl3*y SSL3*en OpenSSL también se usan para TLS (1.0 a 1.2) debido a las similitudes técnicas entre esos protocolos. user134969: 'longitud demasiado corta también debe Nunca ser causado por cualquier configuración. Si eso es repetible, intente obtener un s_client -debug(con RSA simple -ciphersi no lo hizo en el servidor) y captura de wirehark para el mismo evento para que podamos ver los datos de cable reales y compararlos con lo que ve el programa.
dave_thompson_085

Respuestas:

8

A partir de ese error, no puede distinguir si su servidor está negociando SSLv3 o TLSv1 (es posible que desee ver esta pregunta en Unix y Linux y asegurarse de que esté deshabilitada en todas partes en Apache ...) --- el 1.1.0f el código fuente aquí en GitHub borra deliberadamente los dos ...

   if (enc_err < 0) {
    /*
     * A separate 'decryption_failed' alert was introduced with TLS 1.0,
     * SSL 3.0 only has 'bad_record_mac'.  But unless a decryption
     * failure is directly visible from the ciphertext anyway, we should
     * not reveal which kind of error occurred -- this might become
     * visible to an attacker (e.g. via a logfile)
     */
    al = SSL_AD_BAD_RECORD_MAC;
    SSLerr(SSL_F_SSL3_GET_RECORD,
           SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
    goto f_err;
}

Por lo tanto, es posible que desee reordenar su conjunto de cifrado:

SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

Esta publicación en askubuntu sobre la vulnerabilidad POODLE tiene una excelente lista de recursos para la inspección y fontanería SSL.

El generador de configuración de Mozilla es un excelente servicio público.

El comentario "obteniendo este error cada quinto clic" es un poco extraño. ¿Te refieres a los clics , o cada quinta línea es una mala solicitud en los registros? Intente iniciar apache de un solo subproceso (el indicador -X) y vea si eso hace lo mismo ... o tal vez la configuración SSLSessionTickets off.

Mi pensamiento aquí es eliminar el enhebrado y la coherencia / consistencia de sesión / caché como fuente de problemas. Ejecutar apache de un solo subproceso (comenzando con el indicador -X) es una forma de lograr esto, otra forma es configurar MaxClients=1(al menos con el modelo MPM). Los tickets de sesión han sido una fuente de problemas en el pasado con TLSv1.2 y están habilitados de forma predeterminada, este es el razonamiento detrás SSLSessionTickets off(tenga en cuenta que esto es parte del mensaje SSL "Server Hello", no una cookie de sesión o similar). El error 'cada quinto clic' todavía me molesta: no puedo evitar notar que la mayoría de los navegadores canalizarán cuatro solicitudes de recursos en una sola ...) y abrirán una nueva conexión (un nuevo protocolo de enlace SSL, etc.) para el quinto ... sin una captura de paquetes es difícil decir qué está pasando realmente.

Parece que ha eliminado la negociación de cifrado como fuente de error (puede duplicar la condición de error bajo especificaciones de cifrado mucho más restrictivas, a menos que me equivoque). Me gustaría saber si puede activar el error renegociando SSL (solo por patadas, por ejemplo): openssl s_client -connect server:443y luego escriba 'R', vea lo que dicen los registros.
También vea si el almacenamiento en caché de la sesión funciona con la -reconnectopción s_client.
Algo debe ser diferente sobre los contextos de recepción para las solicitudes SSL, y parece que la mejor manera de resolverlo (salvo una inspección byte por byte de lo que está pasando por el cable, que puede ser difícil de anonimizar) es severamente Limite el tamaño de lo que está escuchando (es decir, el número de oyentes).

Otras herramientas de depuración que probaría (suponiendo que publicar capturas de paquetes está fuera de discusión ...)
- ssltap (en libnss3-toolsubuntu)
- cipherscan
- sslscan

ACTUALIZACIÓN Hacer
esto a través de ssltap se parece mucho al error de OpenSSL # 3712 resurgido (básicamente, la renegociación de teclas durante la lectura / escritura). Buscando una solución decente que no elimine el rendimiento. ¡Cosas divertidas!

quadruplebucky
fuente
1
También jugaría con declaraciones SSLCipherSuite más explícitas (en la línea de lo que genera la configuración de Mozilla), establecería LogLevel en info o debug, tcpdump / wireshark pcaps, etcétera, cualquier cosa para descubrir lo que realmente está sucediendo.
quadruplebucky
1
¿Por qué no prueba una herramienta como cipherscan github.com/mozilla/cipherscan o sslscan github.com/rbsec/sslscan (también en muchos repositorios) para tratar de descubrir qué está sucediendo antes de retroceder?
quadruplebucky
Con SSLProtocol -SSLv3la conexión definitivamente no era SSL3. Recuerde que en OpenSSL las funciones (y los archivos fuente) nombrados con ssl3 siguen siendo parte de todos los protocolos TLS hasta 1.2. La eliminación de los cifrados SSLv3 (y TLSv1 solo en 1.1.0) en realidad evita que se negocie cualquier protocolo por debajo de TLS1.2, pero con navegadores actualizados eso debería estar bien.
dave_thompson_085
@ user134969: para que Wirehark descifre estas conexiones (y, por lo tanto, sea de ayuda aquí) necesita (temporalmente) restringir el intercambio de claves a RSA simple; Esto es más fácil en el lado de Apache con SSLCiphers RSA+AES. (Y proporcione el archivo de clave privada del servidor en Edición / Preferencias / Protocolos / SSL). Chrome solía quejarse de RSA simple (es decir, no PFS), pero acabo de volver a probar y el mío parece estar contento ahora.
dave_thompson_085
@quadruplebucky ¿puede señalarme cuál es la ubicación de "ssl3_record.c" en el sistema?
user134969
6

He visto esto antes, tuve esto antes, de hecho.

La respuesta en mi caso terminó siendo extremadamente sutil.

El adaptador de red habilitó la descarga del segmento TCP, que debido a un error de alguna forma estaba destruyendo (o truncando, no recuerdo) los últimos bytes de algunos mensajes, lo que posteriormente causó que fallara el MAC en los registros SSL.

Era una máquina virtual en VMWare.

Intentaría deshabilitar TSO / GSO / GRO en su entorno y ver si el problema desaparece.

ethtool -K eth0 tso off gro off gso off ufo off
Matthew Ife
fuente
Regresa: No se puede cambiar udp-fragmentation-
offload
Haz lo mismo pero omite 'ufo off'
Matthew Ife
1
Otra cosa razonablemente tonta para buscar que puede causar el truncamiento de paquetes son los problemas de MTU (las tramas gigantes están activadas cuando no deberían estarlo) o la sujeción de MSS requerida sobre TCP si envía sus datos por un túnel.
Matthew Ife
3

Hay algunas rarezas con OpenSSL y multihilo. ¿Qué MPM usas? Si esto está relacionado con subprocesos múltiples, el "prefork" debería estar seguro mientras que "trabajador" y "evento" podrían verse afectados.

Si su perfil de carga lo permite, puede intentar cambiar a prefork y ver si el problema persiste.

Andreas Rogge
fuente
así que al menos se descarta el subprocesamiento múltiple :)
Andreas Rogge
0

Primero asegúrese de que Chrome esté actualizado. Las versiones anteriores dan problemas con ciertas cifras. Tuve este problema con el cromo yo mismo con sitios comunes como Amazon, etc.

Segundo, el consejo de prohibir protocolos en la "lista de cifrado" que siguió es una muy mala idea porque no prohibirá protocolos, prohibirá la mayoría de los cifrados, incluidos los que funcionan "desde" SSLv3 (pero no significa que esté habilitando SSL3 si permite cifrados SSLv3), use una lista más genérica proporcionada por el generador de configuración SSL de Mozilla para compatibilidad (tenga en cuenta que SSLv2 ya no existe o es compatible con httpd o openssl, por lo que no hay razón para prohibirlo explícitamente) y tal vez su combinación anterior fue demasiado estricta prueba este:

SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

Si aún tiene problemas, habilite la depuración de SSL y vea lo que tiene que decir httpd (solo envíe 1 intento o dos e inhabilite este registro, esto es demasiado ruidoso):

LogLevel ssl:trace3

Notas al margen: también puede continuar y eliminar SSLCertificateChainFile ya que esa directiva está en desuso en 2.4. Puede agregar la cadena SSLCertificateFile y ordenar todos los certificados de hoja a raíz, o incluso cambiar SSLCertificateChainFile a SSLCACertificateFile (aunque este se usa principalmente para la autenticación SSL).

También debe agregar (si aún no lo ha hecho) para agregar:

SSLRandomSeed startup file:/dev/urandom 2048
SSLRandomSeed connect file:/dev/urandom 2048
SSLSessionCache shmcb:/path/to/log/ssl_gcache_data(512000)

Editar: después de nuestra conversación, recurramos a verificar la instalación de openssl y / o si realmente es la misma versión que usa su httpd:

Ejecute este comando y veamos qué dice: openssl ciphers -v 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'

También para asegurarse de que la versión de openssl es la correcta, ejecute esto:

openssl version
ezra-s
fuente
No, no lo resolví - verifique mi edición, publiqué el registro cuando uso ssl: trace3 ...
user134969
¿Es openssl versión precompilada o compilada manualmente?
ezra-s
@ user134969 Estoy agregando un comando para que pueda ver si obtiene cifrados o suficientes cifrados de su archivo openssl o si hay un problema con él.
ezra-s