2008-09-10 15 views
3

J'essaie d'utiliser la classe .Net System.Security.SslStream pour traiter le côté serveur d'un flux SSL/TLS avec l'authentification du client.Comment spécifier les certificats acceptés pour l'authentification du client dans .NET SslStream

Pour effectuer la poignée de main, je suis en utilisant ce code:

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

Malheureusement, cela se traduit par la transmission d'un SslStream CertificateRequest contenant les subjectnames de tous les certificats dans mon magasin CryptoAPI Trusted Root.

Je voudrais être en mesure de surcharger cela. Ce n'est pas une option pour moi d'exiger que l'utilisateur installe ou supprime des certificats du magasin racine de confiance. Il semble que le SslStream utilise SSPI/SecureChannel en dessous, donc si quelqu'un sait comment faire l'équivalent avec cette API, cela serait également utile.

Des idées?

Répondre

2

Cela ne semble pas possible actuellement avec les bibliothèques .NET.

Je l'ai résolu en utilisant l'implémentation de la bibliothèque de classe Mono de System.Security.SslStream, qui donne un meilleur accès à la surcharge du comportement des serveurs pendant la négociation.

1

La validation du certificat valide tous les certificats de la chaîne. Pour vraiment le faire, il suffit de contacter le magasin racine de chacun de ces cerficats.

Si ce n'est pas ce que vous voulez, vous pouvez déployer votre propre magasin racine localement.

0

Ce n'est pas la partie de validation que je veux changer. Le problème est dans la poignée de main initiale, le serveur transmet le message informant le client que l'authentification du client est requise (c'est le message CertificateRequest). Dans le cadre de ce message, le serveur envoie les noms des autorités de certification qu'il acceptera comme émetteurs du certificat client. C'est cette liste qui par défaut contient toutes les racines de confiance dans le magasin.

Mais s'il est possible de remplacer le magasin racine du certificat pour une seule application, cela résoudrait probablement le problème. C'est ce que tu veux dire? Et si oui, comment je fais ça?

+0

Rasmus, j'essaie de résoudre le même problème. Avez-vous trouvé une solution particulière? – cdpnet

+0

@cdpnet, je l'ai résolu en utilisant l'implémentation Mono de SslStream. –

Questions connexes