Encriptação e Certificados Go-MSSQLDB

O go-mssqldb driver suporta múltiplos modos de encriptação e estratégias de validação de certificados para ligações ao SQL Server e ao SQL do Azure. Este artigo explica cada modo de encriptação, como configurar a validação de certificados e quando usar o modo estrito TDS 8.0.

Escolha uma configuração TLS

Use esta tabela para escolher a opção mais segura que se adapte ao seu ambiente antes de ajustar parâmetros individuais.

Scenario Definições recomendadas Porquê
SQL do Azure ou SQL Server 2022 e versões posteriores, e queres a proteção padrão mais forte encrypt=strict O TDS 8.0 realiza o handshake TLS antes da negociação do TDS e valida sempre o certificado.
O certificado do servidor é encadeado a uma CA pública ou corporativa de confiança encrypt=true A validação padrão de certificados é geralmente suficiente quando o nome do host e a cadeia de confiança já estão corretos.
O servidor usa uma CA privada que não está no system trust store encrypt=true&certificate=/path/to/ca-cert.pem Adiciona o certificado da CA a um pool de confiança personalizado e mantém a validação normal da cadeia.
O servidor usa um certificado auto-assinado e queres fixar o certificado encrypt=true&serverCertificate=/path/to/server.pem Compara o certificado exato do servidor byte por byte em vez de depender de uma cadeia CA.
Apenas ambientes de desenvolvimento local ou de teste temporários encrypt=true&TrustServerCertificate=true Mantém a encriptação ativada, mas ignora a validação da identidade do servidor. Não utilize esta configuração em produção.

Modos de encriptação

Defina o encrypt parâmetro de ligação para um dos seguintes valores:

valor Comportamento
strict Encriptação TDS 8.0. O aperto de mão TLS acontece antes da negociação da ligação TDS. Requer SQL Server 2022 ou SQL do Azure.
true ou mandatory A ligação é encriptada após o handshake pré-login do TDS.
false ou optional A encriptação é usada apenas se o servidor assim o exigir. Este é o padrão quando encrypt não está especificado. O SQL do Azure requer sempre encriptação do lado do servidor, por isso as ligações ao SQL do Azure são encriptadas independentemente desta definição.
disable Sem encriptação. Não recomendado para produção.

Exemplo

Ative a encriptação na cadeia de ligação usando o encrypt parâmetro:

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

Validação do certificado

Quando ativas a encriptação (encrypt=true ou encrypt=strict), o driver valida o certificado do servidor, a menos que definas TrustServerCertificate=true. Existem duas abordagens independentes para esta validação.

Validação em cadeia utilizando o certificate parâmetro

Forneça um ficheiro de certificado PEM ou DER. O driver adiciona o certificado a um repositório de confiança personalizado e realiza a validação padrão da cadeia X.509 em relação a esse repositório:

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

Comparação ao nível de byte usando o serverCertificate parâmetro

Observação

O serverCertificate parâmetro foi introduzido no driver v1.9.6.

Forneça um ficheiro PEM ou DER contendo exatamente o certificado do servidor. O driver compara o certificado do servidor byte por byte com o ficheiro fornecido. O driver não realiza a validação da cadeia. Esta abordagem é útil para certificados auto-assinados:

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

Substituição do nome do host

Por defeito, o driver valida que o Nome Comum (CN) ou o Nome Alternativo do Sujeito (SAN) do certificado corresponde ao nome do host do servidor. Usar hostnameincertificate para sobrepor o nome de host esperado:

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

Saltar a validação do certificado

Defina TrustServerCertificate=true para saltar toda a validação de certificados. A ligação continua encriptada, mas a identidade do servidor não é verificada:

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

Caution

Definir TrustServerCertificate=true expõe a ligação a ataques de adversário no meio. Use esta opção apenas para desenvolvimento e testes.

TDS 8.0 em modo estrito

O TDS 8.0 (encriptação estrita) realiza o handshake TLS antes de qualquer negociação do protocolo TDS. Esta abordagem impede que um atacante faça downgrade de toda a ligação. O TDS 8.0 requer SQL Server 2022 ou SQL do Azure:

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

No modo estrito, o TrustServerCertificate parâmetro é ignorado. A validação de certificados é sempre efetuada, utilizando por defeito o repositório de certificados fidedignos do sistema. Pode fornecer certificate ou serverCertificate para validação personalizada.

Versão mínima do TLS

Use o tlsmin parâmetro para impor uma versão 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.

Resumo dos parâmetros de encriptação

Parâmetro Predefinição Description
encrypt false Modo de encriptação. O SQL do Azure exige sempre encriptação do lado do servidor, independentemente desta configuração.
TrustServerCertificate Depende de encrypt Saltar a validação de certificados quando true. O padrão é false quando encrypt é especificado e true quando encrypt é omitido.
certificate - Caminho do ficheiro PEM/DER para validação da cadeia.
serverCertificate - Caminho do ficheiro PEM/DER para comparação byte a byte.
hostnameincertificate - Anular o nome esperado do anfitrião no certificado.
tlsmin - Versão TLS mínima.