Como especificar certificados aceitos para autenticação de cliente no .NET SslStream

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

  •  09-06-2019
  •  | 
  •  

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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top