Compartir a través de


Conexión segura con la comunicación remota holográfica y la API de OpenXR

Al usar 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.

Importante

Para obtener información sobre la API de extensión De OpenXR de Holographic Remoting, consulte la especificación que se puede encontrar en el repositorio de github de ejemplos de Holographic Remoting.

Recuerde que debe implementar aplicaciones remotas y de reproductor personalizadas si desea habilitar la seguridad de conexión. Ambas aplicaciones personalizadas necesitan:

  • Un proveedor de certificados y un validador de autenticación si la aplicación se ejecuta como servidor.
  • Un proveedor de autenticación y un validador de certificados si la aplicación se ejecuta como cliente.

La API de OpenXR es similar a la API de Windows Mixed Reality que se describe aquí. Sin embargo, en lugar de implementar interfaces, los elementos clave para la conexión segura mediante la XR_MSFT_holographic_remoting extensión OpenXR son las siguientes devoluciones de llamada:

  • xrRemotingRequestAuthenticationTokenCallbackMSFT, genera o recupera el token de autenticación que se va a enviar.
  • xrRemotingValidateServerCertificateCallbackMSFT, valida la cadena de certificados.
  • xrRemotingValidateAuthenticationTokenCallbackMSFT, valida el token de autenticación de cliente.
  • xrRemotingRequestServerCertificateCallbackMSFT, proporcione la aplicación de servidor con el certificado que se va a usar.

Nota

Con La comunicación remota holográfica es posible que el reproductor o el remoto sea el servidor en función de sus necesidades (para obtener más información, consulte Terminología de comunicación remota holográfica). Si la aplicación de reproductor personalizada remota o personalizada se puede ejecutar como cliente y servidor, la aplicación tiene que proporcionar las cuatro devoluciones de llamada.

Las devoluciones de llamada se pueden proporcionar al entorno de ejecución de OpenXR remoto a través xrRemotingSetSecureConnectionClientCallbacksMSFT de y xrRemotingSetSecureConnectionServerCallbacksMSFT. Para ello, puede crear funciones estáticas para las devoluciones de llamada:

class SecureConnectionCallbacks {
public:
    ...

    // Static callbacks
    static XrResult XRAPI_CALL
    RequestAuthenticationTokenStaticCallback(XrRemotingAuthenticationTokenRequestMSFT* authenticationTokenRequest) {
        if (!authenticationTokenRequest->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(authenticationTokenRequest->context)
            ->RequestAuthenticationToken(authenticationTokenRequest);
    }

    static XrResult XRAPI_CALL
    ValidateServerCertificateStaticCallback(XrRemotingServerCertificateValidationMSFT* serverCertificateValidation) {
        if (!serverCertificateValidation->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(serverCertificateValidation->context)
            ->ValidateServerCertificate(serverCertificateValidation);
    }

    static XrResult XRAPI_CALL
    ValidateAuthenticationTokenStaticCallback(XrRemotingAuthenticationTokenValidationMSFT* authenticationTokenValidation) {
        if (!authenticationTokenValidation->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(authenticationTokenValidation->context)
            ->ValidateAuthenticationToken(authenticationTokenValidation);
    }

    static XrResult XRAPI_CALL
    RequestServerCertificateStaticCallback(XrRemotingServerCertificateRequestMSFT* serverCertificateRequest) {
        if (!serverCertificateRequest->context) {
            return XR_ERROR_RUNTIME_FAILURE;
        }
        return reinterpret_cast<SecureConnectionCallbacks*>(serverCertificateRequest->context)
            ->RequestServerCertificate(serverCertificateRequest);
    }
}

Las funciones de devolución de llamada estáticas tienen un aspecto similar y en el ejemplo anterior simplemente llaman a una función en el objeto de contexto, que se establece en xrRemotingSetSecureConnectionClientCallbacksMSFT o xrRemotingSetSecureConnectionServerCallbacksMSFT. La implementación real de las devoluciones de llamada se realiza dentro de las funciones miembro del objeto de contexto:

class SecureConnectionCallbacks {   
    ...

private:
    // The client has to provide a token and has to validate the certificate.
    XrResult RequestAuthenticationToken(XrRemotingAuthenticationTokenRequestMSFT* authenticationTokenRequest) {
        // To provide a token fill out the authenticationTokenRequest with your token.
    }
    XrResult ValidateServerCertificate(XrRemotingServerCertificateValidationMSFT* serverCertificateValidation) {
        // Validate the certificate.
    }

    // The server has to provide a certificate and hast to validate the token.
    XrResult ValidateAuthenticationToken(XrRemotingAuthenticationTokenValidationMSFT* authenticationTokenValidation) {
        // Validate the token.
    }
    XrResult RequestServerCertificate(XrRemotingServerCertificateRequestMSFT* serverCertificateRequest) {
        // To provide a certificate fill out the serverCertificateRequest with your certificate.
    }
}

Ahora puede proporcionar las devoluciones de llamada a xrRemotingSetSecureConnectionClientCallbacksMSFT y xrRemotingSetSecureConnectionServerCallbacksMSFT. Además, la conexión segura debe habilitarse a través del parámetro secureConnection en la XrRemotingConnectInfoMSFT estructura o la XrRemotingListenInfoMSFT estructura en función de si usa xrRemotingConnectMSFT o xrRemotingListenMSFT:

...

SecureConnectionCallbacks callbackObject;

...

if (client) 
{
    XrRemotingSecureConnectionClientCallbacksMSFT clientCallbacks{static_cast<XrStructureType>(XR_TYPE_REMOTING_SECURE_CONNECTION_CLIENT_CALLBACKS_MSFT);
    clientCallbacks.context = &callbackObject;
    clientCallbacks.requestAuthenticationTokenCallback = SecureConnectionCallbacks::RequestAuthenticationTokenStaticCallback;
    clientCallbacks.validateServerCertificateCallback = SecureConnectionCallbacks::ValidateServerCertificateStaticCallback;
    clientCallbacks.performSystemValidation = true;
    CHECK_XRCMD(m_extensions.xrRemotingSetSecureConnectionClientCallbacksMSFT(m_instance.Get(), m_systemId, &clientCallbacks));
    
    ...

    connectInfo.secureConnection = true; // Enable secure connection!
    CHECK_XRCMD(m_extensions.xrRemotingConnectMSFT(m_instance.Get(), m_systemId, &connectInfo));
}

if (server) 
{
    XrRemotingSecureConnectionServerCallbacksMSFT serverCallbacks{static_cast<XrStructureType>(XR_TYPE_REMOTING_SECURE_CONNECTION_SERVER_CALLBACKS_MSFT);
    serverCallbacks.context = &callbackObject;
    serverCallbacks.requestServerCertificateCallback = SecureConnectionCallbacks::RequestServerCertificateStaticCallback;
    serverCallbacks.validateAuthenticationTokenCallback = SecureConnectionCallbacks::ValidateAuthenticationTokenStaticCallback;
    serverCallbacks.authenticationRealm = /*YourAuthenticationRealm*/;
    CHECK_XRCMD(m_extensions.xrRemotingSetSecureConnectionServerCallbacksMSFT(m_instance.Get(), m_systemId, &serverCallbacks));

    ...

    listenInfo.secureConnection = true; // Enable secure connection!
    CHECK_XRCMD(m_extensions.xrRemotingListenMSFT(m_instance.Get(), m_systemId, &listenInfo));
}

Nota

Puede encontrar un ejemplo detallado en la aplicación de ejemplo OpenXR.

Consulte también