Carregar temporariamente chave de cliente SSL para autenticação de cliente em c #

Eu estou usando o controle WebBrowser para adicionar um WebInterface ao aplicativo C #. Meu desejo é verificar se apenas esse aplicativo é capaz de se conectar ao nosso servidor Web usando certificados de cliente SSL.

Minha ideia era incorporar o certificado do cliente no aplicativo e usá-lo apenas ao conectar-se por meio do meu aplicativo. Alguém tem uma sugestão de como fazer isso? Ou a única maneira de fazê-lo funcionar é carregar a chave no X509Store.

Se eu colocá-lo no X509Store, ele disponibilizará a minha chave para o uso geral do Internet Explorer?

0
adicionado
Visualizações: 1

3 Respostas

Tem certeza de que isso é o que você quer fazer? Se você incorporar a chave privada em seu aplicativo (como sua abordagem implica), um invasor pode extraí-lo e usá-lo para autenticar seu software invasor.

Um servidor não pode autenticar o software do cliente. Só pode testar se um cliente possui algum segredo. Quando você incorpora uma chave privada em seu cliente e a distribui, ela não será mais um segredo.

Eu recomendaria a autenticação de usuários do seu software, em vez do próprio software. Você precisa permitir que os usuários gerem seu próprio segredo, seja uma senha ou uma chave privada, e incentive-os a protegê-lo.

0
adicionado

A intenção de usar a chave não é tanto para validar os usuários quanto para restringir o acesso aos usuários do aplicativo, em vez de usar qualquer navegador da Web. Isso é uma espécie de comportamento de intranet na Internet pública.

Este é o DRM de um homem pobre. As perdas devidas a pessoas que extraem a chave não são tão importantes. Eu acho que o risco disso acontecer é baixo e o que podemos perder é mínimo.

No entanto, se houver qualquer outra ideia para restringir o acesso ao WebServer apenas aos usuários do aplicativo, eu estou aberto a qualquer sugestão. Basicamente, meu desejo agora é ter um WebServer público aberto para ser lido por qualquer pessoa, mas o acesso através da rede pública de diversos lugares é necessário, portanto, não é possível configurar uma infra-estrutura de intranet.

0
adicionado

Então, vários pensamentos aqui:

1

Eu concordo com 'erickson', validando que SOMENTE seu aplicativo pode se comunicar com o aplicativo é quase impossível com o seu design atual. É só uma questão de tempo antes que alguém inverta o seu aplicativo e, em seguida, o jogo acaba (se você é apenas uma forma de segurança). Se você quer validar que o seu aplicativo e um usuário válido, então você precisa autenticar o usuário, bem como algum mecanismo de verificação da assinatura do aplicativo em questão (que eu não acredito ser possível em um modelo cliente-servidor. ..after tudo o que posso sempre mentir e dizer que o meu 'hackyou' app tem a mesma assinatura que o seu 'realapp' e você não pode verificar isso do lado do servidor)

2

Lembre-se que o controle WebBrowser é essencialmente um wrapper em torno do IE, portanto, sem alguns truques (que eu vou obter em um segundo), você teria que adicionar o certificado para o repositório de usuários.

3

Aqui está uma maneira hacky de realizar o que você está pedindo (mesmo que seja uma má idéia):

  • Primeiro, use o WebRequest.Create para criar um objeto HttpWebRequest
  • Carregue manualmente um objeto X509Certificate2 de um arquivo ou do fluxo binário codificado no programa
  • use o HttpWebRequest.ClientCertificates para adicionar seu certificado ao webrequest
  • Envie a solicitação, obtenha a resposta </​​li>
  • Envie a resposta para o WebBrowser, enviando o ResponseStream do HttpWebResponse para o DocumentStream do WebBrowser

Isso basicamente significa que você terá que escrever algumas classes de wrapper para manipular as solicitações e respostas para e do servidor e estão usando apenas o WebBrowser para manipular a exibição do HTML.

Na realidade, você precisa reformular e analisar as ameaças que está tentando resolver.

0
adicionado