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 パラメーターを使用xrRemotingConnectMSFT
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));
}
Note
詳細な例については、 OpenXR サンプル アプリを参照してください。