Encriptação e TLS com mssql-python

O driver mssql-python suporta ligações encriptadas através da Segurança da Camada de Transporte (TLS). A encriptação protege os dados em trânsito entre a sua aplicação e o SQL Server, e previne escutas clandestinas e ataques de adversário no meio.

Encriptação de ligação

Ativar encriptação

Use a Encrypt palavra-chave para controlar a encriptação da ligação:

import mssql_python

# Require encryption (recommended)
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
)

Encriptar valores de palavras-chave

Valor Descrição
yes Requer encriptação e falha se o servidor não suportar TLS.
no Não encripta a ligação. Não recomendado para produção.
strict Utiliza o modo de encriptação estrita TDS 8.0. Requer SQL Server 2022 ou posterior.

Importante

Base de Dados SQL do Azure requer Encrypt=yes. As ligações sem encriptação são rejeitadas.

Validação do certificado

TrustServerCertificate

Controla se o driver valida o certificado TLS do servidor:

# Validate server certificate (recommended for production)
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

# Skip certificate validation (development only)
conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)
Valor Descrição
no Valida o certificado em relação a autoridades de certificação confiáveis. Este valor é a definição padrão e recomendada.
yes Confia em qualquer certificado e ignora a validação. Esta configuração é insegura.

Atenção

Definir TrustServerCertificate=yes em produção expõe a sua aplicação a ataques de intermediário malicioso. Use esta definição apenas para desenvolvimento com certificados auto-assinados.

Encriptação estrita TDS 8.0

O SQL Server 2022 e versões posteriores suportam o TDS 8.0 com modo de encriptação rigorosa:

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Encrypt=strict;"
)

O modo estrito proporciona o nível de segurança mais elevado:

  • O driver estabelece o TLS antes de qualquer handshake TDS.
  • A validação do certificado é obrigatória e não pode usar TrustServerCertificate=yes.
  • Este modo oferece o mais alto nível de proteção contra interceção.

HostNameInCertificate

Quando o nome do certificado do servidor não corresponde ao nome do servidor de ligação:

conn = mssql_python.connect(
    "Server=192.168.1.100;"  # IP address
    "Database=<database>;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
    "HostNameInCertificate=<server>.contoso.com;"  # Certificate CN
)

Esta palavra-chave é útil quando:

  • A sua aplicação liga-se através de um endereço IP em vez de um nome de host.
  • O servidor está por trás de um balanceador de carga.
  • O certificado utiliza um nome de assunto diferente do nome do servidor de ligação.

Base de Dados SQL do Azure

Base de Dados SQL do Azure requer encriptação:

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

SQL Server no local (produção)

Para SQL Server local com um certificado assinado pela CA, mantenha-se TrustServerCertificate=no para que o driver valide a identidade do servidor:

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

Desenvolvimento com certificados autoassinados

Durante o desenvolvimento com certificados auto-assinados, defina TrustServerCertificate=yes para saltar a validação de certificados:

conn = mssql_python.connect(
    "Server=localhost;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)

SQL Server 2022 e versões posteriores com modo estrito

Use Encrypt=strict para TDS 8.0, que envolve toda a ligação em TLS desde o início:

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Encrypt=strict;"
)

Troubleshooting

"Fornecedor SSL: Falha na validação de certificados"

O certificado do servidor não pôde ser validado. Faça estas verificações:

  • Verifica se o certificado é de uma CA de confiança.
  • Verifique se a data de validade do certificado é válida.
  • Verifique se o nome do host do servidor corresponde ao certificado CN ou SAN.
  • Para o desenvolvimento, use TrustServerCertificate=yes.

"Fornecedor TCP: Uma ligação existente foi encerrada à força"

O servidor pode precisar de encriptação, mas o cliente não a pediu. Experimente estes passos:

  • Adiciona Encrypt=yes à tua cadeia de ligação.
  • Verifique a configuração do SQL Server relativamente à definição Forçar Encriptação.

"A cadeia de certificados foi emitida por uma autoridade que não é de confiança"

A CA raiz do certificado não está na loja raiz confiável do sistema. Faça estas verificações:

  • Instale o certificado da CA na loja raiz de confiança.
  • Para SQL do Azure, certifique-se de que o seu sistema confia nos certificados de CA da Microsoft.
  • Para o desenvolvimento, use TrustServerCertificate=yes.

A ligação falha com encriptação rigorosa

O modo estrito TDS 8.0 tem os seguintes requisitos:

  • O servidor deve executar o SQL Server 2022 ou posterior.
  • O servidor deve ter um certificado válido e de confiança.
  • Não podes definir TrustServerCertificate=yes.

Se o servidor não suportar TDS 8.0, use Encrypt=yes em vez disso.