Utiliser TLS/SSL avec notre librairie Android

Utiliser TLS/SSL avec notre librairie Android

Il y a quelque temps, nous avons ajouté le support SSL/TLS à notre librairie Android. Cette fonctionnalité permet d'utiliser un canal de communication sécurisé entre la librairie et le VirtualHub v2.0 (toujours en BETA) ou le GatewayHub. L'utilisation de cette nouveauté est assez simple, mais nécessite quelques astuces si vous utilisez un certificat autosigné (Self-signed certificate) sur le VirtualHub.



Contrairement aux librairies C++, C#, Python et VisualBasic .NET, la librairie Android n'a pas nécessité de changement profond pour ajouter le support SSL/TLS. Pour cette raison, nous avons ajouté cette fonctionnalité dans la version actuelle de la librairie. Cela veut dire que si vous utilisez une version récente de notre librairie Android, vous pouvez déjà utiliser cette fonctionnalité.

Support SSL/TLS


Pour utiliser une connexion sécurisée, il suffit d'ajouter le préfixe "wss://" à l'adresse du VirtualHub ou du GatewayHub lors de l'appel à YAPI::RegisterHub. Le préfixe WSS signifie "WebSocket Secure" et configure la librairie pour communiquer à l'aide du protocole WebSocket sur une connexion chiffrée par SSL/TLS.

Voici le code pour initialiser une connexion avec un VirtualHub v2.0 en WebSocket sécurisée.

...
try {
  YAPI.RegisterHub("wss://vhub.example.com");
} catch (YAPI_Exception e) {
   e.printStackTrace();
}
...



Notez qu'il est aussi possible de forcer l'utilisation de l'ancien protocole HTTP mais en utilisant une connexion chiffrée à l'aide du préfix "https://"

...
try {
  YAPI.RegisterHub("https://vhub.example.com");
} catch (YAPI_Exception e) {
  e.printStackTrace();
}
...



Dans les deux cas, la librairie Yoctopuce se charge de chiffrer les données transmises.

Le reste des fonctionnalités de la librairie est inchangé. Pour résumer, il suffit d'ajouter le bon préfixe à l'adresse du VirtualHub lors de l'appel à la méthode YAPI.RegisterHub pour utiliser un protocole chiffré.

Les certificats autosigné (Self-signed certificate).


Le code précédent fonctionne correctement sur un serveur Web avec un certificat SSL/TLS  validé par une autorité de certification, mais souvent on n'a pas besoin de ce niveau de confiance et on utilise des certificats autosignés.

Comme la couche de cryptographie d'Android ne peut pas valider le certificat SSL auprès d'une autorité de certification, l'appel à YAPI.RegisterHub lance une exception avec le message "java.security.cert.CertPathValidatorException: Trust anchor for certification path not found".

Pour résoudre ce problème, il faut ajouter le certificat autosigné à la liste des certificats que votre application Android considère comme valide. Pour cela, il faut ajouter un attribut "android:networkSecurityConfig" au tag "application"" dans le manifeste de l'application.

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                   ... >
        ...
    </application>
</manifest>



La valeur de cet attribut est le path d'un fichier xml stocké dans les ressources, dans notre cas "network_security_config.xml". Ce fichier XML contient la liste des certificats autosignés qui sont acceptés par l'application.

Pour chaque certificat, il faut créer un nœud "domain-config". Ce nœud contient un sous-nœud "domain"" qui renseigne le nom d'hôte ou l'adresse IP du VirtualHub. Il faut aussi ajouter le nom de fichier du certificat correspondant dans le nœud "certificats". Dans notre cas, le certificat virtualhub_crt qui se trouve dans le sous-répertoire res/raw/.

<!--?xml version="1.0" encoding="utf-8"?-->
<network-security-config>

    <domain-config>
        <domain includeSubdomains="true">192.168.99.97</domain>
        <trust-anchors>
            <certificates src="@raw/virtualhub_crt"/>
        </trust-anchors>
    </domain-config>

</network-security-config>



La dernière étape est de copier le certificat utilisé par le VirtualHub dans le sous-répertoire res/raw/.

Pour récupérer ce certificat, vous pouvez le copier depuis son emplacement sur la machine qui exécute le VirtualHub. Par défaut il s'agit du fichier %AppData%/Yoctopuce/VirtualHubV2/.virtualhub.crt sous Windows ou ~/.virtualhub.crt sous Linux.

L'autre solution est d'accéder à l'interface du VirtualHub ou du GatewayHub à l'aide d'un browser Web. À côté de l'URL, il y a en général un petit cadenas qui permet de consulter le certificat utilisé. Quand le certificat est affiché, il y a un lien pour le télécharger.

Notez que le fonctionnement du système de ressources d'Android ne permet pas de référencer un fichier qui contient le caractère ".". Il faut donc renommer le certificat pour supprimer l'extension avant de la copier.


Une fois ces étapes réalisées, il est possible d'utiliser une connexion sécurisée avec l'hôte:

...
try {
  YAPI.RegisterHub("wss://192.168.99.97");
} catch (YAPI_Exception e) {
   e.printStackTrace();
}
...



Limitations


Pour que la librairie puisse établir un lien chiffré, il faut que les deux parties supportent SSL/TLS. Actuellement, seul le VirtualHub v2.0 et le GatewayHub supportent cette fonctionnalité. Il n'est donc pas encore possible d'utiliser cette fonctionnalité pour communiquer avec un YoctoHub.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.