Cómo especificar certificados aceptados para la autenticación de cliente en .NET SslStream

StackOverflow https://stackoverflow.com/questions/53824

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy intentando utilizar la clase .Net System.Security.SslStream para procesar el lado del servidor de una secuencia SSL/TLS con autenticación de cliente.

Para realizar el apretón de manos, estoy usando este código:

SslStream sslStream = new SslStream(innerStream, false, RemoteCertificateValidation, LocalCertificateSelectionCallback);
sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Default, false);

Desafortunadamente, esto da como resultado que SslStream transmita una Solicitud de certificado que contiene los nombres de sujeto de todos los certificados en mi almacén raíz de confianza CryptoAPI.

Me gustaría poder anular esto.Para mí no es una opción exigir al usuario que instale o elimine certificados del Trusted Root Store.

Parece que SslStream usa SSPI/SecureChannel debajo, por lo que si alguien sabe cómo hacer el equivalente con esa API, eso también sería útil.

¿Algunas ideas?

¿Fue útil?

Solución

No parece que esto sea posible actualmente usando las bibliotecas .NET.

Lo resolví usando la implementación de la biblioteca de clases Mono de System.Security.SslStream, que brinda un mejor acceso para anular el comportamiento de los servidores durante el protocolo de enlace.

Otros consejos

Lo que hace la validación de certificados es validar todos los certificados de la cadena.Para hacerlo realmente, simplemente comuníquese con la tienda raíz de cada uno de esos certificados.

Si eso no es algo que desea que suceda, puede implementar su propio almacén raíz localmente.

No es la parte de validación lo que quiero cambiar.El problema está en el protocolo de enlace inicial, el servidor transmite el mensaje informando al cliente que se requiere autenticación del cliente (es decir, el mensaje CertificateRequest).Como parte de este mensaje, el servidor envía los nombres de las CA que aceptará como emisores del certificado de cliente.Es esa lista la que por defecto contiene todas las raíces de confianza en la tienda.

Pero si es posible anular el almacén raíz de certificados para una sola aplicación, eso probablemente solucionaría el problema.¿Es eso lo que quieres decir?Y si es así, ¿cómo hago eso?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top