Безопасное подключение с помощью голографического удаленного взаимодействия и API Windows Mixed Reality
Помните, что для включения безопасности подключения необходимо реализовать пользовательские удаленные приложения и приложения проигрывателя. Предоставленные примеры можно использовать в качестве отправных точек для собственных приложений.
Чтобы включить безопасность, вызовите ListenSecure()
вместо Listen()
и ConnectSecure()
вместо Connect()
, чтобы установить подключение удаленного взаимодействия.
Эти вызовы требуют предоставления реализаций определенных интерфейсов для предоставления и проверки сведений, связанных с безопасностью:
- Сервер должен реализовать поставщик сертификатов и проверяющий элемент управления проверкой подлинности.
- Клиенту необходимо реализовать поставщик проверки подлинности и проверяющий элемент управления сертификатами.
Все интерфейсы имеют функцию, запрашивающую действие, которая получает объект обратного вызова в качестве параметра. С помощью этого объекта можно легко реализовать асинхронную обработку запроса. Сохраните ссылку на этот объект и вызовите функцию завершения после завершения асинхронного действия. Функция завершения может вызываться из любого потока.
Совет
Реализацию интерфейсов WinRT можно легко реализовать с помощью C++/WinRT. Это подробно описано в разделе Создание API с помощью C++/WinRT .
Важно!
В build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl
пакете NuGet содержится подробная документация по API, связанному с безопасными подключениями.
Реализация поставщика сертификатов
Поставщики сертификатов предоставляют серверное приложение с сертификатом для использования. Реализация состоит из двух частей:
Объект сертификата, реализующий
ICertificate
интерфейс :GetCertificatePfx()
должен возвращать двоичное содержимоеPKCS#12
хранилища сертификатов. Файл.pfx
содержитPKCS#12
данные, поэтому его содержимое можно использовать непосредственно здесь.GetSubjectName()
должен возвращать понятное имя, определяющее используемый сертификат. Если сертификату не назначено понятное имя, эта функция должна возвращать имя субъекта сертификата.GetPfxPassword()
должен вернуть пароль, необходимый для открытия хранилища сертификатов (или пустую строку, если пароль не требуется).
Поставщик сертификатов, реализующий
ICertificateProvider
интерфейс :GetCertificate()
должен создать объект сертификата и вернуть его, вызвавCertificateReceived()
для объекта обратного вызова.
Реализация проверяющего элемента проверки подлинности
Проверяющие элементы проверки подлинности получают маркер проверки подлинности, отправленный клиентом, и отвечают обратно с результатом проверки.
Реализуйте IAuthenticationReceiver
интерфейс следующим образом:
GetRealm()
должен возвращать имя области проверки подлинности (область HTTP, используемая во время подтверждения подключения удаленного взаимодействия).ValidateToken()
должен проверить маркер проверки подлинности клиента и вызватьValidationCompleted()
объект обратного вызова с результатом проверки.
Реализация поставщика проверки подлинности
Поставщики проверки подлинности создают или извлекают маркеры проверки подлинности для отправки на сервер.
Реализуйте IAuthenticationProvider
интерфейс следующим образом:
GetToken()
должен создать или получить маркер проверки подлинности для отправки. Когда маркер будет готов, вызовитеTokenReceived()
метод для объекта обратного вызова.
Реализация проверяющего элемента управления сертификатами
Проверяющие элементы сертификатов получают цепочку сертификатов, отправленную сервером, и определяют, может ли сервер быть доверенным.
Для проверки сертификатов можно использовать логику проверки базовой системы. Эта проверка системы может либо поддерживать собственную логику проверки, либо полностью заменить ее. Если вы не передадите собственный проверяющий элемент управления сертификатов при запросе безопасного подключения, проверка системы будет использоваться автоматически.
В Windows проверка системы будет проверка для следующих компонентов:
- Целостность цепочки сертификатов: сертификаты образуют согласованную цепочку, которая заканчивается на доверенном корневом сертификате.
- Срок действия сертификата: сертификат сервера находится в пределах срока действия и выдается для проверки подлинности сервера.
- Отзыв: сертификат не был отозван.
- Совпадение имен. Имя узла сервера соответствует одному из имен узлов, для которых был выдан сертификат.
Реализуйте ICertificateValidator
интерфейс следующим образом:
PerformSystemValidation()
значение должно возвращать значениеtrue
, если должна быть выполнена проверка системы, как описано выше. В этом случае результат проверки системы передается в качестве входных данныхValidateCertificate()
в метод .ValidateCertificate()
должен проверить цепочку сертификатов, а затем вызватьCertificateValidated()
для переданного обратного вызова с окончательным результатом проверки. Этот метод принимает цепочку сертификатов, имя сервера, с которым устанавливается соединение, и указывает, следует ли принудительно проверка отзыва. Если цепочка сертификатов содержит несколько сертификатов, первым из них является сертификат субъекта.
Примечание
Если для вашего варианта использования требуется другая форма проверки (см. вариант использования сертификата No 1 выше), полностью обойдите проверку системы. Вместо этого используйте любой API или библиотеку, которые могут обрабатывать сертификаты X.509 в кодировке DER, для декодирования цепочки сертификатов и выполнения проверок, необходимых для вашего варианта использования.