Connexion sécurisée avec la communication à distance holographique et l’API Windows Mixed Reality

N’oubliez pas que vous devez implémenter des applications distantes et de lecteur personnalisées si vous souhaitez activer la sécurité de connexion. Vous pouvez utiliser les exemples fournis comme points de départ pour vos propres applications.

Pour activer la sécurité, appelez ListenSecure() au lieu de Listen()et ConnectSecure() au lieu de Connect() pour établir la connexion à distance.

Ces appels vous obligent à fournir des implémentations de certaines interfaces pour fournir et valider des informations liées à la sécurité :

  • Le serveur doit implémenter un fournisseur de certificats et un validateur d’authentification
  • Le client doit implémenter un fournisseur d’authentification et un validateur de certificat.

Toutes les interfaces ont une fonction vous demandant d’effectuer une action, qui reçoit un objet de rappel en tant que paramètre. À l’aide de cet objet, vous pouvez facilement implémenter la gestion asynchrone de la demande. Conservez une référence à cet objet et appelez la fonction d’achèvement lorsque l’action asynchrone est terminée. La fonction d’achèvement peut être appelée à partir de n’importe quel thread.

Conseil

L’implémentation d’interfaces WinRT peut facilement être effectuée à l’aide de C++/WinRT. Le chapitre Api d’auteur avec C++/WinRT décrit cela en détail.

Important

À build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl l’intérieur du package NuGet, vous trouverez une documentation détaillée pour l’API liée aux connexions sécurisées.

Implémentation d’un fournisseur de certificats

Les fournisseurs de certificats fournissent à l’application serveur le certificat à utiliser. L’implémentation se compose de deux parties :

  1. Objet de certificat, qui implémente l’interface ICertificate :

    • GetCertificatePfx() doit retourner le contenu binaire d’un PKCS#12 magasin de certificats. Un .pfx fichier contient des PKCS#12 données, de sorte que son contenu peut être utilisé directement ici.
    • GetSubjectName() doit retourner le nom convivial qui identifie le certificat à utiliser. Si aucun nom convivial n’est attribué au certificat, cette fonction doit retourner le nom d’objet du certificat.
    • GetPfxPassword() doit retourner le mot de passe requis pour ouvrir le magasin de certificats (ou une chaîne vide si aucun mot de passe n’est requis).
  2. Un fournisseur de certificats implémentant l’interface ICertificateProvider :

    • GetCertificate() doit construire un objet de certificat et le renvoyer en appelant CertificateReceived() sur l’objet de rappel.

Implémentation d’un validateur d’authentification

Les validateurs d’authentification reçoivent le jeton d’authentification envoyé par le client et répondent avec le résultat de la validation.

Implémentez l’interface IAuthenticationReceiver comme suit :

  • GetRealm() doit retourner le nom du domaine d’authentification (un domaine HTTP utilisé lors de l’établissement de la connexion à distance).
  • ValidateToken() doit valider le jeton d’authentification client et appeler ValidationCompleted() l’objet de rappel avec le résultat de validation.

Implémentation d’un fournisseur d’authentification

Les fournisseurs d’authentification génèrent ou récupèrent le jeton d’authentification à envoyer au serveur.

Implémentez l’interface IAuthenticationProvider comme suit :

  • GetToken() doit générer ou récupérer le jeton d’authentification à envoyer. Une fois le jeton prêt, appelez la TokenReceived() méthode sur l’objet de rappel.

Implémentation d’un validateur de certificat

Les validateurs de certificats reçoivent la chaîne de certificats envoyée par le serveur et déterminent si le serveur peut être approuvé.

Pour valider les certificats, vous pouvez utiliser la logique de validation du système sous-jacent. Cette validation système peut prendre en charge votre propre logique de validation ou la remplacer complètement. Si vous ne passez pas votre propre validateur de certificat lors de la demande d’une connexion sécurisée, la validation du système est utilisée automatiquement.

Sur Windows, la validation système case activée pour :

  • Intégrité de la chaîne de certificats : les certificats forment une chaîne cohérente qui se termine par un certificat racine approuvé
  • Validité du certificat : le certificat du serveur est dans son délai de validité et est émis pour l’authentification du serveur
  • Révocation : le certificat n’a pas été révoqué
  • Correspondance de nom : le nom d’hôte du serveur correspond à l’un des noms d’hôte pour 2000 dont le certificat a été émis

Implémentez l’interface ICertificateValidator comme suit :

  • PerformSystemValidation() doit retourner true si une validation système, comme décrit ci-dessus, doit être effectuée. Dans ce cas, le résultat de la validation système est passé en tant qu’entrée à la ValidateCertificate() méthode .
  • ValidateCertificate() doit valider la chaîne de certificats, puis appeler CertificateValidated() le rappel passé avec le résultat de validation final. Cette méthode accepte la chaîne de certificats, le nom du serveur avec lequel la connexion est établie et si une révocation case activée doit être forcée. Si la chaîne de certificats contient plusieurs certificats, le premier est le certificat d’objet.

Notes

Si votre cas d’usage nécessite une autre forme de validation (voir le cas d’usage du certificat n°1 ci-dessus), ignorez entièrement la validation du système. Utilisez plutôt n’importe quelle API ou bibliothèque qui peut gérer les certificats X.509 codés en DER pour décoder la chaîne de certificats et effectuer les vérifications nécessaires pour votre cas d’usage.

Voir aussi