Habilitación de la seguridad de conexión para Holographic RemotingEnabling connection security for Holographic Remoting

Importante

Esta guía es específica de Holographic Remoting en HoloLens 2.This guidance is specific to Holographic Remoting on HoloLens 2.

Esta página proporciona información general sobre la seguridad de red para Holographic Remoting.This page gives you an overview of network security for Holographic Remoting. Encontrará información sobreYou'll find information about

  • seguridad en el contexto de Holographic Remoting y por qué podría necesitarlosecurity in the context of Holographic Remoting and why you might need it
  • medidas recomendadas basadas en diferentes casos de usorecommended measures based on different use cases
  • implementación de la seguridad en la solución de Holographic Remotingimplementing security in your Holographic Remoting solution

Seguridad de Holographic RemotingHolographic Remoting security

Holographic Remoting intercambia información a través de una red.Holographic Remoting exchanges information over a network. Si no se aplica ninguna medida de seguridad, los adversarios en la misma red puede poner en peligro la integridad de la comunicación o acceder a la información confidencial.If no security measures are in place, adversaries on the same network may compromise the integrity of the communication or access confidential information.

Las aplicaciones de ejemplo y el reproductor de comunicación remota holográfica en la tienda Windows tienen la seguridad deshabilitada.The sample apps and the Holographic Remoting Player in the Windows Store come with security disabled. Esto hace que los ejemplos sean más fáciles de entender.Doing so makes the samples easier to understand. También le ayuda a empezar a trabajar más rápidamente con el desarrollo.It also helps you to get started more quickly with development.

En el caso de las pruebas de campo o de producción, se recomienda encarecidamente habilitar la seguridad en la solución de Holographic Remoting.For field testing or production, we strongly recommend enabling security in your Holographic Remoting solution.

La seguridad de Holographic Remoting, cuando se configura correctamente para su caso de uso, ofrece las siguientes garantías:Security in Holographic Remoting, when set up correctly for your use case, gives you the following guarantees:

  • Autenticidad: tanto el reproductor como la aplicación remota pueden estar seguros de que el otro lado es quien dice serAuthenticity: both player and remote app can be sure the other side is who they claim to be
  • Confidencialidad: ningún tercero puede leer la información intercambiada entre el reproductor y la aplicación remotaConfidentiality: no third party can read the information exchanged between player and remote app
  • Integridad: el reproductor y el remoto pueden detectar cualquier cambio en tránsito a su comunicaciónIntegrity: player and remote can detect any in-transit changes to their communication

Importante

Para poder usar las características de seguridad, debe implementar un reproductor personalizado y una aplicación remota personalizada mediante Windows Mixed Reality o las API de OpenXR .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 partir de la versión 2.4.0 , se pueden crear aplicaciones remotas con la API de OpenXR .Starting with version 2.4.0 remote apps using the OpenXR API can be created. A continuaciónencontrará información general sobre cómo establecer una conexión segura en un entorno de OpenXR.An overview on how to establish a secure connection in an OpenXR environment can be found below.

Planeación de la implementación de seguridadPlanning the security implementation

Cuando se habilita la seguridad en Holographic Remoting, la biblioteca remota habilitará automáticamente el cifrado y las comprobaciones de integridad de todos los datos intercambiados a través de la red.When you enable security in Holographic Remoting, the remoting library will automatically enable encryption and integrity checks for all data exchanged over the network.

Sin embargo, garantizar la correcta autenticación requiere algún trabajo adicional.Ensuring proper authentication requires some extra work though. Lo que debe hacer exactamente depende de su caso de uso y el resto de esta sección trata de determinar los pasos necesarios.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

Este artículo solo puede proporcionar instrucciones generales.This article can only provide general guidance. Si no está seguro, considere la posibilidad de consultar a un experto en seguridad que pueda proporcionarle orientación específica para su caso de uso.If you feel unsure, consider consulting a security expert that can give you guidance specific to your use case.

En primer lugar, se usa la terminología siguiente: al describir las conexiones de red, se utilizarán los términos cliente y servidor .First some terminology: when describing network connections, the terms client and server will be used. El servidor es el lado que escucha las conexiones entrantes en una dirección de extremo conocida y el cliente es el que se conecta al punto de conexión del servidor.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

Los roles de servidor y cliente no están asociados a si una aplicación actúa como un reproductor o como remota.The client and and server roles are not tied to whether an app is acting as a player or as a remote. Aunque los ejemplos tienen el reproductor en el rol de servidor, es fácil invertir los roles si se adapta mejor a su caso de 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.

Planeación de la autenticación de servidor a clientePlanning the server-to-client authentication

El servidor utiliza certificados digitales para demostrar su identidad al cliente.The server uses digital certificates to prove its identity to the client. El cliente valida el certificado del servidor durante la fase de protocolo de enlace de la conexión.The client validates the server's certificate during the connection handshake phase. Si el cliente no confía en el servidor, finalizará la conexión en este momento.If the client doesn't trust the server, it will end the connection at this point.

El modo en que el cliente valida el certificado de servidor y los tipos de certificados de servidor que se pueden usar dependen del caso de uso.How the client validates the server certificate, and what kinds of server certificates can be used, depends on your use case.

Caso de uso 1: El nombre de host del servidor no es fijo, o bien el servidor no se dirige en absoluto.Use case 1: The server hostname isn't fixed, or the server isn't addressed by host name at all.

En este caso de uso, no es práctico (ni siquiera posible) emitir un certificado para el nombre de host del servidor.In this use case, it isn't practical (or even possible) to issue a certificate for the server's host name. En su lugar, se recomienda validar la huella digital del certificado.We recommendation you validate the certificate's thumbprint instead. Al igual que una huella digital humana, la huella digital identifica de forma única un certificado.Like a human fingerprint, the thumbprint uniquely identifies a certificate.

Es importante comunicar la huella digital al cliente fuera de banda.It's important to communicate the thumbprint to the client out-of-band. Esto significa que no se puede enviar a través de la misma conexión de red que se usa para la comunicación remota.That means, you can't send it over the same network connection that's used for remoting. En su lugar, puede escribirlo manualmente en la configuración del cliente o para que el cliente examine un código QR.Instead, you could manually enter it into the client's configuration, or to have the client scan a QR code.

Caso de uso 2: Se puede tener acceso al servidor a través de un nombre de host estable.Use case 2: The server can be reached over a stable host name.

En este caso de uso, el servidor tiene un nombre de host específico y sabe que este nombre no es probable que cambie.In this use case, the server has a specific host name, and you know this name isn't likely to change. Después, puede usar un certificado emitido para el nombre de host del servidor.You can then use a certificate issued to the server's host name. La confianza se establecerá en función del nombre de host y la cadena de confianza del certificado.Trust will be established based on the host name and the certificate's chain of trust.

Si elige esta opción, el cliente necesita conocer el nombre de host del servidor y el certificado raíz de antemano.If you choose this option, the client needs to know the server's host name and the root certificate in advance.

Planeación de la autenticación de cliente a servidorPlanning the client-to-server authentication

Los clientes se autentican en el servidor mediante un token de forma libre.Clients authenticate against the server using a free-form token. Lo que debe contener este token dependerá de nuevo en el caso de uso:What this token should contain will again depend on your use case:

Caso de uso 1: Solo tiene que comprobar la identidad de la aplicación cliente.Use case 1: You only need to verify the client app's identity.

En este caso de uso, un secreto compartido puede ser suficiente.In this use case, a shared secret can be sufficient. Este secreto debe ser lo suficientemente complejo como para que no se pueda adivinar.This secret must be complex enough that it can't be guessed.

Un secreto compartido bueno es un GUID aleatorio, que se especifica manualmente tanto en la configuración del cliente como del servidor.A good shared secret is a random GUID, which is manually entered in both the server's and client's configuration. Para crear uno, por ejemplo, puede usar el New-Guid comando en PowerShell.To create one you can, for example, use the New-Guid command in PowerShell.

Asegúrese de que este secreto compartido nunca se comunica a través de canales no seguros.Make sure this shared secret is never communicated over insecure channels. La biblioteca remota garantiza que el secreto compartido siempre se envíe cifrado y solo a los elementos del mismo nivel de confianza.The remoting library ensures that the shared secret is always sent encrypted, and only to trusted peers.

Caso de uso 2: También debe comprobar la identidad del usuario de la aplicación cliente.Use case 2: You also need to verify the identity of the client app's user.

Un secreto compartido no será suficiente para cubrir este caso de uso.A shared secret won't be enough to cover this use case. En su lugar, puede usar tokens creados por un proveedor de identidades.Instead, you can use tokens created by an identity provider. Un flujo de trabajo de autenticación mediante un proveedor de identidades sería similar al siguiente:An authentication workflow using an identity provider would look like this:

  • El cliente autoriza al proveedor de identidades y solicita un tokenThe client authorizes against the identity provider and requests a token
  • El proveedor de identidades genera un token y lo envía al cliente.The identity provider generates a token and sends it to the client
  • El cliente envía este token al servidor mediante la comunicación remota holográficaThe client sends this token to the server through Holographic Remoting
  • El servidor valida el token del cliente con el proveedor de identidadesThe server validates the client's token against the identity provider

Un ejemplo de un proveedor de identidades es la plataforma de Microsoft Identity.One example of an identity provider is the Microsoft identity platform.

Al igual que en el caso de uso anterior, asegúrese de que estos tokens no se envían a través de canales no seguros o expuestos de otro modo.Like in the previous use case, make sure these tokens aren't sent through insecure channels or otherwise exposed.

Implementación de la seguridad de Holographic RemotingImplementing holographic remoting security

Recuerde que debe implementar aplicaciones de reproductor y remotas personalizadas si desea habilitar la seguridad de la conexión.Remember that you need to implement custom remote and player apps if you want to enable connection security. Puede usar los ejemplos proporcionados como puntos de partida para sus propias aplicaciones.You can use the provided samples as starting points for your own apps.

Para habilitar la seguridad, llame a ListenSecure() en lugar de Listen() y en ConnectSecure() lugar de Connect() para establecer la conexión remota.To enable security, call ListenSecure() instead of Listen(), and ConnectSecure() instead of Connect() to establish the remoting connection.

Estas llamadas requieren que proporcione implementaciones de ciertas interfaces para proporcionar y validar información relacionada con la seguridad:These calls require you to provide implementations of certain interfaces for providing and validating security-related information:

  • El servidor debe implementar un proveedor de certificados y un validador de autenticaciónThe server needs to implement a certificate provider and an authentication validator
  • El cliente debe implementar un proveedor de autenticación y un validador de certificado.The client needs to implement an authentication provider and a certificate validator.

Todas las interfaces tienen una función que le solicita que realice una acción, que recibe un objeto de devolución de llamada como parámetro.All interfaces have a function requesting you to take action, which receives a callback object as parameter. Con este objeto, puede implementar fácilmente el control asincrónico de la solicitud.Using this object, you can easily implement asynchronous handling of the request. Mantenga una referencia a este objeto y llame a la función de finalización cuando se complete la acción asincrónica.Keep a reference to this object, and call the completion function when the asynchronous action is complete. Se puede llamar a la función de finalización desde cualquier subproceso.The completion function may be called from any thread.

Sugerencia

La implementación de interfaces de WinRT se puede realizar fácilmente con C++/WinRT.Implementing WinRT interfaces can easily be done using C++/WinRT. En el capítulo API de autor con C++/WinRT se describe con más detalle.The Author APIs with C++/WinRT chapter describes this in detail.

Importante

build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idlEn el paquete de NuGet se incluye documentación detallada sobre la API relacionada con las conexiones seguras.The build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl inside the NuGet package contains detailed documentation for the API related to secure connections.

Implementación de un proveedor de certificadosImplementing a certificate provider

Los proveedores de certificados proporcionan a la aplicación de servidor el certificado que se va a usar.Certificate providers supply the server application with the certificate to use. La implementación consta de dos partes:The implementation consists of two parts:

  1. Un objeto de certificado, que implementa la ICertificate interfaz:A certificate object, which implements the ICertificate interface:

    • GetCertificatePfx() debe devolver el contenido binario de un PKCS#12 almacén de certificados.GetCertificatePfx() should return the binary contents of a PKCS#12 certificate store. Un .pfx archivo contiene PKCS#12 datos, por lo que su contenido se puede usar directamente aquí.A .pfx file contains PKCS#12 data, so its contents can be used directly here.
    • GetSubjectName() debe devolver el nombre descriptivo que identifica el certificado que se va a usar.GetSubjectName() should return the friendly name that identifies the certificate to use. Si no se ha asignado ningún nombre descriptivo al certificado, esta función debe devolver el nombre de sujeto del certificado.If no friendly name is assigned to the certificate, this function should return the certificate's subject name.
    • GetPfxPassword() debe devolver la contraseña necesaria para abrir el almacén de certificados (o una cadena vacía si no se requiere ninguna contraseña).GetPfxPassword() should return the password required to open the certificate store (or an empty string if no password is required).
  2. Un proveedor de certificados que implementa la ICertificateProvider interfaz:A certificate provider implementing the ICertificateProvider interface:

    • GetCertificate() debe construir un objeto de certificado y devolverlo llamando a CertificateReceived() en el objeto de devolución de llamada.GetCertificate() should construct a certificate object and return it by calling CertificateReceived() on the callback object.

Implementar un validador de autenticaciónImplementing an authentication validator

Los validadores de autenticación reciben el token de autenticación enviado por el cliente y responden con el resultado de la validación.Authentication validators receive the authentication token sent by the client, and answer back with the validation result.

Implemente la IAuthenticationReceiver interfaz de la siguiente manera:Implement the IAuthenticationReceiver interface as follows:

  • GetRealm() debe devolver el nombre del dominio Kerberos de autenticación (un dominio HTTP usado durante el protocolo de enlace de la conexión remota).GetRealm() should return the name of the authentication realm (an HTTP realm used during the remoting connection handshake).
  • ValidateToken() debe validar el token de autenticación del cliente y llamar a ValidationCompleted() en el objeto de devolución de llamada con el resultado de la validación.ValidateToken() should validate the client authentication token and call ValidationCompleted() on the callback object with the validation result.

Implementación de un proveedor de autenticaciónImplementing an authentication provider

Los proveedores de autenticación generan o recuperan el token de autenticación que se va a enviar al servidor.Authentication providers generate or retrieve the authentication token to be sent to the server.

Implemente la IAuthenticationProvider interfaz de la siguiente manera:Implement the IAuthenticationProvider interface as follows:

  • GetToken() debe generar o recuperar el token de autenticación que se va a enviar.GetToken() should generate or retrieve the authentication token to be sent. Una vez que el token esté listo, llame al TokenReceived() método en el objeto de devolución de llamada.Once the token is ready, call the TokenReceived() method on the callback object.

Implementar un validador de certificadoImplementing a certificate validator

Los validadores de certificado reciben la cadena de certificados enviada por el servidor y determinan si se puede confiar en el servidor.Certificate validators receive the certificate chain sent by the server and determine whether the server can be trusted.

Para validar los certificados, puede utilizar la lógica de validación del sistema subyacente.To validate certificates, you can use the validation logic of the underlying system. Esta validación del sistema puede admitir su propia lógica de validación o reemplazarla por completo.This system validation can either support your own validation logic, or replace it altogether. Si no pasa su propio validador de certificado al solicitar una conexión segura, se usará automáticamente la validación del sistema.If you don't pass your own certificate validator when requesting a secure connection, system validation will be used automatically.

En Windows, la validación del sistema comprobará:On Windows, the system validation will check for:

  • Integridad de la cadena de certificados: los certificados forman una cadena coherente que termina en un certificado raíz de confianzaIntegrity of the certificate chain: the certificates form a consistent chain that ends at a trusted root certificate
  • Validez del certificado: el certificado del servidor se encuentra dentro del intervalo de tiempo de validez y se emite para la autenticación del servidor.Certificate validity: the server's certificate is within its validity timespan, and is issued for server authentication
  • Revocación: no se ha revocado el certificadoRevocation: The certificate hasn't been revoked
  • Coincidencia de nombre: el nombre de host del servidor coincide con uno de los nombres de host para los que se emitió el certificado.Name match: The host name of the server matches one of the host names the certificate was issued for

Implemente la ICertificateValidator interfaz de la siguiente manera:Implement the ICertificateValidator interface as follows:

  • PerformSystemValidation() debe devolver true si se debe realizar una validación del sistema tal y como se ha descrito anteriormente.PerformSystemValidation() should return true if a system validation as described above should be performed. En este caso, el resultado de la validación del sistema se pasa como entrada al ValidateCertificate() método.In this case, the system validation result is passed as an input to the ValidateCertificate() method.
  • ValidateCertificate() debe validar la cadena de certificados y, a continuación, llamar a CertificateValidated() en la devolución de llamada pasada con el resultado de la validación final.ValidateCertificate() should validate the certificate chain and then call CertificateValidated() on the passed callback with the final validation result. Este método acepta la cadena de certificados, el nombre del servidor con el que se establece la conexión y si se debe forzar una comprobación de revocación.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. Si la cadena de certificados contiene varios certificados, el primero es el certificado del firmante.If the certificate chain contains multiple certificates, the first one is the subject certificate.

Nota

Si el caso de uso requiere una forma de validación diferente (consulte el caso de uso de certificados #1 anterior), omita completamente la validación del sistema.If your use case requires a different form of validation (see certificate use case #1 above), bypass system validation entirely. En su lugar, use cualquier API o biblioteca que pueda controlar los certificados X. 509 con codificación DER para descodificar la cadena de certificados y realizar las comprobaciones necesarias para su caso de 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.

Conexión segura mediante la API de OpenXRSecure connection using the OpenXR API

Cuando se usa la API de OpenXR , todas las API relacionadas con la conexión segura están disponibles como parte de la XR_MSFT_holographic_remoting extensión OpenXR.When using the OpenXR API all secure connection-related API is available as part of the XR_MSFT_holographic_remoting OpenXR extension.

Importante

Para obtener información acerca de la API de extensión OpenXR de Holographic Remoting, consulte la especificación que se encuentra en el repositorio de github de ejemplos de la comunicación remota de Holographic.To learn about the Holographic Remoting OpenXR extension API, check out the specification which can be found in the Holographic Remoting samples github repository.

Los elementos clave para la conexión segura mediante la XR_MSFT_holographic_remoting extensión OpenXR son las siguientes devoluciones de llamada.The key elements for secure connection using the XR_MSFT_holographic_remoting OpenXR extension are the following callbacks.

  • xrRemotingRequestAuthenticationTokenCallbackMSFT, genera o recupera el token de autenticación que se va a enviar.xrRemotingRequestAuthenticationTokenCallbackMSFT, generates, or retrieves the authentication token to be sent.
  • xrRemotingValidateServerCertificateCallbackMSFT, valida la cadena de certificados.xrRemotingValidateServerCertificateCallbackMSFT, validates the certificate chain.
  • xrRemotingValidateAuthenticationTokenCallbackMSFT, valida el token de autenticación del cliente.xrRemotingValidateAuthenticationTokenCallbackMSFT, validates the client authentication token.
  • xrRemotingRequestServerCertificateCallbackMSFT, proporcione la aplicación de servidor con el certificado que se va a usar.xrRemotingRequestServerCertificateCallbackMSFT, supply the server application with the certificate to use.

Estas devoluciones de llamada se pueden proporcionar al tiempo de ejecución de OpenXR remoto a través xrRemotingSetSecureConnectionClientCallbacksMSFT de y xrRemotingSetSecureConnectionServerCallbacksMSFT .These callbacks can be provided to the remoting OpenXR runtime via xrRemotingSetSecureConnectionClientCallbacksMSFT and xrRemotingSetSecureConnectionServerCallbacksMSFT. Además, la conexión segura debe habilitarse mediante el parámetro secureConnection en la XrRemotingConnectInfoMSFT estructura o la XrRemotingListenInfoMSFT estructura, dependiendo de si usa 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.

Esta API es similar a la API basada en IDL que se describe en implementación de la seguridad de la comunicación remota holográfica.This API is similar to the IDL-based API described in Implementing holographic remoting security. Sin embargo, en lugar de implementar interfaces, se supone que proporciona implementaciones de devolución de llamada.However, instead of implementing interfaces, you're supposed to provide callback implementations. Puede encontrar un ejemplo detallado en la aplicación de ejemplo OpenXR.You can find a detailed example in the OpenXR sample app.

Consulte tambiénSee Also