Forçando o cliente WebAPI do ASP.NET a enviar um certificado de cliente mesmo quando nenhuma correspondência de CA
Eu tenho um aplicativo específico que requer o uso de certificados de cliente para autenticação mútua de solicitações HTTPS. O servidor tem uma política de validação de certificado flexível que permite aceitar certificados de cliente autoassinados que não estão presentes no armazenamento de certificados do servidor. Sabe-se que isso funciona muito bem usando o curl como um cliente.
O que eu determinei através de testes e sniffing de pacotes é que o ASP.NET da MicrosoftHttpClient
tenta ser excessivamente inteligente durante o handshake SSL. Este cliente em particular usará somente um certificado de cliente (doWebRequestHandler.ClientCertificates
coleção) se tiver uma cadeia de confiança para uma das raízes confiáveis do servidor. O que observei é que, se não houver certificados com cadeia de confiança, o cliente simplesmente não enviará um certificado durante o aperto de mão.
Esse comportamento padrão é compreensível, mas é excessivamente restritivo e parece não haver nenhuma maneira de desativá-lo. Eu experimentei vários outrosWebRequestHandler
propriedades, incluindoAuthenticationLevel
eClientCertificateOptions
mas sem sucesso.
Existe uma maneira de forçarHttpClient
para enviar um certificado de cliente quando estiver disponível noClientCertificates
coleção, mesmo que pareça que não será validado no lado do servidor? Estou aberto a soluções diretas e sujas (reflexos hacks), pois realmente preciso que esse cliente funcione.