Cargue temporalmente la clave del cliente SSL para la autenticación del cliente en C #

Estoy usando el control WebBrowser para agregar una aplicación WebInterface a C #. Mi deseo es verificar que solo esa aplicación pueda conectarse a nuestro servidor web utilizando certificados de cliente SSL.

Mi idea era incorporar el certificado del cliente en la aplicación y solo usarlo cuando me conecté a través de mi aplicación. ¿Alguien tiene una sugestión sobre cómo hacer esto? O la única forma de hacerlo funcionar es cargar la clave en X509Store.

Si lo pongo en X509Store, ¿hará que mi clave esté disponible para el uso general de Internet Explorer?

0
agregado
Puntos de vista: 1

3 Respuestas

¿Estás seguro de que esto es lo que quieres hacer? Si incrusta la clave privada en su aplicación (como lo implica su enfoque), un atacante puede extraerla y usarla para autenticar su software fraudulento.

Un servidor no puede autenticar el software del cliente. Solo puede probar si un cliente posee algún secreto. Cuando incrusta una clave privada en su cliente y la distribuye, ya no será un secreto.

Recomiendo autenticar usuarios de su software, en lugar del software en sí. Debe permitir que los usuarios generen su propio secreto, ya sea una contraseña o una clave privada, y darles un incentivo para protegerlo.

0
agregado

La intención de usar la clave no es tanto para validar a los usuarios como para restringir el acceso a los usuarios de la aplicación en lugar de usar cualquier WebBrowser. Este es un tipo de comportamiento de intranet sobre Internet público.

Este es un DRM de un hombre pobre. Las pérdidas debidas a que las personas extraen la clave no son tan importantes. Creo que el riesgo de que esto ocurra es bajo y lo que podemos perder es mínimo.

Sin embargo, si hay alguna otra idea para restringir el acceso al servidor web a los usuarios de la aplicación, estoy abierto a cualquier sugerencia. Básicamente, mi deseo ahora es tener abierto un WebServer público para que lo lea cualquier persona, pero es necesario acceder a través de la red pública desde diversos lugares, por lo que tampoco es posible configurar una infraestructura de intranet.

0
agregado

Entonces, varios pensamientos aquí:

1.

Estoy de acuerdo con 'erickson', validando que SÓLO su aplicación se puede comunicar con la aplicación es casi imposible con su diseño actual. Es solo cuestión de tiempo antes de que alguien realice una ingeniería inversa en su aplicación y luego se termine su juego (si esa es su única forma de seguridad). Si desea validar que es su aplicación y un usuario válido, entonces necesita autenticar al usuario así como también algún mecanismo para verificar la firma de la aplicación en cuestión (que no creo que sea posible en un modelo de cliente-servidor). ..después de todo, siempre puedo mentir y decir que mi aplicación 'hackyou' tiene la misma firma que tu 'realapp' y no puedes verificar eso desde el lado del servidor)

2.

Recuerde que el control WebBrowser es esencialmente un envoltorio alrededor de IE, así que sin algunos trucos (que obtendré en un segundo) tendría que agregar el certificado a la tienda de usuarios.

3.

Aquí hay una forma estrafalaria de lograr lo que estás preguntando (aunque es una mala idea):

  • Primero use la WebRequest.Create para crear un objeto HttpWebRequest
  • Cargue manualmente un objeto X509Certificate2 desde un archivo o la secuencia binaria codificada en el programa
  • utilice los HttpWebRequest.ClientCertificates para agregar tu cert a la webrequest
  • Enviar la solicitud, obtener la respuesta </​​li>
  • Envía la respuesta al WebBrowser presionando el ResponseStream de HttpWebResponse en DocumentStream del WebBrowser

Esto significa esencialmente que tendrá que escribir algunas clases contenedoras para manejar las Solicitudes y respuestas hacia y desde el Servidor y que solo están usando WebBrowser para manejar la visualización del HTML.

¡En realidad, necesitas rediseñar y ver las amenazas que intentas manejar!

0
agregado