Présentation de la prise en charge du chiffrement
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