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:
-
xrRemotingRequestAuthenticationTokenCallbackMSFT
generiert 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 xrRemotingSetSecureConnectionServerCallbacksMSFT
bereitgestellt 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 xrRemotingSetSecureConnectionServerCallbacksMSFT
festgelegt 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 xrRemotingSetSecureConnectionServerCallbacksMSFT
bereitstellen. 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 xrRemotingListenMSFT
verwendenxrRemotingConnectMSFT
:
...
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.