Como especificar certificados aceitos para autenticação de cliente no .NET SslStream
Pergunta
Estou tentando usar a classe .Net System.Security.SslStream para processar o lado do servidor de um fluxo SSL/TLS com autenticação de cliente.
Para realizar o handshake, estou usando este código:
SslStream sslStream = new SslStream(innerStream, false, RemoteCertificateValidation, LocalCertificateSelectionCallback);
sslStream.AuthenticateAsServer(serverCertificate, true, SslProtocols.Default, false);
Infelizmente, isso faz com que o SslStream transmita um CertificateRequest contendo os nomes dos assuntos de todos os certificados em meu armazenamento raiz confiável CryptoAPI.
Eu gostaria de poder substituir isso.Não é uma opção exigir que o usuário instale ou remova certificados do Trusted Root Store.
Parece que o SslStream usa SSPI/SecureChannel por baixo, então se alguém souber como fazer o equivalente com essa API, isso também seria útil.
Alguma ideia?
Solução
Atualmente, não parece que isso seja possível usando as bibliotecas .NET.
Eu resolvi isso usando a implementação da biblioteca de classes Mono de System.Security.SslStream, que dá melhor acesso para substituir o comportamento dos servidores durante o handshake.
Outras dicas
O que a validação do certificado faz é validar todos os certificados da cadeia.Para fazer isso de verdade basta entrar em contato com o armazenamento raiz de cada um desses certificados.
Se isso não é algo que você deseja que aconteça, você pode implantar seu próprio armazenamento raiz localmente.
Não é a parte de validação que quero alterar.O problema está no handshake inicial, o servidor transmite a mensagem informando ao cliente que é necessária a autenticação do cliente (que é a mensagem CertificateRequest).Como parte desta mensagem, o servidor envia os nomes das CAs que aceitará como emissoras do certificado do cliente.É essa lista que por padrão contém todas as raízes confiáveis da loja.
Mas se for possível substituir o armazenamento raiz do certificado para um único aplicativo, isso provavelmente resolveria o problema.É isso que você quer dizer?E se sim, como faço isso?