Crittografia e TLS con mssql-python

Il driver mssql-python supporta connessioni criptate tramite Transport Layer Security (TLS). La crittografia protegge i dati in transito tra la tua applicazione e SQL Server, e previene intercettazioni e attacchi avversari nel mezzo.

Crittografia della connessione

Abilitare la crittografia

Usa la Encrypt parola chiave per controllare la crittografia della connessione:

import mssql_python

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

Cifrare i valori delle parole chiave

Valore Descrizione
yes Richiede crittografia e fallisce se il server non supporta TLS.
no Non cripta la connessione. Non consigliato per la produzione.
strict Utilizza la modalità di crittografia rigorosa TDS 8.0. Richiede SQL Server 2022 o versioni successive.

Importante

database SQL di Azure richiede Encrypt=yes. Le connessioni senza crittografia vengono rifiutate.

Convalida del certificato

TrustServerCertificate

Controlla se il driver convalida il certificato TLS del server:

# 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;"
)
Valore Descrizione
no Valida il certificato rispetto alle autorità di certificazione affidabili. Questo valore è l'impostazione predefinita e consigliata.
yes Si fida di qualsiasi certificato e salta la validazione. Questa impostazione è insicura.

Attenzione

Impostare TrustServerCertificate=yes la produzione espone la tua applicazione ad attacchi avversari nel mezzo. Usa questa impostazione solo per lo sviluppo con certificati autofirmati.

Crittografia rigorosa TDS 8.0

SQL Server 2022 e successivi supportano TDS 8.0 con modalità di crittografia rigorosa:

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

La modalità Strict offre il livello di sicurezza più alto:

  • Il driver stabilisce una connessione TLS prima di qualsiasi handshake TDS.
  • È richiesta la validazione del certificato e non puoi usare TrustServerCertificate=yes.
  • Questa modalità offre il più alto livello di protezione contro l'intercettazione.

Nome host nel certificato

Quando il nome del certificato del server non corrisponde al nome del server di connessione:

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

Questa parola chiave è utile quando:

  • La tua applicazione si collega tramite un indirizzo IP invece che tramite un nome host.
  • Il server si trova dietro un bilanciatore di carico.
  • Il certificato utilizza un nome di oggetto diverso da quello del server di connessione.

Database SQL di Microsoft Azure

database SQL di Azure richiede la crittografia:

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

SQL Server locale (produzione)

Per SQL Server on-premises con certificato firmato da CA, mantenere TrustServerCertificate=no in modo che il driver validi l'identità del server:

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

Sviluppo con certificati autofirmati

Durante lo sviluppo con certificati autofirmati, imposta TrustServerCertificate=yes per saltare la validazione dei certificati:

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

SQL Server 2022 e versioni successive con modalità rigorosa

Usa Encrypt=strict per TDS 8.0, che avvolge l'intera connessione in TLS fin dall'inizio:

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

Troubleshooting

"Fornitore SSL: Errore della validazione del certificato"

Il certificato server non poteva essere validato. Esegui questi controlli:

  • Verifica che il certificato sia di una CA affidabile.
  • Controlla che la data di scadenza del certificato sia valida.
  • Verifica che il nome host del server corrisponda al certificato CN o SAN.
  • Per lo sviluppo, utilizzare TrustServerCertificate=yes.

"Provider TCP: Una connessione esistente è stata chiusa con la forza"

Il server potrebbe richiedere la crittografia, ma il client non l'ha richiesta. Provare questi passaggi:

  • Aggiungi Encrypt=yes alla tua stringa di connessione.
  • Controlla la configurazione di SQL Server per l'impostazione Force Crittografia.

"La catena di certificati è stata emessa da un'autorità non affidabile"

La root CA del certificato non si trova nella root store affidabile del sistema. Esegui questi controlli:

  • Installa il certificato CA nello store root affidabile.
  • Per Azure SQL, assicurati che il tuo sistema si fidi dei certificati CA di Microsoft.
  • Per lo sviluppo, utilizzare TrustServerCertificate=yes.

La connessione fallisce con crittografia rigorosa

La modalità rigorosa TDS 8.0 prevede questi requisiti:

  • Il server deve eseguire SQL Server 2022 o versioni successive.
  • Il server deve avere un certificato valido e affidabile.
  • Non puoi impostare TrustServerCertificate=yes.

Se il server non supporta TDS 8.0, usa Encrypt=yes invece.