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 :
Objet de certificat, qui implémente l’interface
ICertificate
:GetCertificatePfx()
doit retourner le contenu binaire d’unPKCS#12
magasin de certificats. Un.pfx
fichier contient desPKCS#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).
Un fournisseur de certificats implémentant l’interface
ICertificateProvider
:GetCertificate()
doit construire un objet de certificat et le renvoyer en appelantCertificateReceived()
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 appelerValidationCompleted()
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 laTokenReceived()
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 retournertrue
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 à laValidateCertificate()
méthode .ValidateCertificate()
doit valider la chaîne de certificats, puis appelerCertificateValidated()
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.