Principales diferencias en la versión del controlador Microsoft ODBC para SQL Server

Este artículo describe los cambios repentinos entre el controlador ODBC 18 de Microsoft para SQL Server y la versión 17.

La mayoría de las aplicaciones que actualizan de la versión 17 a la 18 se ven afectadas por un solo cambio: las conexiones se cifran por defecto. Si tu aplicación deja de conectarse después de actualizar, lee primero el comportamiento de cifrado por defecto .

Resumen de los cambios

Area Versión 17 Versión 18 y versiones posteriores
Configuración predeterminada Encrypt no yes
Encrypt Valores aceptados yes, no yes, no, Mandatory, Optional, Strict
Modos de cifrado Fuera o fuera Apagado, encendido o estricto
Validación de certificados de servidor No ocurre a menos que solicites cifrado Ocurre por defecto, porque el cifrado está activado por defecto
Palabras clave de cadena de conexión Conjunto base Conjunto base más nuevas palabras clave

Cambios de cifrado

Comportamiento de cifrado predeterminado

En la versión 17, las conexiones no están cifradas a menos que pidas cifrado o el servidor lo requiera. En la versión 18 y versiones posteriores, las conexiones están cifradas por defecto.

Como el controlador valida el certificado del servidor cada vez que cifra una conexión, una aplicación que se conecta a un servidor con un certificado autofirmado o no confiable se conecta con éxito con la versión 17 y falla con la versión 18. El fallo es un error de validación de certificado, no de autenticación.

Tienes tres formas de resolverlo, listadas de la más a la menos segura:

  • Instala un certificado en el servidor en el que el cliente confíe. Esta opción es la recomendada y es la única que mantiene tanto el cifrado como la validación.
  • Mantén el cifrado activado y dile al controlador qué nombre validar, configurando HostNameInCertificate o ServerCertificate.
  • Desactiva el cifrado para restaurar la versión 17 por defecto, añadiendo Encrypt=no a la cadena de conexión.

Caution

La configuración TrustServerCertificate=yes mantiene la conexión cifrada pero deshabilita la validación del certificado, lo que deja la conexión abierta a ataques de adversarios en medio. Prefiero un certificado de confianza.

Cifrar valores

La versión 17 acepta solo yes y no. La versión 18 y versiones posteriores aceptan esos valores y añaden tres más:

Value Equivalente a Comportamiento
Mandatory yes La conexión está cifrada.
Optional no La conexión no está cifrada a menos que el servidor lo requiera.
Strict Ninguno La conexión utiliza cifrado TDS 8.0.

Strict no tiene equivalente a la versión 17. Es el único valor que selecciona TDS 8.0, donde el cifrado se negocia antes del intercambio de inicio de sesión en lugar de durante él.

Restaurar comportamiento de cifrado de la versión 17

Para restaurar el comportamiento por defecto de la versión 17, se establece Encrypt explícitamente:

Driver={ODBC Driver 18 for SQL Server};Server=<server>;Database=<database>;UID=<user_id>;PWD=<password>;Encrypt=no;

Establecer el valor explícitamente es beneficioso incluso en la versión 17, porque hace que la cadena de conexión se comporte igual en ambas versiones.

Nuevas palabras clave de cadena de conexión

La versión 18 añade las siguientes palabras clave de cadena de conexión, que la versión 17 no reconoce:

Keyword propósito
ConcatNullYieldsNull Determina si concatenar un valor nulo produce nulo.
GetDataExtensions Controla qué SQLGetData extensiones habilita el driver.
HostNameInCertificate Especifica el nombre de host a validar en el certificado TLS del servidor.
IpAddressPreference Especifica la familia de direcciones IP que el controlador prueba primero.
LongAsMax Asigna tipos de datos largos a sus max equivalentes.
RetryExec Configura las reglas de reintento para consultas fallidas.
ServerCertificate Especifica la ruta hacia un archivo de certificado para validar el servidor.

Se introdujeron palabras clave individuales en diferentes versiones de la versión 18. Para la versión que introdujo cada palabra clave y para la referencia completa de palabras clave, véase ODBC DSN y palabras clave de cadena de conexión.