Présentation de la prise en charge du chiffrement

Télécharger le pilote JDBC

Lors de la connexion à SQL Server, si l’application demande un chiffrement et si l’instance de SQL Server est configurée pour prendre en charge le chiffrement TLS, le Pilote Microsoft JDBC pour SQL Server initie l’établissement d’une liaison TLS. L'établissement d'une liaison permet au serveur et au client de négocier le chiffrement et les algorithmes de chiffrement à utiliser pour protéger les données. Une fois la négociation TLS terminée, le client et le serveur peuvent envoyer les données chiffrées de manière sécurisée. Pendant la négociation TLS, le serveur envoie son certificat de clé publique au client. L'émetteur d'un certificat de clé publique porte le nom d'Autorité de certification. Le client est chargé de vérifier que l'autorité de certification est approuvée par le client.

Si l’application ne nécessite pas de chiffrement, le Pilote Microsoft JDBC pour SQL Server ne force pas SQL Server à prendre en charge le chiffrement TLS. Si l’instance de SQL Server n’est pas configurée pour forcer le chiffrement TLS, une connexion est établie sans aucun chiffrement. Si l’instance de SQL Server est configurée pour forcer le chiffrement TLS, le pilote active automatiquement le chiffrement TLS lors de l’exécution sur une machine virtuelle Java (JVM) correctement configurée, sinon la connexion est interrompue et le pilote génère une erreur.

Notes

Pour garantir une connexion TLS, vérifiez que la valeur transmise à serverName correspond exactement au nom CN (Nom commun) ou DNS dans le nom SAN (Autre nom du sujet) du certificat de serveur.

Pour plus d’informations sur la configuration du protocole TLS pour SQL Server, consultez Activer les connexions chiffrées au moteur de base de données.

Notes

Pour permettre aux applications d’utiliser le chiffrement TLS, le Pilote Microsoft JDBC pour SQL Server comprend les propriétés de connexion suivantes, à partir de la version 1.2 : encrypt, trustServerCertificate, trustStore, trustStorePassword et hostNameInCertificate. Pour permettre au pilote d’utiliser TDS 8.0 avec le chiffrement TLS, la propriété de connexion serverCertificate a été introduite à partir de la version 11.2. Pour plus d'informations, consultez Définition des propriétés de connexion.

Le tableau suivant résume le comportement de la version du Pilote Microsoft JDBC pour SQL Server pour les différents scénarios de connexion TLS possibles. Chaque scénario utilise un ensemble différent de propriétés de connexion TLS. Le tableau inclut :

  • blank : « La propriété n’existe pas dans la chaîne de connexion. »
  • value : « La propriété existe dans la chaîne de connexion et sa valeur est valide. »
  • any : « Peu importe que la propriété existe dans la chaîne de connexion ou que sa valeur soit valide. »

Notes

Le même comportement s’applique à l’authentification utilisateur SQL Server et à l’authentification intégrée Windows.

Paramètres de propriété Comportement
encrypt = false ou blank
trustServerCertificate = any
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
Le pilote ne force pas le serveur à prendre en charge le chiffrement TLS. Si le serveur a un certificat auto-signé, le pilote initie l’échange de certificat TLS. Le certificat TLS n’est pas validé, et seules les informations d’identification (dans le paquet de connexion) sont chiffrées.

Si le serveur requiert que le client prenne en charge le chiffrement TLS, le pilote initie l’échange de certificat TLS. Le certificat TLS n’est pas validé, mais la communication entière est chiffrée.
encrypt = true
trustServerCertificate = true
hostNameInCertificate = any
trustStore = any
trustStorePassword = any
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS. Si la propriété trustServerCertificate est définie sur « true », le pilote ne valide pas le certificat TLS.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = blank
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS.

Le pilote utilise la propriété serverName spécifiée sur l’URL de connexion pour valider le certificat TLS de serveur et se fie aux règles de recherche de la fabrique de gestionnaire de confiance pour déterminer le magasin de certificats à utiliser.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS.

Le pilote valide la valeur de sujet du certificat TLS à l’aide de la valeur spécifiée pour la propriété hostNameInCertificate.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = value
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS.

Le pilote utilisera la valeur de propriété trustStore pour rechercher le fichier trustStore de certificat et la valeur de propriété trustStorePassword pour vérifier l’intégrité du fichier trustStore.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = blank
trustStore = blank
trustStorePassword = value
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS.

Le pilote utilisera la valeur de propriété trustStorePassword pour vérifier l’intégrité du fichier trustStore par défaut.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = blank
trustStore = value
trustStorePassword = blank
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS.

Le pilote utilisera la valeur de propriété trustStore pour rechercher l’emplacement du fichier trustStore.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = value
trustStore = blank
trustStorePassword = value
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS.

Le pilote utilisera la valeur de propriété trustStorePassword pour vérifier l’intégrité du fichier trustStore par défaut. De plus, le pilote utilise la valeur de propriété hostNameInCertificate pour valider le certificat TLS.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = blank
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS.

Le pilote utilisera la valeur de propriété trustStore pour rechercher l’emplacement du fichier trustStore. De plus, le pilote utilise la valeur de propriété hostNameInCertificate pour valider le certificat TLS.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
encrypt = true
trustServerCertificate = false ou blank
hostNameInCertificate = value
trustStore = value
trustStorePassword = value
Le pilote demande à utiliser le chiffrement TLS avec le serveur.

Si le serveur requiert que le client prenne en charge le chiffrement TLS ou si le serveur prend en charge le chiffrement, le pilote initie l’échange de certificat TLS.

Le pilote utilisera la valeur de propriété trustStore pour rechercher le fichier trustStore de certificat et la valeur de propriété trustStorePassword pour vérifier l’intégrité du fichier trustStore. De plus, le pilote utilise la valeur de propriété hostNameInCertificate pour valider le certificat TLS.

Si le serveur n'est pas configuré pour prendre en charge le chiffrement, le pilote déclenchera une erreur et interrompra la connexion.
chiffrement = strict
hostNameInCertificate = value
trustStore = blank
trustStorePassword = blank
serverCertificate = valeur
Le pilote demande à utiliser le chiffrement TLS strict TDS 8.0 avec le serveur.

Le pilote lance l’établissement d'une liaison TLS et l’échange de certificats avec le serveur comme première action.

Le paramètre trustServerCertificate est ignoré et traité comme false en mode strict.

Le pilote utilisera les propriétés hostNameInCertificate ou serverCertificate facultatives pour valider le certificat TLS du serveur.

Si le serveur n'est pas configuré pour prendre en charge les conexions TDS 8, le pilote déclenchera une erreur et interrompra la connexion.

Si la propriété de chiffrement a la valeur true, le Pilote Microsoft JDBC pour SQL Server utilise le fournisseur de sécurité JSSE par défaut de la machine virtuelle Java pour négocier le chiffrement TLS avec SQL Server. Le fournisseur de sécurité par défaut peut ne pas prendre en charge toutes les fonctionnalités requises pour négocier le chiffrement TLS avec succès. Par exemple, le fournisseur de sécurité par défaut peut ne pas prendre en charge la taille de la clé publique RSA utilisée dans le certificat TLS SQL Server. Dans ce cas, le fournisseur de sécurité par défaut peut générer une erreur qui forcera le pilote JDBC à mettre fin à la connexion. Pour résoudre ce problème, choisissez l’une des méthodes suivantes :

  • Configurer l’ordinateur SQL Server avec un certificat de serveur qui a une plus petite clé publique RSA
  • Configurer la machine virtuelle Java de façon pour utiliser un autre fournisseur de sécurité JSSE dans le fichier de propriétés de sécurité « <java-home>/lib/security/java.security
  • Utiliser une autre machine virtuelle Java

Valider le certificat TLS du serveur

Pendant la négociation TLS, le serveur envoie son certificat de clé publique au client. Le client ou pilote JDBC doit confirmer que le certificat de serveur est publié par une autorité de certification approuvée par le client. Le pilote requiert que le certificat de serveur réponde aux conditions suivantes :

  • Le certificat a été publié par une autorité de certification approuvée.
  • Le certificat doit être publié pour l'authentification de serveur.
  • Le certificat n’a pas expiré.
  • Le nom CN (Nom commun) du sujet ou le nom DNS du nom SAN (Autre nom du sujet) du certificat correspond exactement à la valeur serverName de la chaîne de connexion ou, si elle est spécifiée, à la valeur de la propriété hostNameInCertificate.
  • Un nom DNS peut comprendre des caractères génériques. Avant la version 7.2, le Pilote Microsoft JDBC pour SQL Server ne prend pas en charge la correspondance des caractères génériques. Par exemple, abc.com ne correspondra pas à *.com, mais *.com correspondra à *.com. Avec la version 7.2 et les versions récentes, la correspondance de caractères génériques de certificat standard est prise en charge.

Pour utiliser TDS 8.0 avec le chiffrement strict, la valeur de la propriété serverCertificate indique le chemin du certificat de serveur à utiliser pour la validation de certificat. Ce fichier doit utiliser le format de fichier PEM. Le certificat reçu du serveur doit correspondre exactement à ce certificat.

Voir aussi

Utilisation du chiffrement
Sécurisation des applications du pilote JDBC