Como reparar el problemita SECDoClientHandshake cuando querés conectarte a un viejo SQL 2009 instalado en un Windows Server 2003 desde un Windows 11

  • 1 Sep 2023
  • Windows Server, Windows 11

Escenario

Tenemos en nuestro Windows 11 un Excel que se conecta directamente o a través de un ODBC a un viejo Windows Server, por ejemplo un 2003. De repente y como quien no quiere la cosa, la conexión deja de funcionar arrojando un error SQLState: 08001. Resulta que desde otros equipos, la conexión sigue funcionando. Por ejemplo en un Windows 10 con un ODBC con versión del Driver SQL Server 10.00.19041. Sucede que nuestro Windows 11 se actualizó a B. 22621 y ya no puede hacer handshake con nuestro viejo servidor. 

El mensaje de error en Windows 11 al intentar conectarnos al Windows Server 2003

Error de SQL Server: 18
[Microsoft][ODBC SQL Server Driver][DBNETLIB] Error de seguridad de SSL

Problema

Mientras cliente y servidor se ponen a negociar en que idioma y tono van a comenzar una comunicación, ninguna cipher suite del cliente es comprendida por el servidor.

Solución

El primer paso es encontrar la lista de cipher suites del server, para eso usamos nmap con el puerto de SQL Server. En mi caso en el mismo Ubuntu dentro Windows 11.

nmap --script ssl-enum-ciphers -p 1433 ip_de_tu_sql_server
Starting Nmap 7.80 ( https://nmap.org )
Nmap scan report for ip_de_tu_sql_server
Host is up (0.31s latency).

PORT     STATE SERVICE
1433/tcp open  ms-sql-s
| ssl-enum-ciphers:
|   SSLv3:
|     ciphers:
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
|       TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
|       TLS_RSA_WITH_DES_CBC_SHA (rsa 1024) - D
|       TLS_RSA_EXPORT1024_WITH_RC4_56_SHA - D
|       TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA - D
|       TLS_RSA_EXPORT_WITH_RC4_40_MD5 - E
|       TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 - E
|     compressors:
|       NULL
|     cipher preference: server
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher DES vulnerable to SWEET32 attack
|       64-bit block cipher RC2 vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       CBC-mode cipher in SSLv3 (CVE-2014-3566)
|       Ciphersuite uses MD5 for message integrity
|       Forward Secrecy not supported by any cipher
|       Weak certificate signature: SHA1
|   TLSv1.0:
|     ciphers:
|       TLS_RSA_WITH_RC4_128_MD5 (rsa 1024) - D
|       TLS_RSA_WITH_RC4_128_SHA (rsa 1024) - D
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 1024) - D
|       TLS_RSA_WITH_DES_CBC_SHA (rsa 1024) - D
|       TLS_RSA_EXPORT1024_WITH_RC4_56_SHA - D
|       TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA - D
|       TLS_RSA_EXPORT_WITH_RC4_40_MD5 - E
|       TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 - E
|     compressors:
|       NULL
|     cipher preference: server
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|       64-bit block cipher DES vulnerable to SWEET32 attack
|       64-bit block cipher RC2 vulnerable to SWEET32 attack
|       Broken cipher RC4 is deprecated by RFC 7465
|       Ciphersuite uses MD5 for message integrity
|       Forward Secrecy not supported by any cipher
|       Weak certificate signature: SHA1
|_  least strength: E

Ahora vamos a hacer lo mismo pero para el cliente. En este caso con un comando en PowerShell

Get-ItemPropertyValue  -Path HKLM:\System\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\ -Name Functions

Este comando también lo vamos a ejecutar en un equipo con Windows 10 que no tenga problemas de comunicación con el server. Entonces tendremos las cipher suites del server, del cliente que funciona y del cliente que no (nuestro Windows 11). Este trabajito es más cómodo hacerlo con un Excel. Comparando los valores notamos que TLS_RSA_WITH_3DES_EDE_CBC_SHA está en el server, está en el Windows 10 que se conecta y no en el Windows 11.

Agregar una cipher suite en Windows

Para agregar una cipher suite fácilmente vamos a aprovechar la ayuda de IIS Crypto cuya referencia encontramos en esta página de Microsoft Learn.

Lo primero que vamos a hacer es ir a la sección advanced y hacemos un backup del registro (Backup registry). Será fundamental para no necesitar la máquina del tiempo.

Luego, vamos a verificar en la sección Schannel que TLS 1.0 esté seleccionado en Server protocols y Client protocols. TLS 1.0 podemos habilitarlo directamente en las opciones de internet de Windows.

IIS Crypto - Schannels

Vamos a ir a la sección cipher suites, hacemos click en el último botón verde para agregar una nueva cipher suite y simplemente escribimos: TLS_RSA_WITH_3DES_EDE_CBC_SHA. Luego, hacemos click en el primer botón para seleccionar todas las cipher suites.

IIS Crypto - Cipher Suites

IIS Crypto se ocupará de modificar el registro en HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002\Functions

TLS_RSA_WITH_3DES_EDE_CBC_SHA,TLS_AES_256_GCM_SHA384,TLS_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA

Aplicar cambios, reiniciar el equipo y el problema debería haber desaparecido.