Безопасное подключение с помощью голографического удаленного взаимодействия и API OpenXR
При использовании API OpenXR все api, связанные с безопасным подключением, доступны в составе XR_MSFT_holographic_remoting
расширения OpenXR.
Важно!
Чтобы узнать об API расширения OpenXR для голографического удаленного взаимодействия, проверка спецификацию, которую можно найти в репозитории примеров голографического удаленного взаимодействия на сайте GitHub.
Помните, что для включения безопасности подключения необходимо реализовать пользовательские удаленные приложения и приложения проигрывателя. Для обоих пользовательских приложений требуется:
- Поставщик сертификатов и проверяющий элемент управления проверкой подлинности, если приложение выполняется как сервер.
- Поставщик проверки подлинности и проверяющий элемент управления сертификатами, если приложение выполняется от имени клиента.
API OpenXR похож на API Windows Mixed Reality, описанный здесь.
Однако вместо реализации интерфейсов ключевыми элементами для безопасного XR_MSFT_holographic_remoting
подключения с помощью расширения OpenXR являются следующие обратные вызовы:
xrRemotingRequestAuthenticationTokenCallbackMSFT
, создает или извлекает маркер проверки подлинности для отправки.xrRemotingValidateServerCertificateCallbackMSFT
проверяет цепочку сертификатов.xrRemotingValidateAuthenticationTokenCallbackMSFT
, проверяет маркер проверки подлинности клиента.xrRemotingRequestServerCertificateCallbackMSFT
, предоставьте серверное приложение с сертификатом для использования.
Примечание
При использовании голографического удаленного взаимодействия в зависимости от ваших потребностей возможно, что сервером является проигрыватель или удаленный сервер (дополнительные сведения см. в разделе Терминология голографического удаленного взаимодействия). Если ваше пользовательское удаленное приложение или приложение проигрывателя может работать как клиент и сервер, приложение должен предоставить все четыре обратных вызова.
Обратные вызовы можно предоставить среде выполнения Удаленного взаимодействия OpenXR с помощью xrRemotingSetSecureConnectionClientCallbacksMSFT
и xrRemotingSetSecureConnectionServerCallbacksMSFT
.
Для этого можно создать статические функции для обратных вызовов:
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);
}
}
Статические функции обратного вызова выглядят примерно так же, и в приведенном выше примере они просто вызывают функцию для объекта контекста, который задается в xrRemotingSetSecureConnectionClientCallbacksMSFT
или xrRemotingSetSecureConnectionServerCallbacksMSFT
. Затем фактическая реализация обратных вызовов выполняется внутри функций-членов объекта контекста:
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.
}
}
Теперь можно указать обратные вызовы для xrRemotingSetSecureConnectionClientCallbacksMSFT
и xrRemotingSetSecureConnectionServerCallbacksMSFT
. Кроме того, необходимо включить безопасное подключение с помощью параметра secureConnection в XrRemotingConnectInfoMSFT
структуре или структуре в XrRemotingListenInfoMSFT
зависимости от того, используете 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));
}
Примечание
Подробный пример можно найти в примере приложения OpenXR.