2008-09-10 11 views
3

Ich versuche die .Net System.Security.SslStream-Klasse zu verwenden, um die Serverseite eines SSL/TLS-Streams mit Clientauthentifizierung zu verarbeiten.So geben Sie akzeptierte Zertifikate für die Clientauthentifizierung in .NET an SslStream

den Handshake auszuführen, ich diesen Code verwende:

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

Leider ist dies in der SslStream ergibt sich eine Certificate Übertragung der subjectnames aller Zertifikate in meinem CryptoAPI vertrauenswürdigen Stammspeicher enthält.

Ich möchte in der Lage sein, dies zu überschreiben. Es ist für mich keine Option, vom Benutzer die Installation oder das Entfernen von Zertifikaten aus dem vertrauenswürdigen Stammspeicher zu verlangen.

Es sieht so aus, als ob der SslStream SSPI/SecureChannel verwendet, also wenn jemand weiß, wie man das Äquivalent mit dieser API macht, wäre das auch hilfreich.

Irgendwelche Ideen?

Antwort

2

Es sieht nicht so aus, als ob dies derzeit mit den .NET-Bibliotheken möglich ist.

Ich löste es mithilfe der Mono-Klassenbibliothek Implementierung von System.Security.SslStream, die einen besseren Zugriff auf das Verhalten der Server während des Handshakes überschreiben gibt.

1

Durch die Zertifikatsprüfung werden alle Zertifikate in der Kette überprüft. Um dies wirklich zu tun, kontaktieren Sie einfach den Wurzelspeicher jedes dieser Zertifikate.

Wenn Sie das nicht möchten, können Sie Ihren eigenen Root-Speicher lokal bereitstellen.

0

Es ist nicht der Validierungsteil, den ich ändern möchte. Das Problem besteht darin, dass der Server beim ersten Handshake die Nachricht sendet, die den Client darüber informiert, dass eine Client-Authentifizierung erforderlich ist (das ist die CertificateRequest-Nachricht). Als Teil dieser Nachricht sendet der Server die Namen der Zertifizierungsstellen, die er als Aussteller des Clientzertifikats akzeptiert. Es ist diese Liste, die standardmäßig alle vertrauenswürdigen Roots im Speicher enthält.

Aber wenn es möglich ist, den Zertifikatsstammspeicher für eine einzelne Anwendung zu überschreiben, würde das wahrscheinlich das Problem beheben. Meinst Du das? Und wenn ja, wie mache ich das?

+0

Rasmus, ich versuche, das gleiche Problem zu lösen. Haben Sie eine bestimmte Lösung gefunden? – cdpnet

+0

@cdpnet, löste ich es mit der Mono-Implementierung von SslStream. –

Verwandte Themen