Les certificats TLS et la librairie C++ 2.0

Les certificats TLS et la librairie C++ 2.0

La version 2.0 de la librairie C++ supporte le protocole TLS et permet de chiffrer les communications entre la librairie et le VirtualHub 2.0. Cette semaine, nous avons ajouté des méthodes qui permettent de configurer plus finement l'authentification TSL. En particulier comment gérer la liste de certificats reconnus par la librairie.




Nous allons commencer par un très rapide rappel de comment le protocole TLS (et avant lui SSL) fonctionne.

Le protocole TLS a deux buts: le premier, c’est de chiffrer la communication afin d'éviter qu'une personne tierce puisse écouter la communication. Le deuxième est d'authentifier de manière fiable le serveur afin d’empêcher qu'un attaquant se fasse passer pour le serveur (attaque Man-in-the-middle).

L'authentification SSL/TLS est basée sur une chaîne de certificat électronique. Lors de l’établissement de la connexion, le client vérifie la validité de la chaîne de certificat et s'assure qu'au moins l'un des certificats de la chaîne a été émis par une autorité reconnue par le client. Pour établir une connexion 100% sécurisée il faut donc que le client connaisse les émetteurs de certificats de tous des serveurs auxquels il va accéder.

Les certificats dans la librairie C++


Afin de permettre une véritable authentification, la libraire vérifie que le certificat du serveur est présent dans la liste des certificats de confiance. Si le certificat n'est pas enregistré, la librairie va retourner une erreur lors de l’établissement de la connexion avec le VirtualHub 2.

La méthode YAPI::AddTrustedCertificates permet d'ajouter des certificats à la liste de certificats de confiance. Cette fonction prend en paramètre une string qui contient un ou plusieurs certificats au format PEM.

string CA_PEM =
// certicate of vhub.example.com in pem format
"-----BEGIN CERTIFICATE-----\n"
"MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB\n"
"iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl\n"
"cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV\n"
"BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw\n"
...
"qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB\n"
"VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB\n"
"L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG\n"
"jjxDah2nGN59PRbxYvnKkKj9\n"
"-----END CERTIFICATE-----\n";


string error = YAPI::AddTrustedCertificates(CA_PEM);
if (error !="") {
    cerr <<error << endl;
    exit(1);
}
if (YAPI::RegisterHub("wss://vhub.example.com", errmsg) != YAPI_SUCCESS) {
    cerr << "YAPI::RegisterHub failed: " << errmsg << endl;
}
...



Dans cet exemple, nous avons inclus le certificat directement dans le code, mais libre à vous de stocker ces certificats, sur le disque ou dans la registry Windows.

Nous avons aussi ajouté une méthode YAPI::DownloadHostCertificate qui permet de télécharger le certificat d'un serveur. Cette méthode est pratique pour obtenir le certificat d'un VirtualHub dont le certificat n'est pas encore connu.

Par exemple, le code suivant cherche sur le disque dur si nous avons déjà le certificat pour le VirtualHub. Si c'est le cas, on le charge du disque et on l'ajoute à la liste des certificats de confiance. Si c'est la première fois qu'on accède à ce VirtualHub on afficher un message d'avertissement à l'utilisateur pour lui demander s’il faut télécharger et sauver le certificat de ce nouveau VirtualHub. En cas de réponse positive, on peut utiliser la méthode YAPI::DownloadHostCertificate pour obtenir le certificat au format PEM et le sauver sur le disque.

...
string host = "wss://vhub.example.com";
string trusted_cert = load_cert_from_fs(host);
if (trusted_cert == "") {
    // no certificate for host on file system
    if (warn_and_ask_user_()){
      trusted_cert = YAPI::DownloadHostCertificate(host, 5000);
      save_cert_to_fs(host, trusted_cert);
    } else {
      exit(1);
    }
}
string error = YAPI::AddTrustedCertificates(trusted_cert);
if (error !="") {
    cerr << error << endl;
    exit(1);
}
if (YAPI::RegisterHub(host, errmsg) != YAPI_SUCCESS) {
    cerr << "YAPI::RegisterHub failed: " << errmsg << endl;
}
...



la méthode YAPI::SetNetworkSecurityOptions


La vérification du certificat du serveur est indispensable pour garantie une communication 100% sécurisée, mais nous avons quand même ajouté une méthode qui permet de désactiver partiellement ou complètement cette fonctionnalité.

La méthode YAPI::SetNetworkSecurityOptions permet de désactiver certains checks de sécurité.

  • NO_TRUSTED_CA_CHECK: Désactive la vérification des certificats.
  • NO_EXPIRATION_CHECK: Désactive la vérification de la date d'expiration d'un certificat.
  • NO_HOSTNAME_CHECK: Désactive la vérification du hostname


Le code suivant désactive toutes les vérifications des certificats TLS.

YAPI::SetNetworkSecurityOptions( YAPI::NO_HOSTNAME_CHECK
          | YAPI::NO_TRUSTED_CA_CHECK | YAPI::NO_EXPIRATION_CHECK);



L'option NO_EXPIRATION_CHECK peut être intéressante si on doit se connecter à une machine qui a un certificat qui a expiré.

Conclusion


Pour rappel, la librairie C++ v2.0 est toujours en preview. Cette librairie implémente toutes les fonctionnalités de la version 1.0 en plus d'autres (comme TLS ou IPv6). Toutefois, nous nous réservons encore la possibilité de modifier l'interface certaines fonctions qui ont été ajoutées dans la version v2.0.

Elle est disponible sur la page de download des librairies dans la section preview.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.