Freigeben über


Beheben von SslStream Authentifizierungsproblemen

In diesem Artikel werden die häufigsten Authentifizierungsprobleme bei der Verwendung kryptografie- und sicherheitsbezogener Funktionen in .NET dargestellt. Diese Funktionen sind durch Interoperabilität mit der Betriebssystem-API (z. B. Schannel unter Windows) oder Systembibliotheken auf niedriger Ebene (z. B. OpenSSL unter Linux) implementiert. Das Verhalten der .NET-Anwendung, einschließlich Ausnahmemeldungen und Fehlercodes, kann sich daher je nach ausgeführter Plattform ändern.

Einige Probleme sind möglicherweise einfacher zu untersuchen und zu beheben, indem die tatsächlichen Nachrichten, die über den Draht ausgetauscht werden, mithilfe von Tools wie Wireshark oder tcpdump beobachtet werden. Mithilfe dieser Tools können ClientHello-, ServerHello- und andere Nachrichten auf angekündigte, unterstützte, zulässige TLS-Versionen, ausgehandelte Verschlüsselungssammlungen und die für die Authentifizierung ausgetauschten Zertifikate überprüft werden.

Zwischenzertifikate werden nicht gesendet

Während des TLS-Handshakes sendet der Server (und der Client auch, wenn die Clientauthentifizierung angefordert wird) sein Zertifikat, um seine Identität an den Client zu bestätigen. Um die Echtheit des Zertifikats zu überprüfen, muss eine Zertifikatkette erstellt und überprüft werden. Der Stamm der Kette muss eine der vertrauenswürdigen Stammzertifizierungsstelle sein, deren Zertifikat im Computerzertifikatspeicher gespeichert ist.

Wenn das Peerzertifikat nicht von einem der vertrauenswürdigen Zertifizierungsstellen ausgestellt wurde, ist ein Zertifikat für die Zwischenzertifizierungsstelle erforderlich, um die Zertifikatkette zu erstellen. Wenn das Zwischenzertifikat jedoch nicht verfügbar ist, ist es nicht möglich, das Zertifikat zu überprüfen, und der TLS-Handshake schlägt möglicherweise fehl.

Dieses Problem ist am häufigsten unter Windows aufgetreten. Obwohl die Anwendung Zwischenzertifikate über die Authentifizierungsoptionen bereitgestellt hat, werden sie nicht an den Peer gesendet, es sei denn, sie werden im Windows-Zertifikatspeicher gespeichert. Diese Einschränkung liegt daran, dass der tatsächliche TLS-Handshake außerhalb des Anwendungsprozesses auftritt.

Für Serveranwendungen ist es möglich, ein SslStreamCertificateContext als SslServerAuthenticationOptions.ServerCertificateContext zu übergeben. Während der Erstellung der SslStreamCertificateContext Instanz können Sie zusätzliche Zwischenzertifikate übergeben, und diese werden vorübergehend im Zertifikatspeicher hinzugefügt.

Leider besteht für die Clientanwendung die einzige Lösung darin, die Zertifikate manuell zum Zertifikatspeicher hinzuzufügen.

Fehler beim Handshake mit kurzlebigen Schlüsseln

Unter Windows tritt möglicherweise die (0x8009030E): No credentials are available in the security package Fehlermeldung auf, wenn Sie versuchen, Zertifikate mit kurzlebigen Schlüsseln zu verwenden. Dieses Verhalten ist auf einen Fehler in der zugrunde liegenden Betriebssystem-API (Schannel) zurückzuführen. Weitere relevante Informationen und Problemumgehungen finden Sie im zugehörigen GitHub-Problem.

Client und Server besitzen keinen gemeinsamen Algorithmus

Bei der Überprüfung der ClientHello Und ServerHello Nachrichten stellen Sie möglicherweise fest, dass es keine Verschlüsselungssuite gibt, die sowohl vom Client als auch vom Server angeboten wird oder dass einige Verschlüsselungen nicht angeboten werden, auch wenn sie explizit über CipherSuitesPolicy (nur unter Linux verfügbar) konfiguriert werden. Die zugrunde liegende TLS-Bibliothek kann TLS-Versionen und Verschlüsselungssammlungen deaktivieren, die als unsicher eingestuft werden.

Auf vielen Linux-Distributionen befindet sich die entsprechende Konfigurationsdatei unter /etc/ssl/openssl.cnf.

Unter Windows können die Enable-TlsCipherSuite und Disable-TlsCipherSuite PowerShell-Cmdlets zum Konfigurieren von Cipher-Suiten verwendet werden. Einzelne TLS-Versionen können durch Konfigurieren des HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS <version>\{Client|Server}\Enabled Registrierungsschlüssels aktiviert/deaktiviert werden.