FAQ n°24203, publiée le 14/03/2023
Dans quel cas la connexion à une base SQL SERVER avec le connecteur natif est refusée avec la réponse "La chaîne de certificats a été fournie par une autorité qui n’est pas approuvée" ?
L'établissement d'une connexion à une base de données avec un connecteur natif, repose sur le client de la base fourni par son éditeur, et installé localement sur le poste qui exécute le processus (application, site, Webservice...).

Si la version du client de la base installée en local n'est pas adaptée à la version de la base la base de données à laquelle l'application doit se connecter, la connexion peut échouer, ou les interrogations peuvent ne pas donner le résultat attendu.

Cela s'applique à toutes les bases qui fonctionnent sur le principe client/serveur, et donc à tous les connecteurs natifs.

C'est par exemple le cas avec SQL SERVER dans la situation suivante : 
  • la base de données SQL SERVER est encore en version 2012, ou est en version 2019, mais avec un niveau de compatibilité paramétré sur une version antérieure (cf. clic droit sur la BDD dans SQL SERVER, "Propriétés", puis "Options" et combo "Niveau de compatibilité"),


  • le poste qui va faire un HOuvreConnexion ou SQLConnecte dispose du client SQL SERVER local en version 2012 et en version 2019,

  • l'application ne fait pas explicitement mention du client de la base à utiliser dans ses informations optionnelles de connexion,

  • l'application est compilée en version 28.


Dans cette configuration, la connexion échoue en version 28, alors qu'elle est permise dans une version antérieure, avec la réponse :

Fonction 'HOuvreConnexion', syntaxe 0
Que s'est-il passé ? Erreur de l'accès natif SQLSERVER.
Numéro d'erreur = 117 
SQL Server a renvoyé l'erreur 80004005
Description: Le client n'a pas pu établir la connexion
SQL State: 08001
SQL Error Number: -2146893019
Sous-erreur n°1
Description: SSL Provider: La chaîne de certificats a été fournie par une autorité qui n’est pas approuvée.
SQL State: 08001
Code erreur : 73001
Niveau : erreur non fatale
Module : wd280hf64.dll (01F280066p - 28.0.322.0)
Provider : WinDevSQLServer

La connexion échoue car le client SQL SERVER 2019 est chargé par défaut par une application compilée en version 28. Ce  client n'est pas compatible avec SQL SERVER 2012 d'ou l'erreur renvoyée par SQL SERVER.

Les solutions : 
  • recommandée par l'éditeur de la base : mettre à jour la base SQL SERVER afin d'utiliser une version compatible avec le client local 2019,

  • si la base doit rester dans cette ancienne version de SQL SERVER : 
    • forcer l'utilisation du client d'une version antérieure.
      Il suffit pour cela d'ajouter la chaîne "WD CLIENT VERSION=2012 ;" ou  "WD CLIENT VERSION=2017 ;" dans les informations optionnelles de connexion afin de sélectionner le client installé à utiliser.
    • ou désinstaller le client SQL SERVER 2019 afin que seul le client 2012 adapté soit trouvé par Windows lorsqu'il recherche les DLL.

De façon générale, pour tous les connecteurs natifs, il est conseillé de toujours faire exécuter l'application en production, avec la même version de client local qui a permis la validation de toutes les fonctionnalités. Pour cela il est conseillé de : 
  • bien spécifier dans les pré-requis de l'application la version du client de la base avec laquelle elle est validée,
  • utiliser si possible les informations optionnelles de la connexion pour spécifier le client à charger.

Liens utiles : 

Astuce : 

Le code suivant permet de facilement voir pour un processus la liste des DLL chargées pour une connexion. Cela peut permettre d'ajouter une sécurité supplémentaire, si une DLL est trouvée dans une version autre que celle avec laquelle l'application a été qualifiée.


tabDLLChargées est un tableau de chaîne
tabDLLNouvelles est un tableau de chaîne

POUR TOUT CHAÎNE sDLL DE ExeListeDLL(ExeDonnePID(exePID)) SÉPARÉE PAR RC
tabDLLChargées.Ajoute(sDLL)
FIN

CnxSQLSERVER est une Connexion
CnxSQLSERVER..Provider = hAccèsNatifSQLServer
CnxSQLSERVER..Utilisateur = "sa"
CnxSQLSERVER..MotDePasse = "sqlserver"
CnxSQLSERVER..Serveur = "srv-mon-server.com"
CnxSQLSERVER..BaseDeDonnées = ""
CnxSQLSERVER..Accès = hOLectureEcriture
CnxSQLSERVER..InfosEtendues = "WD CLIENT VERSION=2012"

SI HOuvreConnexion(CnxSQLSERVER) ALORS
POUR TOUT CHAÎNE sDLL DE ExeListeDLL(ExeDonnePID(exePID)) SÉPARÉE PAR RC
SI tabDLLChargées.Cherche(tcLinéaire, sDLL) > 0 ALORS
SINON
tabDLLNouvelles.Ajoute(sdll)
FIN
FIN
STOP // >> visualiser tabDLLNouvelles dans les expressions du débogueur
HFermeConnexion(CnxSQLSERVER)
ToastAffiche("OK")
SINON
Erreur("KO", ErreurInfo(errComplet))
FIN