Criptografia e TLS com mssql-python

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

Criptografia de conexão

Habilitar criptografia

Use a Encrypt palavra-chave para controlar a criptografia da conexão:

import mssql_python

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

Criptografar valores de palavras-chave

Valor Descrição
yes Requer criptografia e falha se o servidor não suportar TLS.
no Não criptografa a conexão. Não recomendado para produção.
strict Utiliza o modo de criptografia estrita TDS 8.0. Requer SQL Server 2022 ou versões posteriores.

Importante

Banco de Dados SQL do Azure requer Encrypt=yes. Conexões sem criptografia são rejeitadas.

Validação de certificado

Certificado de Servidor Confiável

Controle 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 contra as CAs confiáveis. Esse valor é a configuração padrão e recomendada.
yes Confia em qualquer certificado e pula a validação. Essa configuração é insegura.

Cuidado

Colocar TrustServerCertificate=yes em produção expõe sua aplicação a ataques de adversário no meio. Use essa configuração apenas para desenvolvimento com certificados autoassinados.

Criptografia estrita TDS 8.0

SQL Server 2022 e versões posteriores suportam TDS 8.0 com modo de criptografia rigorosa:

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

O modo estrito oferece o mais alto nível de segurança:

  • O driver estabelece o protocolo TLS antes de qualquer handshake do TDS.
  • A validação de certificado é necessária, e você não pode usar TrustServerCertificate=yes.
  • Esse modo oferece o mais alto nível de proteção contra interceptação.

HostNameInCertificate

Quando o nome do certificado do servidor não coincide com o nome do servidor de conexão:

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

Essa palavra-chave é útil quando:

  • Sua aplicação se conecta por um endereço IP em vez de um nome de host.
  • O servidor está atrás de um balanceador de carga.
  • O certificado usa um nome de assunto diferente do nome do servidor de conexão.

Banco de Dados SQL do Azure

Banco de Dados SQL do Azure requer criptografia:

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

SQL Server local (produção)

Para SQL Server on-premises com certificado assinado por uma CA, mantenha 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 autoassinados, defina TrustServerCertificate=yes para pular 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 conexão no TLS desde o início:

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

Solução de problemas

"Provedor SSL: Falha na validação de certificado"

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

  • Verifique se o certificado é de uma CA confiável.
  • 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 desenvolvimento, use TrustServerCertificate=yes.

"Provedor TCP: Uma conexão existente foi fechada à força"

O servidor pode exigir criptografia, mas o cliente não solicitou. Experimente estes passos:

  • Adicione Encrypt=yes à sua cadeia de conexão.
  • Verifique a configuração do SQL Server da opção Forçar Criptografia.

"A cadeia de certificados foi emitida por uma autoridade que não é confiável"

A CA raiz do certificado não está no repositório de raízes confiáveis do sistema. Faça estas verificações:

  • Instale o certificado da CA na loja raiz confiável.
  • Para SQL do Azure, certifique-se de que seu sistema confie nos certificados de CA da Microsoft.
  • Para desenvolvimento, use TrustServerCertificate=yes.

Falha a conexão com criptografia rigorosa

O modo estrito TDS 8.0 tem estes requisitos:

  • O servidor deve rodar o SQL Server 2022 ou versões posteriores.
  • O servidor deve ter um certificado válido e confiável.
  • Você não pode configurar TrustServerCertificate=yes.

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