次の方法で共有


Holographic Remoting と OpenXR API を使用したセキュリティで保護された接続

OpenXR API を使用する場合、セキュリティで保護された接続関連 API はすべて OpenXR 拡張機能のXR_MSFT_holographic_remoting一部として使用できます。

重要

Holographic Remoting OpenXR 拡張機能 API の詳細については、Holographic Remoting のサンプル GitHub リポジトリに関するページにある仕様をご確認ください。

接続セキュリティを有効にする場合は、カスタム リモート アプリとプレーヤー アプリを実装する必要があります。 カスタム アプリの両方に次のものが必要です。

  • アプリがサーバーとして実行されている場合は、証明書プロバイダーと認証検証コントロール。
  • アプリがクライアントとして実行されている場合は、認証プロバイダーと証明書検証コントロール。

OpenXR API は、ここで説明するWindows Mixed Reality API に似ています。 ただし、インターフェイスを実装する代わりに、OpenXR 拡張機能を使用したセキュリティで保護された接続の XR_MSFT_holographic_remoting 重要な要素は、次のコールバックです。

  • xrRemotingRequestAuthenticationTokenCallbackMSFTは、送信する認証トークンを生成または取得します。
  • xrRemotingValidateServerCertificateCallbackMSFTは、証明書チェーンを検証します。
  • xrRemotingValidateAuthenticationTokenCallbackMSFTは、クライアント認証トークンを検証します。
  • xrRemotingRequestServerCertificateCallbackMSFTを使用する証明書をサーバー アプリケーションに指定します。

Note

Holographic Remoting を使用すると、プレーヤーまたはリモートのいずれかがニーズに応じてサーバーである可能性があります (詳細については、「 Holographic Remoting の用語」を参照してください)。 カスタム リモートまたはカスタム プレーヤー アプリケーションをクライアントおよびサーバーとして実行できる場合、アプリは 4 つのコールバックすべてを提供する必要があります。

コールバックは、 と xrRemotingSetSecureConnectionServerCallbacksMSFTを介してリモート処理 OpenXR ランタイムにxrRemotingSetSecureConnectionClientCallbacksMSFT提供できます。 これを行うには、コールバックの静的関数を作成できます。

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

静的コールバック関数はすべて似ていますが、上記の例では、 または xrRemotingSetSecureConnectionServerCallbacksMSFTに設定されているコンテキスト オブジェクトでxrRemotingSetSecureConnectionClientCallbacksMSFT関数を呼び出すだけです。 コールバックの実際の実装は、コンテキスト オブジェクトのメンバー関数内で行われます。

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

これで、 と xrRemotingSetSecureConnectionServerCallbacksMSFTへのコールバックをxrRemotingSetSecureConnectionClientCallbacksMSFT指定できるようになりました。 さらに、 または を使用しているかどうかに応じて、構造体またはXrRemotingListenInfoMSFT構造体の XrRemotingConnectInfoMSFT secureConnection パラメーターを使用xrRemotingConnectMSFTxrRemotingListenMSFTして、セキュリティで保護された接続を有効にする必要があります。

...

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

Note

詳細な例については、 OpenXR サンプル アプリを参照してください。

参照