Freigeben über


(0x6 ERROR_INVALID_HANDLE) Fehler, wenn eine Multithreadanwendung auf eine Smartcard zugreift

In diesem Artikel wird beschrieben, wie Sie den Fehler "0x6 ERROR_INVALID_HANDLE" beheben, der auftritt, wenn eine Multithreadanwendung auf eine Smartcard zugreift.

Gilt für: Windows 10

Problembeschreibung

Stellen Sie sich folgendes Szenario vor:

  • Sie verfügen über eine Smartcard-fähige Multithread-Anwendung.
  • Die Anwendung greift auf eine Smartcard zu, die auf dem Microsoft Base-Smartcard-Kryptografiedienstanbieter (basecsp.dll/scksp.dll) basiert.
  • Die Anwendung wird für eine Weile ausgeführt.

In diesem Szenario erhalten Sie einen 0x6 ERROR_INVALID_HANDLE Fehler.

Dieses Problem tritt auf, wenn ein Aufruf an eine beliebige Crypto-API erfolgt, die den Transaktions-Manager verwendet, z CryptGetKeyParam() . B. und CryptGetUserKey(), um einem anderen Aufruf vorauszugehen, der den Kontext freigibt.

Der ERROR_INVALID_HANDLE Fehler wird nicht sofort angezeigt. Je nach Ladevorgang dauert es Zeit, bis Threads auf das Synchronisierungsproblem stoßen.

Ursache

Dieses Problem tritt auf, da BaseCSP nicht für Szenarien mit hoher Auslastung konzipiert ist. Daher sind BaseCSP-Smartcards weder threadsicher noch in Hochlastszenarien unterstützt.

Weitere Informationen

BaseCSP kann Threadsicherheit nur in typischen Verwendungsszenarien erreichen, z. B. einzelner Benutzer, Smartcardanmeldung, E-Mail-Verschlüsselung oder Entschlüsselung sowie Codesignatur.

In typischen Verwendungsszenarien sollte BaseCSP threadsicher pro Kontext sein. In Szenarien mit hoher Auslastung treten Bei BaseCSP-Smartcards Probleme bei der Synchronisierung von Transaktions-Managern auf.

Problemumgehung

Verwenden Sie eine der folgenden Methoden, um dieses Problem zu umgehen.

Methode 1

Entwickeln Sie einen Anbieter-CSP- oder KSP-Anbieter, und implementieren Sie einen Transaktions-Manager darin. Auf diese Weise verwendet das Smartcard-Subsystem keinen Transaktions-Manager, der in BaseCSP implementiert ist.

Methode 2

Wichtig

Folgen Sie den Schritten in diesem Abschnitt sorgfältig. Wird die Registrierung falsch angepasst, können schwerwiegende Probleme auftreten. Bevor Sie sie ändern, sichern Sie die Registrierung zwecks Wiederherstellung für den Fall, dass Probleme auftreten.

Ein kürzeres Transaktionstimeout kann die Häufigkeit des Problems verringern. Um dies zu erreichen, starten Sie "regedit", und ändern Sie den Wert "TransactionTimeoutMilliseconds " unter dem HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\<provider_name> Unterschlüssel.

Notiz

In diesem Unterschlüssel <ist provider_name> je nach Anbieter der BaseCSP oder kSP.

Ausführliche Registrierungsbeschreibungen finden Sie unter Base CSP- und SmartCard-KSP-Registrierungsschlüssel.

Beispielsweise könnte das Reduzieren von TransactionTimeoutMilliseconds von ihrem Standardwert 1500 ms auf 100 ms die Häufigkeit des Problems verringern.

Wichtig

Diese Änderung ist nur eine Empfehlung, die auf eingeschränkten Testergebnissen basiert. Es gibt keine Garantie dafür, dass das Reduzieren des TransactionTimeoutMilliseconds-Werts dazu beitragen wird, dieses Problem zu steuern. Darüber hinaus kann das Ändern des Standardwerts von TransactionTimeoutMilliseconds zu einigen anderen Problemen führen, die sich auf BaseCSP-Karten auswirken. Stellen Sie sicher, dass Sie Ihre Karte sorgfältig für die relevante Anwendung testen und laden, bevor Sie diese Änderung bereitstellen.

References

Basis-CSP- und Smartcard-KSP-Registrierungsschlüssel

Smartcard-Minitreiber

winscard.h header

CryptGetKeyParam-Funktion (wincrypt.h)

CryptGetUserKey-Funktion (wincrypt.h)