使用全息远程处理和 Windows Mixed Reality API 建立安全连接
请记住,如果要启用连接安全性,则需要实现自定义远程和播放器应用。 你可以使用提供的示例作为你自己的应用的起点。
若要启用安全性,请调用 ListenSecure()
而不是 Listen()
,并且调用 ConnectSecure()
而不是 Connect()
来建立远程处理连接。
这些调用需要你提供某些接口的实现,以便提供和验证与安全相关的信息:
- 服务器需要实现证书提供程序和身份验证验证程序
- 客户端需要实现身份验证提供程序和证书验证程序。
所有接口都有一个请求你执行操作的函数,该函数接收回调对象作为参数。 使用此对象,可以轻松实现请求的异步处理。 保留对此对象的引用,并在异步操作完成时调用完成函数。 可以从任何线程调用完成函数。
提示
可使用 C++/WinRT 轻松实现 WinRT 接口。 使用 C++/WinRT 创作 API 一章将对此进行了详细介绍。
重要
NuGet 包内的 build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl
包含有关与安全连接相关的 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()
。 此方法接受证书链、与之建立连接的服务器的名称,以及是否应强制执行吊销检查。 如果证书链包含多个证书,则第一个证书是使用者证书。
注意
如果用例需要不同形式的验证(请参阅上面的证书用例 #1),请完全绕过系统验证。 相反,使用任何可以处理 DER 编码的 X.509 证书的 API 或库来解码证书链,并执行用例所需的检查。