Connexion sécurisée avec la communication à distance holographique et l’API OpenXR
Lors de l’utilisation de l’API OpenXR, toute l’API liée à la connexion sécurisée est disponible dans le cadre de l’extension XR_MSFT_holographic_remoting
OpenXR.
Important
Pour en savoir plus sur l’API d’extension Holographic Remoting OpenXR, case activée la spécification qui se trouve dans le référentiel github d’exemples de communication à distance holographiques.
N’oubliez pas que vous devez implémenter des applications distantes et de lecteur personnalisées si vous souhaitez activer la sécurité de connexion. Les deux applications personnalisées ont besoin des éléments suivants :
- Un fournisseur de certificat et un validateur d’authentification si l’application s’exécute en tant que serveur.
- Un fournisseur d’authentification et un validateur de certificat si l’application s’exécute en tant que client.
L’API OpenXR est similaire à l’API Windows Mixed Reality décrite ici.
Toutefois, au lieu d’implémenter des interfaces, les éléments clés pour une connexion sécurisée à l’aide de l’extension XR_MSFT_holographic_remoting
OpenXR sont les rappels suivants :
xrRemotingRequestAuthenticationTokenCallbackMSFT
, génère ou récupère le jeton d’authentification à envoyer.xrRemotingValidateServerCertificateCallbackMSFT
, valide la chaîne de certificats.xrRemotingValidateAuthenticationTokenCallbackMSFT
, valide le jeton d’authentification client.xrRemotingRequestServerCertificateCallbackMSFT
, fournissez à l’application serveur le certificat à utiliser.
Notes
Avec la communication à distance holographique, il est possible que le lecteur ou le serveur distant soit le serveur en fonction de vos besoins (pour plus d’informations, consultez Terminologie de communication à distance holographique). Si votre application de lecteur distant ou personnalisé peut s’exécuter en tant que client et serveur, l’application doit fournir les quatre rappels.
Les rappels peuvent être fournis au runtime OpenXR de communication à distance via xrRemotingSetSecureConnectionClientCallbacksMSFT
et xrRemotingSetSecureConnectionServerCallbacksMSFT
.
Pour ce faire, vous pouvez créer des fonctions statiques pour les rappels :
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);
}
}
Les fonctions de rappel statiques se ressemblent toutes et, dans l’exemple ci-dessus, elles appellent simplement une fonction sur l’objet de contexte, qui est défini dans xrRemotingSetSecureConnectionClientCallbacksMSFT
ou xrRemotingSetSecureConnectionServerCallbacksMSFT
. L’implémentation réelle des rappels est ensuite effectuée à l’intérieur des fonctions membres de l’objet de contexte :
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.
}
}
Vous pouvez maintenant fournir les rappels à xrRemotingSetSecureConnectionClientCallbacksMSFT
et xrRemotingSetSecureConnectionServerCallbacksMSFT
. En outre, la connexion sécurisée doit être activée via le paramètre secureConnection sur la XrRemotingConnectInfoMSFT
structure ou la XrRemotingListenInfoMSFT
structure selon que vous utilisez xrRemotingConnectMSFT
ou 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));
}
Notes
Vous trouverez un exemple détaillé dans l’exemple d’application OpenXR.