使用全像攝影遠端和 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
,請提供伺服器應用程式與要使用的憑證。
注意
使用全像攝影遠端處理時,視您的需求而定,播放機或遠端可能是伺服器 (如需詳細資訊,請參閱 全像攝影遠端術語) 。 如果您的自訂遠端或自訂播放機應用程式可以做為用戶端和伺服器執行,應用程式必須提供這四個回呼。
您可以透過 xrRemotingSetSecureConnectionClientCallbacksMSFT
和 xrRemotingSetSecureConnectionServerCallbacksMSFT
將回呼提供給遠端 OpenXR 執行時間。
若要這樣做,您可以為回呼建立靜態函式:
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
回呼。 此外,您必須透過 結構上的 XrRemotingConnectInfoMSFT
secureConnection 參數或 結構啟用安全連線,視您使用的是 xrRemotingConnectMSFT
或 XrRemotingListenInfoMSFT
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));
}
注意
您可以在 OpenXR 範例應用程式中找到詳細的範例。