Conexão segura com a Comunicação Remota Holográfica e a API de Windows Mixed Reality
Lembre-se de que você precisa implementar aplicativos remotos e player personalizados se quiser habilitar a segurança da conexão. Você pode usar os exemplos fornecidos como pontos de partida para seus próprios aplicativos.
Para habilitar a segurança, chame ListenSecure()
em vez de Listen()
e ConnectSecure()
, em vez de Connect()
, para estabelecer a conexão remota.
Essas chamadas exigem que você forneça implementações de determinadas interfaces para fornecer e validar informações relacionadas à segurança:
- O servidor precisa implementar um provedor de certificados e um validador de autenticação
- O cliente precisa implementar um provedor de autenticação e um validador de certificado.
Todas as interfaces têm uma função solicitando que você execute uma ação, que recebe um objeto de retorno de chamada como parâmetro. Usando esse objeto, você pode implementar facilmente o tratamento assíncrono da solicitação. Mantenha uma referência a esse objeto e chame a função de conclusão quando a ação assíncrona for concluída. A função de conclusão pode ser chamada de qualquer thread.
Dica
A implementação de interfaces WinRT pode ser feita facilmente usando C++/WinRT. O capítulo Criar APIs com C++/WinRT descreve isso em detalhes.
Importante
O build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl
dentro do pacote NuGet contém a documentação detalhada da API relacionada a conexões seguras.
Implementando um provedor de certificados
Os provedores de certificado fornecem ao aplicativo de servidor o certificado a ser usado. A implementação consiste em duas partes:
Um objeto de certificado, que implementa a
ICertificate
interface :GetCertificatePfx()
deve retornar o conteúdo binário de umPKCS#12
repositório de certificados. Um.pfx
arquivo contémPKCS#12
dados, para que seu conteúdo possa ser usado diretamente aqui.GetSubjectName()
deve retornar o nome amigável que identifica o certificado a ser usado. Se nenhum nome amigável for atribuído ao certificado, essa função deverá retornar o nome da entidade do certificado.GetPfxPassword()
deve retornar a senha necessária para abrir o repositório de certificados (ou uma cadeia de caracteres vazia se nenhuma senha for necessária).
Um provedor de certificados implementando a
ICertificateProvider
interface:GetCertificate()
deve construir um objeto de certificado e devolvê-lo chamandoCertificateReceived()
no objeto de retorno de chamada.
Implementando um validador de autenticação
Os validadores de autenticação recebem o token de autenticação enviado pelo cliente e respondem com o resultado da validação.
Implemente a interface da IAuthenticationReceiver
seguinte maneira:
GetRealm()
deve retornar o nome do realm de autenticação (um realm HTTP usado durante o handshake de conexão remota).ValidateToken()
deve validar o token de autenticação do cliente e chamarValidationCompleted()
no objeto de retorno de chamada com o resultado da validação.
Implementando um provedor de autenticação
Os provedores de autenticação geram ou recuperam o token de autenticação a ser enviado ao servidor.
Implemente a interface da IAuthenticationProvider
seguinte maneira:
GetToken()
deve gerar ou recuperar o token de autenticação a ser enviado. Quando o token estiver pronto, chame oTokenReceived()
método no objeto de retorno de chamada.
Implementando um validador de certificado
Os validadores de certificado recebem a cadeia de certificados enviada pelo servidor e determinam se o servidor pode ser confiável.
Para validar certificados, você pode usar a lógica de validação do sistema subjacente. Essa validação do sistema pode dar suporte à sua própria lógica de validação ou substituí-la completamente. Se você não passar seu próprio validador de certificado ao solicitar uma conexão segura, a validação do sistema será usada automaticamente.
No Windows, a validação do sistema marcar para:
- Integridade da cadeia de certificados: os certificados formam uma cadeia consistente que termina em um certificado raiz confiável
- Validade do certificado: o certificado do servidor está dentro de seu período de validade e é emitido para autenticação de servidor
- Revogação: o certificado não foi revogado
- Correspondência de nome: o nome do host do servidor corresponde a um dos nomes de host para os quais o certificado foi emitido
Implemente a interface da ICertificateValidator
seguinte maneira:
PerformSystemValidation()
deverá retornartrue
se uma validação do sistema, conforme descrito acima, deve ser executada. Nesse caso, o resultado da validação do sistema é passado como uma entrada para oValidateCertificate()
método .ValidateCertificate()
deve validar a cadeia de certificados e, em seguida, chamarCertificateValidated()
no retorno de chamada passado com o resultado de validação final. Esse método aceita a cadeia de certificados, o nome do servidor com o qual a conexão está sendo estabelecida e se uma revogação marcar deve ser forçada. Se a cadeia de certificados contiver vários certificados, o primeiro será o certificado da entidade.
Observação
Se o caso de uso exigir uma forma diferente de validação (consulte o caso de uso do certificado nº 1 acima), ignore totalmente a validação do sistema. Em vez disso, use qualquer API ou biblioteca que possa manipular certificados X.509 codificados em DER para decodificar a cadeia de certificados e executar as verificações necessárias para seu caso de uso.