Holographic Remoting 및 OpenXR API를 사용하여 보안 연결

OpenXR API를 사용하는 경우 모든 보안 연결 관련 API를 OpenXR 확장의 XR_MSFT_holographic_remoting 일부로 사용할 수 있습니다.

중요

홀로그램 원격 OpenXR 확장 API에 대해 알아보려면 Holographic Remoting 샘플 github 리포지토리에서 찾을 수 있는 사양을 검사.

연결 보안을 사용하도록 설정하려면 사용자 지정 원격 및 플레이어 앱을 구현해야 합니다. 두 사용자 지정 앱 모두 다음이 필요합니다.

  • 앱이 서버로 실행되는 경우 인증서 공급자 및 인증 유효성 검사기입니다.
  • 앱이 클라이언트로 실행되는 경우 인증 공급자 및 인증서 유효성 검사기입니다.

OpenXR API는 여기에 설명된 Windows Mixed Reality API와 유사합니다. 그러나 인터페이스를 구현하는 대신 OpenXR 확장을 사용하는 보안 연결의 XR_MSFT_holographic_remoting 핵심 요소는 다음과 같은 콜백입니다.

  • xrRemotingRequestAuthenticationTokenCallbackMSFT은 전송할 인증 토큰을 생성하거나 검색합니다.
  • xrRemotingValidateServerCertificateCallbackMSFT은 인증서 체인의 유효성을 검사합니다.
  • xrRemotingValidateAuthenticationTokenCallbackMSFT는 클라이언트 인증 토큰의 유효성을 검사합니다.
  • xrRemotingRequestServerCertificateCallbackMSFT서버 애플리케이션에 사용할 인증서를 입력합니다.

참고

홀로그램 원격을 사용하면 플레이어 또는 원격이 필요에 따라 서버일 수 있습니다(자세한 내용은 홀로그램 원격 용어를 참조하세요). 사용자 지정 원격 또는 사용자 지정 플레이어 애플리케이션을 클라이언트 및 서버로 실행할 수 있는 경우 앱은 네 가지 콜백을 모두 제공해야 합니다.

콜백은 및 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 제공할 수 있습니다. 또한 보안 연결은 사용 여부에 xrRemotingListenMSFTxrRemotingConnectMSFT 따라 구조체 또는 XrRemotingListenInfoMSFT 구조체의 XrRemotingConnectInfoMSFT secureConnection 매개 변수를 통해 사용하도록 설정해야 합니다.

...

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 샘플 앱에서 자세한 예제를 찾을 수 있습니다.

참고 항목