Tengo una ASP.NET MVC proyecto Básico, el uso de Kestrel como el servidor. Es a la vez sirviendo contenido de usuario (asp.net mvc) y los anfitriones de web API controladores de agentes (software) comunicarse con. He habilitado el protocolo HTTPS y certificado de cliente de soporte. El problema es que quiero requerir certificados de cliente para los agentes (software) que la llamada Web Api, pero no quiero solicitar/pedir certificados de cliente para regular basada en el navegador de los usuarios.

He habilitado HTTPS/certificado de cliente de soporte de la siguiente manera:

var host = new WebHostBuilder()
.UseKestrel(options =>
{
    HttpsConnectionFilterOptions httpsoptions = new    HttpsConnectionFilterOptions();
    httpsoptions.ServerCertificate = CertUtil.GetServerCert();
    httpsoptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
    httpsoptions.CheckCertificateRevocation = false;

    options.UseHttps(httpsoptions);
})
.UseUrls("http://0.0.0.0:5000", "https://0.0.0.0:5001")
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build();
host.Run();

He separado un controlador de middleware de configuración de Inicio.cs para manejar personalizado de verificación de los certificados de cliente. Este código hace ejecutar con éxito y que todo funcione bien en ese sentido.

El problema es que esto sucede a nivel mundial y solo estoy mirando para solicitar certificados de cliente específicos de los controladores y/o rutas; o realmente me gustaría tomar cualquier granularidad en este punto.

Esencialmente tratando de crear el mismo tipo de comportamiento que usted puede conseguir en IIS mediante la creación de dos directorios virtuales y, a continuación, ajuste la Configuración de SSL para Aceptar en uno e Ignorar a los otros. El uno con Aceptar que se le pedirá al navegador de un cert y el uno con Ignorar no.

Traté de configuración HttpsConnectionFilterOptions a sólo especificar ServerCertificate con la esperanza de que no se ajuste a cualquier cliente de certificados relacionados con las opciones de permitir que el servidor para recibir los certificados de cliente si se envían, pero de lo contrario no se le pedirá navegadores para ellos. Esto no parece funcionar como mi middleware cliente certificado de manipulador nunca ve un cliente cert cuando se llama a esta función (lo hace cuando ClientCertificateMode se establece en AllowCertificate.

context.Connection.GetClientCertificateAsync();

Supongo que en breve no Kestrel de hosting permiten, incluso, realizar más granular de la asignación de certificados de cliente/manejo o sólo es posible mediante el uso de IIS? IIS no es una opción para este proyecto y me preferirían no tener que crear un proyecto independiente/proceso justo para el cliente cert api aspectos. Agradezco cualquier ayuda!

InformationsquelleAutor Paul W. | 2016-07-29

4 Comentarios

  1. 4

    Yo he estado tratando de hacer la misma cosa, con exactamente los mismos requisitos como usted.

    He llegado a la conclusión de que no es posible. Mi solución es utilizar 2 WebHostBuilder objetos – una de las ubicaciones que no necesidad de certificados de cliente, y para los que hacer. Esto tiene la desventaja de que cada IWebHost debe escuchar en un puerto diferente, pero a partir de la situación que se describe supongo que no es un problema grande.

    Puedo hacer esto dentro del mismo proceso, por lo que esta solución cumple con ese requisito.

    • También he descubierto recientemente esta para ser realmente la única solución viable en el momento. Dev team parecía a recomendar lo mismo: github.com/aspnet/KestrelHttpServer/issues/… Gracias!
    • Pregunto si alguien tiene un nuevo/mejor manera de hacer esto ahora que asp.net core 2.0 está fuera?
  2. 3

    Tuve el mismo problema con context.Connection.GetClientCertificateAsync(); fue siempre devuelve null. Entonces me di cuenta de que estaba corriendo Kestrel través de IIS Express todo el tiempo.

    Así que en Visual Studio desde el Debuger de la barra de herramientas he cambiado de IIS Express para mi proyecto. Kestrel se inició como aplicación de consola y yo era capaz de obtener el certificado de cliente.

    Requieren de Certificado de Cliente SSL sólo para rutas específicas o controladores

    Creo que IIS Express no admite certificados de cliente por lo que el certificado fue siempre ignorado.

    Para la otra parte de la pregunta; creo que Kestrel dos no apoyo esta granularidad que usted está mirando hacia fuera de la caja cuando se utiliza el HttpsConnectionFilterOptions. Desde el Kestrel Filtro de Conexión de las Opciones de código fuente la conexión será descartado si el certificado de cliente es nula. Tal vez usted puede modificar el código fuente de la HttpsConnectionFilterOptions y crear su propio filtro de ella. A continuación, puede utilizar el ClientCertificateValidation propiedad para especificar certificado personalizado método de validación que permitirá la conexión cuando no hay certificado de cliente es enviar.

    Espero que esto ayude.

  3. 1

    He descubierto la manera de tener Certificado de Cliente sólo en algunas rutas, pero cuando se ejecuta en Azure Web App, el cliente cert no se pasa al código. Es el mismo problema que cuando se ejecuta en IIS Express.

    En este ejemplo, Un controlador no necesita cert, los otros dos requiere que los diferentes certificados.
    https://github.com/xavierjohn/ClientCertificateMiddleware

    El certificado hace pasar a través de si es no ejecuta en IIS Express.

    • Que realmente es una muy buena solución que construyeron. Una cosa desde una perspectiva de seguridad es que usted debe verificar también en contra de la huella digital del certificado como lo contrario a un atacante podría suplantar Emisor y un Tema muy fácilmente, mientras que la huella digital es un hash del certificado completo etc… la solución que realmente funciona muy bien bajo el Cernícalo. No estoy seguro de lo que el problema podría estar en IIS Express o Azure Web App pero probablemente, usted puede abrir otro desbordamiento de la pila del subproceso en el que.
    • Esto parece ser relevantes para su problema con Azure y la no obtención de certificados de cliente. blogs.msdn.microsoft.com/kaevans/2016/04/13/…
    • Una vez que averiguar cómo conseguir que esto funcione en Azure, voy a añadir la opción para el pulgar de impresión. El problema con el pulgar de la impresión es de que debemos mantener la actualización de la misma cuando los certificados caducan. Para los servicios que tiene muchos socios, esto podría ser dolorosa.
    • Aquí es un documento sobre cómo habilitar los certs en Azure Web App. msftplayground.com/2016/06/…
    • La verdad es que, manteniendo todas las huellas digitales hasta la fecha puede ser más trabajo. Al menos, a pesar de que usted debe buscar en la cadena de certificados de validación para asegurarse de que el certificado es válido para una CA de confianza y así sucesivamente. Esencialmente, usted quiere ser muy cuidadoso con el rollo de su propio certificado de validación. Hay un montón de buenas prácticas óptimas en esta pena investigar.
    • He añadido una llamada a Verificar() para la validación de la cadena. msdn.microsoft.com/en-us/library/…
    • Por favor me corrija si estoy equivocado chicos, pero permitiendo a clientes certificados en azure significa que va a ser necesario en cualquier ruta en toda la webapp. Hay una petición para cambiar este comportamiento aquí: feedback.azure.com/forums/169385-web-apps/suggestions/…

  4. -1

    No es necesario el uso aislado (nuevo) IWebHost para controlar el acceso a la dedicación de controladores MVC.
    Sólo uso MVC Filtro para este propósito.

Dejar respuesta

Please enter your comment!
Please enter your name here