使用全息远程处理和 Windows Mixed Reality API 建立安全连接

请记住,如果要启用连接安全性,则需要实现自定义远程和播放器应用。 你可以使用提供的示例作为你自己的应用的起点。

若要启用安全性,请调用 ListenSecure() 而不是 Listen(),并且调用 ConnectSecure() 而不是 Connect() 来建立远程处理连接。

这些调用需要你提供某些接口的实现,以便提供和验证与安全相关的信息:

  • 服务器需要实现证书提供程序和身份验证验证程序
  • 客户端需要实现身份验证提供程序和证书验证程序。

所有接口都有一个请求你执行操作的函数,该函数接收回调对象作为参数。 使用此对象,可以轻松实现请求的异步处理。 保留对此对象的引用,并在异步操作完成时调用完成函数。 可以从任何线程调用完成函数。

提示

可使用 C++/WinRT 轻松实现 WinRT 接口。 使用 C++/WinRT 创作 API 一章将对此进行了详细介绍。

重要

NuGet 包内的 build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl 包含有关与安全连接相关的 API 的详细文档。

实现证书提供程序

证书提供程序为服务器应用程序提供要使用的证书。 实现由两部分组成:

  1. 用于实现 ICertificate 接口的证书对象:

    • GetCertificatePfx() 应返回 PKCS#12 证书存储的二进制内容。 .pfx 文件包含 PKCS#12 数据,因此可直接在此处使用其内容。
    • GetSubjectName() 应返回标识要使用的证书的易记名称。 如果没有为证书指定易记名称,则此函数应返回证书的使用者名称。
    • GetPfxPassword() 应返回打开证书存储所需的密码(如果不需要密码,则返回空字符串)。
  2. 用于实现 ICertificateProvider 接口的证书提供程序:

    • GetCertificate() 应构造一个证书对象并通过在回调对象上调用 CertificateReceived() 来返回该对象。

实现身份验证验证程序

身份验证验证程序接收客户端发送的身份验证令牌,并使用验证结果回复。

实现 IAuthenticationReceiver 接口,如下所示:

  • GetRealm() 应返回身份验证领域的名称(远程处理连接握手期间使用的 HTTP 领域)。
  • ValidateToken() 应验证客户端身份验证令牌并使用验证结果在回调对象上调用 ValidationCompleted()

实现身份验证提供程序

身份验证提供程序生成或检索要发送到服务器的身份验证令牌。

实现 IAuthenticationProvider 接口,如下所示:

  • GetToken() 应生成或检索要发送的身份验证令牌。 令牌准备就绪后,对回调对象调用 TokenReceived() 方法。

实现证书验证程序

证书验证程序接收服务器发送的证书链,并确定服务器是否可信任。

若要验证证书,可以使用基础系统的验证逻辑。 此系统验证可以支持你自己的验证逻辑,也可以全部替换。 如果在请求安全连接时未传递你自己的证书验证程序,系统将自动使用系统验证。

在 Windows 上,系统验证将检查以下内容:

  • 证书链的完整性:证书构成以受信任的根证书结尾的一致链
  • 证书有效期:服务器的证书在其有效期内,并颁发用于服务器身份验证
  • 吊销:证书未被吊销
  • 名称匹配:服务器的主机名与颁发证书的主机名之一匹配

实现 ICertificateValidator 接口,如下所示:

  • 如果应执行上述系统验证,则 PerformSystemValidation() 应返回 true。 在这种情况下,系统验证结果将作为输入传递给 ValidateCertificate() 方法。
  • ValidateCertificate() 应验证证书链,然后使用最终验证结果对传递的回调调用 CertificateValidated()。 此方法接受证书链、与之建立连接的服务器的名称,以及是否应强制执行吊销检查。 如果证书链包含多个证书,则第一个证书是使用者证书。

注意

如果用例需要不同形式的验证(请参阅上面的证书用例 #1),请完全绕过系统验证。 相反,使用任何可以处理 DER 编码的 X.509 证书的 API 或库来解码证书链,并执行用例所需的检查。

另请参阅