Cifrado y validación de certificados en Microsoft.Data.SqlClient
SQL Server cifra siempre los paquetes de red asociados al inicio de sesión. Si no se ha aprovisionado ningún certificado en el servidor al iniciarlo, SQL Server genera un certificado autofirmado, que se usa para cifrar los paquetes de inicio de sesión.
A nivel general, el cifrado entre un cliente y un servidor garantiza que el cliente y el servidor sean los únicos que puedan leer los datos. Una parte importante del proceso de cifrado es la validación de certificados de servidor. La validación de certificados de servidor permite al cliente asegurarse de que el servidor es quien dice ser. El certificado se valida para elementos como la expiración, la cadena de confianza y que el nombre del certificado coincide con el nombre del servidor al que se conecta el cliente. Para más información, consulte Seguridad de la capa de transporte y certificados digitales.
Se recomienda encarecidamente aprovisionar un certificado comprobable en SQL Server para la conectividad segura. La seguridad de la capa de transporte (TLS) solo se puede proteger con la validación de certificados.
Las aplicaciones pueden solicitar también el cifrado de todo el tráfico de red mediante la palabra clave de cadena de conexión o propiedad de conexión Encrypt
. De forma predeterminada, para el cifrado de todo el tráfico de red de una conexión es necesario aprovisionar un certificado en el servidor. Al configurar el cliente para que confíe en el certificado del servidor, podría ser vulnerable a ataques de tipo "Man in the middle". Si implementa un certificado verificable en el servidor, asegúrese de que la configuración de Encrypt
del cliente sea True
y que la configuración de Trust Server Certificate
sea False
.
Para permitir usar el cifrado cuando no se ha aprovisionado un certificado en el servidor, se puede usar la configuración de cliente Encrypt
y Trust Server Certificate
. En este caso, el cifrado usa un certificado de servidor autofirmado sin validación por parte del cliente. Esta configuración cifra la conexión, pero no impide que los dispositivos entre el cliente y el servidor intercepten la conexión y redirijan el cifrado mediante proxy.
Cambios en el cifrado y comportamiento de la validación de certificados
La versión 4.0 de Microsoft.Data.SqlClient presenta cambios importantes en la configuración de cifrado. El valor predeterminado de Encrypt
ahora es True
.
La versión 2.0 de Microsoft.Data.SqlClient presenta cambios importantes en el comportamiento de la opción Trust Server Certificate
. Anteriormente, si Encrypt
se establecía en False
, el certificado de servidor no se validaba, independientemente de la opción Trust Server Certificate
. Ahora, el certificado de servidor se valida en función de la opción Trust Server Certificate
si el servidor fuerza el cifrado, incluso si Encrypt
está establecido en False
.
Versión 4.0
En la tabla siguiente se describe el resultado del cifrado y la validación para la configuración de cifrado y certificado:
Configuración de cliente Encrypt |
Configuración de cliente Trust Server Certificate |
Configuración de servidor Force encryption |
Resultado |
---|---|---|---|
False | False (valor predeterminado) | No | El cifrado solo se produce para los paquetes LOGIN. El certificado no se valida. |
False | False (valor predeterminado) | Sí | (Cambio de comportamiento de la versión 1.0 a la 2.0) El cifrado de todo el tráfico de red solamente se produce si hay un certificado de servidor comprobable; de lo contrario, se produce un error en el intento de conexión. |
False | True | Sí | Se produce el cifrado de todo el tráfico de red y el certificado no se valida. |
True (nuevo valor predeterminado) | False (valor predeterminado) | N/D | El cifrado de todo el tráfico de red solamente se produce si hay un certificado de servidor comprobable; de lo contrario, se produce un error en el intento de conexión. |
True (nuevo valor predeterminado) | True | N/D | Se produce el cifrado de todo el tráfico de red pero el certificado no se valida. |
Strict (agregado en la versión 5.0) | N/D | N/D | El cifrado de todo el tráfico de red solamente se produce mediante TDS 8 si hay un certificado de servidor comprobable; de lo contrario, se produce un error en el intento de conexión. |
Precaución
En la tabla anterior solo se proporciona una guía sobre el comportamiento del sistema en distintas configuraciones. Para lograr una conectividad segura, asegúrese de que tanto el cliente como el servidor requieren cifrado. Asegúrese también de que el servidor tiene un certificado comprobable y de que el valor TrustServerCertificate
en el cliente esté establecido en False
.
A partir de la versión 5.0 de Microsoft.Data.SqlClient, HostNameInCertificate
es una nueva opción de conexión. La validación de certificados de servidor garantiza que el nombre común (CN) o el nombre alternativo de sujeto (SAN) del certificado coincida con el nombre del servidor al que se está conectando. En algunos casos, como los alias DNS, es posible que el nombre del servidor no coincida con el CN o SAN. El valor HostNameInCertificate
se puede usar para especificar un CN o SAN esperado diferente en el certificado de servidor.
Versión 2.0
A partir de la versión 2.0, cuando el servidor fuerza el cifrado, el cliente valida el certificado de servidor en función de la opción Trust Server Certificate
, independientemente de la opción Encrypt
.
En la tabla siguiente se describe el resultado del cifrado y la validación para la configuración de cifrado y certificado:
Configuración de cliente Encrypt |
Configuración de cliente Trust Server Certificate |
Configuración de servidor Force encryption |
Resultado |
---|---|---|---|
False (valor predeterminado) | False (valor predeterminado) | No | El cifrado solo se produce para los paquetes LOGIN. El certificado no se valida. |
False (valor predeterminado) | False (valor predeterminado) | Sí | (Cambio de comportamiento) El cifrado de todo el tráfico de red solamente se produce si hay un certificado de servidor comprobable; de lo contrario, se produce un error en el intento de conexión. |
False (valor predeterminado) | True | Sí | Se produce el cifrado de todo el tráfico de red y el certificado no se valida. |
True | False (valor predeterminado) | N/D | El cifrado de todo el tráfico de red solamente se produce si hay un certificado de servidor comprobable; de lo contrario, se produce un error en el intento de conexión. |
True | True | N/D | Se produce el cifrado de todo el tráfico de red pero el certificado no se valida. |
Precaución
En la tabla anterior solo se proporciona una guía sobre el comportamiento del sistema en distintas configuraciones. Para lograr una conectividad segura, asegúrese de que tanto el cliente como el servidor requieren cifrado. Asegúrese también de que el servidor tiene un certificado comprobable y de que el valor TrustServerCertificate
en el cliente esté establecido en False
.
Versión 1.0
En la tabla siguiente se describe el resultado del cifrado y la validación para la configuración de cifrado y certificado:
Configuración de cliente Encrypt |
Configuración de cliente Trust Server Certificate |
Configuración de servidor Force encryption |
Resultado |
---|---|---|---|
False (valor predeterminado) | False (valor predeterminado) | No | El cifrado solo se produce para los paquetes LOGIN. El certificado no se valida. |
False (valor predeterminado) | False (valor predeterminado) | Sí | Se produce el cifrado de todo el tráfico de red pero el certificado no se valida. |
False (valor predeterminado) | True | Sí | Se produce el cifrado de todo el tráfico de red y el certificado no se valida. |
True | False (valor predeterminado) | N/D | El cifrado de todo el tráfico de red solamente se produce si hay un certificado de servidor comprobable; de lo contrario, se produce un error en el intento de conexión. |
True | True | N/D | Se produce el cifrado de todo el tráfico de red pero el certificado no se valida. |