Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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