Abilitazione della sicurezza della connessione per la comunicazione remota olograficaEnabling connection security for Holographic Remoting

Importante

Queste linee guida sono specifiche per la comunicazione remota olografica in HoloLens 2.This guidance is specific to Holographic Remoting on HoloLens 2.

Questa pagina offre una panoramica della sicurezza di rete per la comunicazione remota olografica.This page gives you an overview of network security for Holographic Remoting. Sono disponibili informazioni suYou'll find information about

  • sicurezza nel contesto di comunicazione remota olografica e perché potrebbe essere necessariasecurity in the context of Holographic Remoting and why you might need it
  • misure consigliate basate su diversi casi di utilizzorecommended measures based on different use cases
  • implementazione della sicurezza nella soluzione di comunicazione remota olograficaimplementing security in your Holographic Remoting solution

Sicurezza della comunicazione remota olograficaHolographic Remoting security

La comunicazione remota olografica scambia informazioni in una rete.Holographic Remoting exchanges information over a network. Se non sono presenti misure di sicurezza, gli avversari nella stessa rete potrebbero compromettere l'integrità della comunicazione o accedere a informazioni riservate.If no security measures are in place, adversaries on the same network may compromise the integrity of the communication or access confidential information.

Le app di esempio e il lettore di comunicazione remota olografica in Windows Store sono con sicurezza disabilitata.The sample apps and the Holographic Remoting Player in the Windows Store come with security disabled. Questa operazione rende gli esempi più facili da comprendere.Doing so makes the samples easier to understand. Consente inoltre di iniziare più rapidamente con lo sviluppo.It also helps you to get started more quickly with development.

Per il test dei campi o la produzione, si consiglia vivamente di abilitare la sicurezza nella soluzione di comunicazione remota olografica.For field testing or production, we strongly recommend enabling security in your Holographic Remoting solution.

Sicurezza nella comunicazione remota olografica, quando è configurata correttamente per il caso d'uso, offre le seguenti garanzie:Security in Holographic Remoting, when set up correctly for your use case, gives you the following guarantees:

  • Autenticità: sia il lettore che l'app remota possono essere sicuri che l'altro lato sia quello che attestanoAuthenticity: both player and remote app can be sure the other side is who they claim to be
  • Riservatezza: nessuna parte di terze parti può leggere le informazioni scambiate tra il lettore e l'app remotaConfidentiality: no third party can read the information exchanged between player and remote app
  • Integrità: il lettore e il computer remoto possono rilevare eventuali modifiche in transito alla comunicazioneIntegrity: player and remote can detect any in-transit changes to their communication

Importante

Per poter usare le funzionalità di sicurezza, è necessario implementare sia un lettore personalizzato che un'app remota personalizzata usando le API OpenXR o di realtà mista di Windows .To be able to use security features, you will need to implement both a custom player and a custom remote app using either Windows Mixed Reality or OpenXR APIs.

Nota

A partire dalla versione 2.4.0 è possibile creare app Remote con l' API OpenXR .Starting with version 2.4.0 remote apps using the OpenXR API can be created. Una panoramica su come stabilire una connessione sicura in un ambiente OpenXR è disponibile di seguito.An overview on how to establish a secure connection in an OpenXR environment can be found below.

Pianificazione dell'implementazione della sicurezzaPlanning the security implementation

Quando si Abilita la sicurezza nella comunicazione remota olografica, la libreria .NET Remoting Abilita automaticamente la crittografia e i controlli di integrità per tutti i dati scambiati sulla rete.When you enable security in Holographic Remoting, the remoting library will automatically enable encryption and integrity checks for all data exchanged over the network.

Per garantire che l'autenticazione appropriata richieda comunque alcune operazioni aggiuntive.Ensuring proper authentication requires some extra work though. Ciò che è necessario fare dipende dal caso d'uso e la parte restante di questa sezione consiste nel comprendere i passaggi necessari.What exactly you need to do depends on your use case, and the rest of this section is about figuring out the necessary steps.

Importante

Questo articolo può fornire solo indicazioni generali.This article can only provide general guidance. Se non si è certi, è consigliabile consultare un esperto di sicurezza che possa fornire indicazioni specifiche per il caso d'uso.If you feel unsure, consider consulting a security expert that can give you guidance specific to your use case.

Prima di tutto la terminologia: quando si descrivono le connessioni di rete, verranno usati i termini client e Server .First some terminology: when describing network connections, the terms client and server will be used. Il server è il lato in ascolto delle connessioni in ingresso su un indirizzo endpoint noto e il client è quello che si connette all'endpoint del server.The server is the side listening for incoming connections on a known endpoint address, and the client is the one connecting to the server's endpoint.

Nota

I ruoli client e server non sono collegati a se un'app funge da lettore o come remoto.The client and and server roles are not tied to whether an app is acting as a player or as a remote. Mentre gli esempi hanno il lettore nel ruolo del server, è facile invertire i ruoli se si adatta meglio al caso d'uso.While the samples have the player in the server role, it's easy to reverse the roles if it better fits your use case.

Pianificazione dell'autenticazione da server a clientPlanning the server-to-client authentication

Il server utilizza certificati digitali per dimostrare la propria identità al client.The server uses digital certificates to prove its identity to the client. Il client convalida il certificato del server durante la fase di handshake della connessione.The client validates the server's certificate during the connection handshake phase. Se il client non considera attendibile il server, la connessione verrà terminata a questo punto.If the client doesn't trust the server, it will end the connection at this point.

Il modo in cui il client convalida il certificato del server e i tipi di certificati del server possono essere utilizzati, a seconda del caso d'uso.How the client validates the server certificate, and what kinds of server certificates can be used, depends on your use case.

Caso d'uso 1: Il nome host del server non è fisso oppure il server non è risolto dal nome host.Use case 1: The server hostname isn't fixed, or the server isn't addressed by host name at all.

In questo caso d'uso, non è pratico (o addirittura possibile) emettere un certificato per il nome host del server.In this use case, it isn't practical (or even possible) to issue a certificate for the server's host name. Si consiglia di convalidare invece l'identificazione personale del certificato.We recommendation you validate the certificate's thumbprint instead. Analogamente a un'impronta digitale umana, l'identificazione personale identifica in modo univoco un certificato.Like a human fingerprint, the thumbprint uniquely identifies a certificate.

È importante comunicare l'identificazione personale al client fuori banda.It's important to communicate the thumbprint to the client out-of-band. Ciò significa che non è possibile inviarlo tramite la stessa connessione di rete usata per la comunicazione remota.That means, you can't send it over the same network connection that's used for remoting. È invece possibile immetterlo manualmente nella configurazione del client o fare in modo che il client analizzi un codice a matrice.Instead, you could manually enter it into the client's configuration, or to have the client scan a QR code.

Caso d'uso 2: Il server può essere raggiunto tramite un nome host stabile.Use case 2: The server can be reached over a stable host name.

In questo caso di utilizzo, il server dispone di un nome host specifico e si è certi che questo nome non cambierà.In this use case, the server has a specific host name, and you know this name isn't likely to change. È quindi possibile usare un certificato emesso per il nome host del server.You can then use a certificate issued to the server's host name. La relazione di trust verrà stabilita in base al nome host e alla catena di certificati del certificato.Trust will be established based on the host name and the certificate's chain of trust.

Se si sceglie questa opzione, il client deve verificare in anticipo il nome host del server e il certificato radice.If you choose this option, the client needs to know the server's host name and the root certificate in advance.

Pianificazione dell'autenticazione da client a serverPlanning the client-to-server authentication

I client eseguono l'autenticazione nel server usando un token in formato libero.Clients authenticate against the server using a free-form token. Ciò che questo token deve contenere dipenderà da un caso d'uso:What this token should contain will again depend on your use case:

Caso d'uso 1: È sufficiente verificare l'identità dell'app client.Use case 1: You only need to verify the client app's identity.

In questo caso di utilizzo, un segreto condiviso può essere sufficiente.In this use case, a shared secret can be sufficient. Questo segreto deve essere sufficientemente complesso da non poter essere indovinato.This secret must be complex enough that it can't be guessed.

Un segreto condiviso valido è un GUID casuale, che viene immesso manualmente nella configurazione del server e del client.A good shared secret is a random GUID, which is manually entered in both the server's and client's configuration. Per crearne uno è possibile, ad esempio, usare il New-Guid comando in PowerShell.To create one you can, for example, use the New-Guid command in PowerShell.

Verificare che il segreto condiviso non venga mai comunicato su canali non sicuri.Make sure this shared secret is never communicated over insecure channels. La libreria .NET Remoting garantisce che il segreto condiviso venga sempre inviato crittografato e solo ai peer attendibili.The remoting library ensures that the shared secret is always sent encrypted, and only to trusted peers.

Caso d'uso 2: È anche necessario verificare l'identità dell'utente dell'app client.Use case 2: You also need to verify the identity of the client app's user.

Un segreto condiviso non sarà sufficiente per coprire il caso d'uso.A shared secret won't be enough to cover this use case. È invece possibile usare i token creati da un provider di identità.Instead, you can use tokens created by an identity provider. Un flusso di lavoro di autenticazione che usa un provider di identità avrà un aspetto simile al seguente:An authentication workflow using an identity provider would look like this:

  • Il client autorizza il provider di identità e richiede un tokenThe client authorizes against the identity provider and requests a token
  • Il provider di identità genera un token e lo invia al clientThe identity provider generates a token and sends it to the client
  • Il client invia questo token al server tramite la comunicazione remota olograficaThe client sends this token to the server through Holographic Remoting
  • Il server convalida il token del client rispetto al provider di identitàThe server validates the client's token against the identity provider

Un esempio di provider di identità è la piattaforma di identità Microsoft.One example of an identity provider is the Microsoft identity platform.

Come nel caso di utilizzo precedente, assicurarsi che questi token non vengano inviati tramite canali non protetti o altrimenti esposti.Like in the previous use case, make sure these tokens aren't sent through insecure channels or otherwise exposed.

Implementazione della sicurezza di comunicazione remota olograficaImplementing holographic remoting security

Tenere presente che è necessario implementare app Remote e Player personalizzate se si vuole abilitare la sicurezza della connessione.Remember that you need to implement custom remote and player apps if you want to enable connection security. È possibile usare gli esempi forniti come punti di partenza per le proprie app.You can use the provided samples as starting points for your own apps.

Per abilitare la sicurezza, chiamare ListenSecure() anziché Listen() e ConnectSecure() anziché Connect() per stabilire la connessione remota.To enable security, call ListenSecure() instead of Listen(), and ConnectSecure() instead of Connect() to establish the remoting connection.

Per queste chiamate è necessario fornire implementazioni di determinate interfacce per fornire e convalidare le informazioni relative alla sicurezza:These calls require you to provide implementations of certain interfaces for providing and validating security-related information:

  • Il server deve implementare un provider di certificati e un validator di autenticazioneThe server needs to implement a certificate provider and an authentication validator
  • Il client deve implementare un provider di autenticazione e un validator del certificato.The client needs to implement an authentication provider and a certificate validator.

Tutte le interfacce dispongono di una funzione che richiede di eseguire un'azione, che riceve un oggetto callback come parametro.All interfaces have a function requesting you to take action, which receives a callback object as parameter. Utilizzando questo oggetto, è possibile implementare facilmente la gestione asincrona della richiesta.Using this object, you can easily implement asynchronous handling of the request. Mantiene un riferimento a questo oggetto e chiama la funzione di completamento quando l'azione asincrona è completa.Keep a reference to this object, and call the completion function when the asynchronous action is complete. La funzione di completamento può essere chiamata da qualsiasi thread.The completion function may be called from any thread.

Suggerimento

L'implementazione di interfacce WinRT può essere eseguita facilmente con C++/WinRT.Implementing WinRT interfaces can easily be done using C++/WinRT. Il capitolo API autore con C++/WinRT descrive in modo dettagliato questo aspetto.The Author APIs with C++/WinRT chapter describes this in detail.

Importante

Il contenuto del build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl pacchetto NuGet contiene la documentazione dettagliata per l'API relativa alle connessioni protette.The build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl inside the NuGet package contains detailed documentation for the API related to secure connections.

Implementazione di un provider di certificatiImplementing a certificate provider

I provider di certificati forniscono all'applicazione server il certificato da utilizzare.Certificate providers supply the server application with the certificate to use. L'implementazione di è costituita da due parti:The implementation consists of two parts:

  1. Oggetto Certificate, che implementa l' ICertificate interfaccia:A certificate object, which implements the ICertificate interface:

    • GetCertificatePfx() deve restituire il contenuto binario di un PKCS#12 archivio certificati.GetCertificatePfx() should return the binary contents of a PKCS#12 certificate store. Un .pfx file contiene PKCS#12 dati, quindi il relativo contenuto può essere usato direttamente qui.A .pfx file contains PKCS#12 data, so its contents can be used directly here.
    • GetSubjectName() deve restituire il nome descrittivo che identifica il certificato da utilizzare.GetSubjectName() should return the friendly name that identifies the certificate to use. Se al certificato non è assegnato alcun nome descrittivo, questa funzione deve restituire il nome del soggetto del certificato.If no friendly name is assigned to the certificate, this function should return the certificate's subject name.
    • GetPfxPassword() deve restituire la password necessaria per aprire l'archivio certificati o una stringa vuota se non è necessaria alcuna password.GetPfxPassword() should return the password required to open the certificate store (or an empty string if no password is required).
  2. Un provider di certificati che implementa l' ICertificateProvider interfaccia:A certificate provider implementing the ICertificateProvider interface:

    • GetCertificate() deve costruire un oggetto certificato e restituirlo chiamando CertificateReceived() sull'oggetto callback.GetCertificate() should construct a certificate object and return it by calling CertificateReceived() on the callback object.

Implementazione di un validator di autenticazioneImplementing an authentication validator

I validator di autenticazione ricevono il token di autenticazione inviato dal client e rispondono con il risultato della convalida.Authentication validators receive the authentication token sent by the client, and answer back with the validation result.

Implementare l' IAuthenticationReceiver interfaccia come segue:Implement the IAuthenticationReceiver interface as follows:

  • GetRealm() deve restituire il nome dell'area di autenticazione (area di autenticazione HTTP utilizzata durante l'handshake della connessione remota).GetRealm() should return the name of the authentication realm (an HTTP realm used during the remoting connection handshake).
  • ValidateToken() deve convalidare il token di autenticazione client e chiamare ValidationCompleted() sull'oggetto callback con il risultato della convalida.ValidateToken() should validate the client authentication token and call ValidationCompleted() on the callback object with the validation result.

Implementazione di un provider di autenticazioneImplementing an authentication provider

I provider di autenticazione generano o recuperano il token di autenticazione da inviare al server.Authentication providers generate or retrieve the authentication token to be sent to the server.

Implementare l' IAuthenticationProvider interfaccia come segue:Implement the IAuthenticationProvider interface as follows:

  • GetToken() deve generare o recuperare il token di autenticazione da inviare.GetToken() should generate or retrieve the authentication token to be sent. Quando il token è pronto, chiamare il TokenReceived() metodo sull'oggetto callback.Once the token is ready, call the TokenReceived() method on the callback object.

Implementazione di un validator del certificatoImplementing a certificate validator

I validator dei certificati ricevono la catena di certificati inviata dal server e determinano se il server può essere considerato attendibile.Certificate validators receive the certificate chain sent by the server and determine whether the server can be trusted.

Per convalidare i certificati, è possibile usare la logica di convalida del sistema sottostante.To validate certificates, you can use the validation logic of the underlying system. Questa convalida del sistema può supportare una logica di convalida personalizzata o sostituirla.This system validation can either support your own validation logic, or replace it altogether. Se non si passa il proprio validator del certificato quando si richiede una connessione protetta, la convalida del sistema verrà usata automaticamente.If you don't pass your own certificate validator when requesting a secure connection, system validation will be used automatically.

In Windows, la convalida del sistema verificherà quanto segue:On Windows, the system validation will check for:

  • Integrità della catena di certificati: i certificati formano una catena coerente che termina in corrispondenza di un certificato radice attendibileIntegrity of the certificate chain: the certificates form a consistent chain that ends at a trusted root certificate
  • Validità del certificato: il certificato del server è compreso nell'intervallo di validità e viene emesso per l'autenticazione serverCertificate validity: the server's certificate is within its validity timespan, and is issued for server authentication
  • Revoca: il certificato non è stato revocatoRevocation: The certificate hasn't been revoked
  • Nome corrispondenza: il nome host del server corrisponde a uno dei nomi host per i quali è stato emesso il certificatoName match: The host name of the server matches one of the host names the certificate was issued for

Implementare l' ICertificateValidator interfaccia come segue:Implement the ICertificateValidator interface as follows:

  • PerformSystemValidation() deve restituire true se deve essere eseguita una convalida del sistema come descritto in precedenza.PerformSystemValidation() should return true if a system validation as described above should be performed. In questo caso, il risultato della convalida del sistema viene passato come input al ValidateCertificate() metodo.In this case, the system validation result is passed as an input to the ValidateCertificate() method.
  • ValidateCertificate() deve convalidare la catena di certificati e quindi chiamare CertificateValidated() sul callback passato con il risultato di convalida finale.ValidateCertificate() should validate the certificate chain and then call CertificateValidated() on the passed callback with the final validation result. Questo metodo accetta la catena di certificati, il nome del server con cui viene stabilita la connessione e il fatto che sia necessario forzare un controllo di revoca.This method accepts the certificate chain, the name of the server the connection is being established with, and whether a revocation check should be forced. Se la catena di certificati contiene più certificati, il primo è il certificato soggetto.If the certificate chain contains multiple certificates, the first one is the subject certificate.

Nota

Se il caso d'uso richiede una forma diversa di convalida (vedere il caso d'uso del certificato #1 sopra), ignorare completamente la convalida del sistema.If your use case requires a different form of validation (see certificate use case #1 above), bypass system validation entirely. Usare invece qualsiasi API o libreria in grado di gestire i certificati X. 509 con codifica DER per decodificare la catena di certificati ed eseguire i controlli necessari per il caso d'uso.Instead, use any API or library that can handle DER-encoded X.509 certificates to decode the certificate chain and perform the checks needed for your use case.

Connessione sicura tramite l'API OpenXRSecure connection using the OpenXR API

Quando si usa l' API OpenXR , tutte le API correlate alla connessione sicura sono disponibili come parte dell' XR_MSFT_holographic_remoting estensione OpenXR.When using the OpenXR API all secure connection-related API is available as part of the XR_MSFT_holographic_remoting OpenXR extension.

Importante

Per informazioni sull'API dell'estensione OpenXR per la comunicazione remota olografica, vedere la specifica che si trova nel repository GitHub degli esempi di comunicazione remota olografica.To learn about the Holographic Remoting OpenXR extension API, check out the specification which can be found in the Holographic Remoting samples github repository.

Gli elementi chiave per la connessione sicura mediante l' XR_MSFT_holographic_remoting estensione OpenXR sono i callback seguenti.The key elements for secure connection using the XR_MSFT_holographic_remoting OpenXR extension are the following callbacks.

  • xrRemotingRequestAuthenticationTokenCallbackMSFT, genera o Recupera il token di autenticazione da inviare.xrRemotingRequestAuthenticationTokenCallbackMSFT, generates, or retrieves the authentication token to be sent.
  • xrRemotingValidateServerCertificateCallbackMSFT, convalida la catena di certificati.xrRemotingValidateServerCertificateCallbackMSFT, validates the certificate chain.
  • xrRemotingValidateAuthenticationTokenCallbackMSFT, convalida il token di autenticazione del client.xrRemotingValidateAuthenticationTokenCallbackMSFT, validates the client authentication token.
  • xrRemotingRequestServerCertificateCallbackMSFT, fornire l'applicazione server con il certificato da utilizzare.xrRemotingRequestServerCertificateCallbackMSFT, supply the server application with the certificate to use.

Questi callback possono essere forniti al runtime OpenXR di comunicazione remota tramite xrRemotingSetSecureConnectionClientCallbacksMSFT e xrRemotingSetSecureConnectionServerCallbacksMSFT .These callbacks can be provided to the remoting OpenXR runtime via xrRemotingSetSecureConnectionClientCallbacksMSFT and xrRemotingSetSecureConnectionServerCallbacksMSFT. Inoltre, la connessione protetta deve essere abilitata tramite il parametro secureConnection nella XrRemotingConnectInfoMSFT struttura o la XrRemotingListenInfoMSFT struttura a seconda che si stia usando xrRemotingConnectMSFT o xrRemotingListenMSFT .Additionally, the secure connection needs to be enabled via the secureConnection parameter on the XrRemotingConnectInfoMSFT structure or the XrRemotingListenInfoMSFT structure depending on whether you're using xrRemotingConnectMSFT or xrRemotingListenMSFT.

Questa API è simile all'API basata su IDL descritta in implementazione della sicurezza della comunicazione remota olografica.This API is similar to the IDL-based API described in Implementing holographic remoting security. Tuttavia, invece di implementare le interfacce, si dovrebbe fornire implementazioni di callback.However, instead of implementing interfaces, you're supposed to provide callback implementations. È possibile trovare un esempio dettagliato nell' app di esempio OpenXR.You can find a detailed example in the OpenXR sample app.

Vedere ancheSee Also