Cifrado y certificados Go-MSSQLDB

El go-mssqldb controlador soporta múltiples modos de cifrado y estrategias de validación de certificados para conexiones a SQL Server y Azure SQL. Este artículo explica cada modo de cifrado, cómo configurar la validación de certificados y cuándo usar el modo estricto TDS 8.0.

Elige una configuración TLS

Utiliza esta tabla para elegir la opción más segura que se adapte a tu entorno antes de ajustar parámetros individuales.

Escenario Configuración recomendada Por qué
Azure SQL o SQL Server 2022 y versiones posteriores, y quieres la protección por defecto más fuerte encrypt=strict TDS 8.0 realiza el handshake TLS antes de la negociación TDS y siempre valida el certificado.
El certificado del servidor se encadena a una CA pública o corporativa de confianza encrypt=true La validación estándar de certificados suele ser suficiente cuando el nombre del host y la cadena de confianza ya son correctos.
El servidor utiliza una CA privada que no está en el almacén de confianza del sistema encrypt=true&certificate=/path/to/ca-cert.pem Añade el certificado de la CA a un pool de confianza personalizado y mantiene la validación normal de la cadena.
El servidor utiliza un certificado autofirmado y deseas usar anclaje de certificados encrypt=true&serverCertificate=/path/to/server.pem Compara el certificado exacto del servidor byte por byte en lugar de depender de una cadena de CA.
Desarrollo local o entornos de prueba temporales solo encrypt=true&TrustServerCertificate=true Mantiene el cifrado activado, pero se salta la validación de identidad del servidor. No uses esta configuración en producción.

Modos de cifrado

Establezca el encrypt parámetro de conexión en uno de los siguientes valores:

Value Comportamiento
strict Cifrado TDS 8.0. El apretón de manos TLS ocurre antes de la negociación de la conexión TDS. Requiere SQL Server 2022 o Azure SQL.
true o mandatory La conexión se cifra después del intercambio de preinicio de sesión de TDS.
false o optional El cifrado se usa solo si el servidor lo requiere. Este es el valor por defecto cuando encrypt no está especificado. Azure SQL siempre requiere cifrado en el lado del servidor, por lo que las conexiones a Azure SQL están cifradas independientemente de esta configuración.
disable Sin cifrado. No se recomienda para el entorno de producción.

Example

Activa el cifrado en la cadena de conexión usando el encrypt parámetro:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true

Validación de certificados

Cuando activas el cifrado (encrypt=true o encrypt=strict), el controlador valida el certificado del servidor a menos que configures TrustServerCertificate=true. Existen dos enfoques independientes para esta validación.

Validación en cadena utilizando el certificate parámetro

Proporciona un archivo de certificados PEM o DER. El controlador añade el certificado a un pool de confianza personalizado y realiza la validación estándar de la cadena X.509 contra ese pool:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&certificate=/path/to/ca-cert.pem

Comparación a nivel de byte usando el serverCertificate parámetro

Note

El serverCertificate parámetro se introdujo en el controlador v1.9.6.

Proporciona un archivo PEM o DER que contenga el certificado exacto del servidor. El controlador compara el certificado byte por byte del servidor con el archivo proporcionado. El controlador no realiza la validación de la cadena. Este enfoque es útil para certificados autofirmados:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&serverCertificate=/path/to/server.pem

Sustitución del nombre de host

Por defecto, el controlador valida que el Nombre Común (CN) o el Nombre Alternativo de Sujeto (SAN) del certificado coincide con el nombre del host del servidor. Úsase hostnameincertificate para anular el nombre de host esperado:

sqlserver://<user>:<password>@10.0.0.5:1433?database=AdventureWorks2025&encrypt=true&hostnameincertificate=<server>.domain.com

Omitir la validación de certificados

Configure TrustServerCertificate=true para omitir la validación de todos los certificados. La conexión sigue cifrada, pero la identidad del servidor no está verificada:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&TrustServerCertificate=true

Precaución

Configurar TrustServerCertificate=true expone la conexión a ataques de adversario en medio. Utiliza esta opción solo para desarrollo y pruebas.

Modo estricto TDS 8.0

TDS 8.0 (cifrado estricto) realiza el handshake TLS antes de cualquier negociación del protocolo TDS. Este enfoque evita que un atacante degrade toda la conexión. TDS 8.0 requiere SQL Server 2022 o Azure SQL:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=strict

En modo estricto, el TrustServerCertificate parámetro se ignora. La validación de certificados siempre ocurre, utilizando por defecto el almacén de confianza del sistema. Puedes proporcionar certificate o serverCertificate para una validación personalizada.

Versión de TLS mínima

Utiliza el tlsmin parámetro para imponer una versión mínima de TLS:

sqlserver://<user>:<password>@<server>:1433?database=AdventureWorks2025&encrypt=true&tlsmin=1.2

Valores válidos: 1.0, 1.1, 1.2, 1.3.

Resumen de parámetros de cifrado

Parámetro Predeterminado Description
encrypt false Modo cifrado. Azure SQL siempre requiere cifrado en el lado del servidor, independientemente de esta configuración.
TrustServerCertificate Depende de encrypt Omitir la validación del certificado cuando true. El valor por defecto es false cuándo encrypt se especifica y true cuándo encrypt se omite.
certificate - Ruta del archivo PEM/DER para la validación de la cadena.
serverCertificate - Ruta del archivo PEM/DER para la comparación a nivel de bytes.
hostnameincertificate - Anular el nombre esperado del anfitrión en el certificado.
tlsmin - Versión mínima TLS.