Udostępnij za pośrednictwem


(0x6 ERROR_INVALID_HANDLE) błąd, gdy aplikacja wielowątkowy uzyskuje dostęp do karty inteligentnej

W tym artykule opisano sposób rozwiązywania problemów i naprawiania błędu "0x6 ERROR_INVALID_HANDLE", który występuje, gdy aplikacja wielowątkowy uzyskuje dostęp do karty inteligentnej.

Dotyczy: system Windows 10

Symptomy

Rozważmy następujący scenariusz:

  • Masz aplikację wielowątkową z obsługą kart inteligentnych.
  • Aplikacja uzyskuje dostęp do karty inteligentnej opartej na dostawcy usług kryptograficznych karty inteligentnej Firmy Microsoft (basecsp.dll/scksp.dll).
  • Aplikacja działa przez pewien czas.

W tym scenariuszu zostanie wyświetlony błąd 0x6 ERROR_INVALID_HANDLE .

Ten problem występuje, jeśli wywołanie jest wykonywane do dowolnego interfejsu API kryptograficznego, który używa menedżera transakcji, takiego jak CryptGetKeyParam() i CryptGetUserKey(), do poprzedzania innego wywołania, które zwalnia kontekst.

Błąd ERROR_INVALID_HANDLE nie jest wyświetlany natychmiast. W zależności od obciążenia trwa czas, aby wątki napotkały problem z synchronizacją.

Przyczyna

Ten problem występuje, ponieważ program BaseCSP nie jest przeznaczony dla scenariuszy wysokiego obciążenia. W związku z tym karty inteligentne BaseCSP nie są bezpieczne wątkowo ani nie są obsługiwane w scenariuszach o dużym obciążeniu.

Więcej informacji

Program BaseCSP może zapewnić bezpieczeństwo wątków tylko w typowych scenariuszach użycia, takich jak pojedynczy użytkownik, logowanie do karty inteligentnej, szyfrowanie poczty e-mail lub odszyfrowywanie oraz podpisywanie kodu.

W typowych scenariuszach użycia protokół BaseCSP powinien być bezpieczny wątkowo na kontekst. W scenariuszach o dużym obciążeniu karty inteligentne BaseCSP napotykają problemy z synchronizacją menedżera transakcji.

Rozwiązanie

Aby obejść ten problem, użyj jednej z następujących metod.

Metoda 1

Opracuj dostawcę dostawcy CSP lub dostawcę KSP i zaimplementuj w nim menedżera transakcji. W ten sposób podsystem karty inteligentnej nie będzie używać menedżera transakcji zaimplementowanego w programie BaseCSP.

Metoda 2

Ważne

Należy rozważnie wykonywać czynności podane w tej sekcji. Niepoprawne zmodyfikowanie rejestru może być przyczyną poważnych problemów. Przed zmodyfikowaniem rejestru należy utworzyć jego kopię zapasową, aby móc przywrócić rejestr na wypadek problemów.

Krótszy limit czasu transakcji może zmniejszyć częstotliwość występowania problemu. Aby to osiągnąć, uruchom polecenie regedit i zmień wartość TransactionTimeoutMilliseconds w podkluczu HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\<provider_name> .

Uwaga 16.

W tym podkluczu <provider_name> jest baseCSP lub ksp, w zależności od dostawcy.

Aby uzyskać szczegółowy opis rejestru, zobacz Podstawowe zasady CSP i klucze rejestru KSP karty inteligentnej.

Na przykład zmniejszenie wartości TransactionTimeoutMilliseconds z wartości domyślnej 1500 ms do 100 ms może zmniejszyć częstotliwość problemu.

Ważne

Ta zmiana jest tylko zaleceniem opartym na ograniczonych wynikach testu. Nie ma gwarancji, że zmniejszenie wartości TransactionTimeoutMilliseconds pomoże kontrolować ten problem. Ponadto zmiana domyślnej wartości TransactionTimeoutMilliseconds może spowodować inne problemy wpływające na karty BaseCSP. Przed wdrożeniem tej zmiany upewnij się, że dokładnie przetestujesz kartę dla odpowiedniej aplikacji i załaduj ją.

Informacje

Podstawowy dostawca CSP i klucze rejestru KSP karty inteligentnej

Minidrivery kart inteligentnych

nagłówek winscard.h

CryptGetKeyParam, funkcja (wincrypt.h)

Funkcja CryptGetUserKey (wincrypt.h)