Sichere Verbindung mit Holographic Remoting und der OpenXR-API

Bei Verwendung der OpenXR-API ist die gesamte api für sichere Verbindungen als Teil der XR_MSFT_holographic_remoting OpenXR-Erweiterung verfügbar.

Wichtig

Weitere Informationen zur OpenXR-Erweiterungs-API für Holographic Remoting finden Sie in der Spezifikation , die im GitHub-Repository holographic Remoting samples (Holographic Remoting-Beispiele) zu finden ist.

Denken Sie daran, dass Sie benutzerdefinierte Remote- und Player-Apps implementieren müssen, wenn Sie die Verbindungssicherheit aktivieren möchten. Beide benutzerdefinierten Apps benötigen:

  • Ein Zertifikatanbieter und eine Authentifizierungsüberprüfung, wenn die App als Server ausgeführt wird.
  • Ein Authentifizierungsanbieter und eine Zertifikatüberprüfung, wenn die App als Client ausgeführt wird.

Die OpenXR-API ähnelt der hier beschriebenen Windows Mixed Reality-API. Anstatt Jedoch Schnittstellen zu implementieren, sind die wichtigsten Elemente für die sichere Verbindung mit der XR_MSFT_holographic_remoting OpenXR-Erweiterung die folgenden Rückrufe:

  • xrRemotingRequestAuthenticationTokenCallbackMSFTgeneriert oder ruft das zu sendende Authentifizierungstoken ab.
  • xrRemotingValidateServerCertificateCallbackMSFTüberprüft die Zertifikatkette.
  • xrRemotingValidateAuthenticationTokenCallbackMSFTüberprüft das Clientauthentifizierungstoken.
  • xrRemotingRequestServerCertificateCallbackMSFT, geben Sie der Serveranwendung das zu verwendende Zertifikat an.

Hinweis

Bei Holographic Remoting ist es möglich, dass entweder der Player oder der Remoteserver je nach Ihren Anforderungen der Server ist (weitere Informationen finden Sie unter Holographic Remoting Terminologie). Wenn Ihre benutzerdefinierte Remote- oder benutzerdefinierte Playeranwendung als Client und Server ausgeführt werden kann, muss die App alle vier Rückrufe bereitstellen.

Die Rückrufe können für die OpenXR-Remoting-Runtime über xrRemotingSetSecureConnectionClientCallbacksMSFT und xrRemotingSetSecureConnectionServerCallbacksMSFTbereitgestellt werden. Dazu können Sie statische Funktionen für die Rückrufe erstellen:

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);
    }
}

Die statischen Rückruffunktionen sehen alle ähnlich aus und rufen im obigen Beispiel nur eine Funktion für das Kontextobjekt auf, das in xrRemotingSetSecureConnectionClientCallbacksMSFT oder xrRemotingSetSecureConnectionServerCallbacksMSFTfestgelegt ist. Die tatsächliche Implementierung der Rückrufe erfolgt dann innerhalb der Memberfunktionen des Kontextobjekts:

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.
    }
}

Jetzt können Sie die Rückrufe für xrRemotingSetSecureConnectionClientCallbacksMSFT und xrRemotingSetSecureConnectionServerCallbacksMSFTbereitstellen. Darüber hinaus muss die sichere Verbindung über den secureConnection-Parameter für die XrRemotingConnectInfoMSFT -Struktur oder die XrRemotingListenInfoMSFT -Struktur aktiviert werden, je nachdem, ob Sie oder xrRemotingListenMSFTverwendenxrRemotingConnectMSFT:

...

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));
}

Hinweis

Ein ausführliches Beispiel finden Sie in der OpenXR-Beispiel-App.

Weitere Informationen