Cifrado y validación de certificados en Microsoft.Data.SqlClient

Descargar ADO.NET

Utiliza la Seguridad de la Capa de Transporte (TLS) para cifrar el tráfico entre tu aplicación y SQL Server. Mantén activada la validación del certificado del servidor para verificar la identidad del servidor. El cifrado sin validación de identidad no protege contra un adversario intermedio que se hace pasar por el servidor.

Microsoft.Data.SqlClient usa Encrypt=Mandatory y TrustServerCertificate=false de forma predeterminada. Encrypt=true es un sinónimo de Mandatory. Para una conexión remota, solicita explícitamente estos ajustes y proporciona un certificado de servidor que el cliente pueda validar:

Server=tcp:<server>,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;MultiSubnetFailover=true;

Sustituye los marcadores de posición y utiliza un método de autenticación compatible con el entorno de tu servidor y aplicación. Para Azure SQL o base de datos SQL en Microsoft Fabric, véase Microsoft Entra authentication.

Elige un modo de cifrado

Encrypt Controla si el cliente necesita cifrado. Un servidor también puede requerir cifrado. Esta tabla describe el comportamiento actual sin fijación de certificado:

Configuración del cliente Requisito del servidor Validación de certificados Resultado
Encrypt=Optional o false No fuerza el cifrado. Ninguno, independientemente de TrustServerCertificate. Solo los paquetes de inicio de sesión están cifrados. El tráfico posterior no está cifrado.
Encrypt=Optional;TrustServerCertificate=false Fuerza el cifrado. Cadena de confianza, validez y nombre del servidor. Todo el tráfico está cifrado. Los certificados inválidos provocan el fallo de la conexión.
Encrypt=Optional;TrustServerCertificate=true Fuerza el cifrado. Omitido. Todo el tráfico está cifrado, pero la identidad del servidor no está verificada.
Encrypt=Mandatory;TrustServerCertificate=false Cualquiera de las dos configuraciones. Cadena de confianza, validez y nombre del servidor. Todo el tráfico está cifrado. Los certificados inválidos provocan un fallo en la conexión.
Encrypt=Mandatory;TrustServerCertificate=true Cualquiera de las dos configuraciones. Omitido. Todo el tráfico está cifrado, pero la identidad del servidor no está verificada.
Encrypt=Strict Soporta Tabular Data Stream (TDS) 8.0. Required. TrustServerCertificate no puede eludirlo. TLS empieza antes que los mensajes TDS. Un servidor no soportado o un certificado inválido falla la conexión.

Úsalos Mandatory para conexiones cifradas a servidores que no soportan TDS 8.0. Úsalo Strict cuando tu endpoint soporte TDS 8.0, incluyendo SQL Server 2022 (16.x) y versiones posteriores. TDS 8.0 soporta TLS 1.2 y TLS 1.3; no requiere TLS 1.3. La versión negociada de TLS también depende del cliente, servidor y configuración del sistema operativo.

Optional No es una solución para errores de certificado. Puede dejar los datos de la aplicación sin cifrar cuando el servidor no requiere cifrado.

Configurar un certificado de servidor verificable

Para la validación normal de certificados:

  1. Provisiona un certificado que cumpla con los requisitos de certificado de SQL Server.
  2. Incluye el nombre que los clientes utilizan para conectarse en el nombre alternativo del sujeto (SAN) del certificado.
  3. Haz que la autoridad certificadora emisora y cualquier certificado intermedio requerido sean confiables en cada host o contenedor cliente.
  4. Configure SQL Server para usar el certificado y mantener TrustServerCertificate=false en los clientes.
  5. Renovación del certificado de plan antes de la expiración, incluyendo cualquier cambio en los nombres o en las autoridades emisoras.

Un certificado de una autoridad pública o de certificación empresarial puede cumplir estos requisitos. Un certificado empresarial no es automáticamente confiable dentro de un contenedor Linux ni en un ordenador desarrollador separado.

Conéctate mediante un alias

Si la conexión utiliza un alias del Sistema de Nombres de Dominio (DNS) que no está en el certificado, primero considera emitir un certificado que incluya el alias. Alternativamente, se establece HostNameInCertificate al nombre esperado en el certificado:

Server=tcp:sql-alias.contoso.com,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=sql-server.contoso.com;MultiSubnetFailover=true;

HostNameInCertificate cambia el nombre que SqlClient espera durante la validación del certificado. No cambia el destino de la red ni evita las comprobaciones de cadena de confianza y caducidad. Déjalo sin configurar cuando el nombre del servidor ya coincide con el certificado.

Fijar un certificado de servidor específico

ServerCertificate proporciona un archivo de certificado local para la comparación exacta con el certificado del servidor. Los formatos soportados son Privacy-Enhanced Mail (PEM) y Reglas de Codificación Distinguida (DER), incluyendo .cer archivos de certificados. Úsalo con Encrypt=Mandatory o Encrypt=Strict, y mantén TrustServerCertificate=false.

Server=tcp:<server>,1433;Database=<database>;Integrated Security=true;Encrypt=Strict;TrustServerCertificate=false;ServerCertificate=C:\certificates\sql-server.cer;MultiSubnetFailover=true;

Distribuye el certificado esperado a través de un canal de confianza y protege el archivo de la sustitución. Una coincidencia exacta de un certificado es una alternativa a la validación normal de la cadena y del nombre, no una comprobación adicional además de esta. Los bytes del certificado deben coincidir; el mismo nombre de asunto o clave pública por sí solo no es suficiente. Un archivo PIN perdido, ilegible, inválido o desajustado no valida la validación.

Acoplar el despliegue del cliente a la rotación de certificados. Actualiza el PIN cuando cambie el certificado del servidor, incluyendo la renovación. No consigas un PIN aceptando un certificado no verificado de la red.

SqlClient no expone una devolución de llamada pública para validación arbitraria del certificado de servidor TLS. AccessTokenCallback controla la adquisición de tokens de autenticación, no la validación TLS.

Certificados de desarrollo y resolución de problemas

Utiliza un certificado de desarrollo confiable con el nombre correcto del servidor. Si usas TrustServerCertificate=true temporalmente con Encrypt=true en un entorno de desarrollo aislado, la conexión se cifra pero el cliente no autentica el certificado del servidor.

Precaución

No implementar TrustServerCertificate=true como solución en producción para corregir errores de certificado. Desactiva la validación de identidad del servidor con Mandatory y no tiene efecto con Strict.

Failure Check
La cadena de certificados no es de fiar. Instala la raíz y los intermedios de confianza adecuados en el cliente. Verifica el certificado que realmente presenta SQL Server.
El nombre del certificado no coincide. Compáralo Server con el certificado SAN. Corrija el nombre, el certificado o la invalidación de HostNameInCertificate intencionada.
El certificado está caducado. Renueva el certificado del servidor y comprueba el reloj del cliente.
El certificado fijado no coincide o no se puede cargar. Comprueba la ruta del archivo, permisos, formato y certificado desplegado. Actualiza el PIN a través de tu proceso de distribución confiable.
El cifrado estricto no puede conectarse. Confirma que el endpoint es compatible con TDS 8.0 y que su configuración TLS es compatible con el cliente.

Para la configuración del lado del servidor, véase Resumen del Certificado.

Cambios en el cifrado y comportamiento de la validación de certificados

Estas notas de compatibilidad explican los cambios de comportamiento al actualizar aplicaciones antiguas. Las nuevas aplicaciones deben utilizar la configuración actual descrita en este artículo.

Lanzamiento del controlador Cambio
1.0 Encrypt=false es el valor predeterminado. Cuando el cliente no solicita cifrado, el cifrado forzado por el servidor no activa la validación del certificado.
2.0 El cifrado forzado por servidor respeta TrustServerCertificate incluso cuando Encrypt=false.
4.0 El cifrado se activa por defecto. Las actualizaciones pueden exponer errores de configuración de certificados previamente desapercibidos.
5.0 Añade Optional, Mandatory, Strict, y HostNameInCertificate.
5,1 Agrega ServerCertificate para el anclaje de certificados.
7.0.3 Corrige la validación de pines de certificados de red gestionada para que falle cerrada por archivos perdidos, inválidos o desajustados, incluso cuando la validación normal de la plataforma tiene éxito.