Chiffrement et TLS avec mssql-python

Le pilote mssql-python prend en charge les connexions chiffrées via la sécurité de la couche de transport (TLS). Le chiffrement protège les données en transit entre votre application et SQL Server, et empêche l’écoute clandestine ainsi que les attaques adversaires intermédiaires.

Chiffrement de la connexion

Activer le chiffrement

Utilisez le Encrypt mot-clé pour contrôler le chiffrement de la connexion :

import mssql_python

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

Chiffrer les valeurs des mots-clés

Valeur Description
yes Nécessite un chiffrement et échoue si le serveur ne prend pas en charge TLS.
no Ça ne chiffre pas la connexion. Non recommandé pour la production.
strict Utilise le mode de chiffrement strict TDS 8.0. Nécessite SQL Server 2022 ou une version ultérieure.

Important

Azure SQL Database nécessite Encrypt=yes. Les connexions sans chiffrement sont rejetées.

Validation de certificat

TrustServerCertificate

Contrôle si le pilote valide le certificat TLS du serveur :

# 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;"
)
Valeur Description
no Valide le certificat auprès des autorités de certification de confiance. Cette valeur est le réglage par défaut et recommandé.
yes Fait confiance à tout certificat et saute la validation. Ce paramètre n’est pas sécurisé.

Caution

Mettre TrustServerCertificate=yes en production expose votre application à des attaques adversaires du milieu. N’utilisez ce paramètre que pour le développement avec des certificats auto-signés.

Chiffrement strict TDS 8.0

SQL Server 2022 et ultérieurs prennent en charge TDS 8.0 avec un mode de chiffrement strict :

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

Le mode strict offre le niveau de sécurité le plus élevé :

  • Le pilote établit TLS avant toute poignée de main TDS.
  • La validation des certificats est requise, et vous ne pouvez pas utiliser TrustServerCertificate=yes.
  • Ce mode offre le plus haut niveau de protection contre l’interception.

HostNameInCertificate

Lorsque le nom du certificat du serveur ne correspond pas au nom du serveur de connexion :

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

Ce mot-clé est utile lorsque :

  • Votre application se connecte via une adresse IP au lieu d’un nom d’hôte.
  • Le serveur est derrière un équilibreur de charge.
  • Le certificat utilise un nom de sujet différent du nom du serveur de connexion.

Azure SQL Database

Azure SQL Database nécessite un chiffrement :

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

SQL Server sur site (production)

Pour SQL Server local avec un certificat signé par une autorité de certification, laissez TrustServerCertificate=no afin que le pilote valide l’identité du serveur :

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

Développement avec certificats auto-signés

Lors du développement avec des certificats auto-signés, réglez TrustServerCertificate=yes pour éviter la validation des certificats :

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

SQL Server 2022 et versions ultérieures avec mode strict

Utilisez Encrypt=strict pour TDS 8.0, qui encapsule toute la connexion en TLS dès le départ :

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

Résolution des problèmes

« Fournisseur SSL : échec de validation de certificat »

Le certificat serveur n’a pas pu être validé. Effectuez ces vérifications :

  • Vérifiez que le certificat provient d’une autorité de confiance (CA).
  • Vérifiez que la date d’expiration du certificat est valide.
  • Vérifiez que le nom d’hôte du serveur correspond au certificat CN ou SAN.
  • Pour le développement, utilisez TrustServerCertificate=yes.

« Fournisseur TCP : Une connexion existante a été fermée de force »

Le serveur peut nécessiter un chiffrement, mais le client ne l’a pas demandé. Procédez comme suit :

  • Ajoute Encrypt=yes à ta chaîne de connexion.
  • Vérifiez la configuration de SQL Server pour le paramètre Force Encryption.

« La chaîne de certificats a été délivrée par une autorité non digne de confiance »

La CA racine du certificat n’est pas dans le magasin racine de confiance du système. Effectuez ces vérifications :

  • Installez le certificat de l’AC dans le magasin de certificats racines de confiance.
  • Pour Azure SQL, assurez-vous que votre système fait confiance aux certificats de l'AC Microsoft.
  • Pour le développement, utilisez TrustServerCertificate=yes.

La connexion tombe en échec avec un chiffrement strict

Le mode strict TDS 8.0 a ces exigences :

  • Le serveur doit exécuter SQL Server 2022 ou une version ultérieure.
  • Le serveur doit posséder un certificat valide et fiable.
  • Tu ne peux pas fixer TrustServerCertificate=yes.

Si le serveur ne supporte pas TDS 8.0, utilisez Encrypt=yes à la place.