Kłopoty z kartą Certum

Jeden z czytelników serwisu zajmujący się pisaniem oprogramowania wykorzystującego bezpieczny podpis elektroniczny postanowił podzielić się swoimi doświadczeniami z kartami kryptograficznymi i sterownikami do nich, które otrzymał od Certum. Cały poniższy tekst pochodzi od oryginalnego autora, który woli pozostać anonimowy.


Korzystanie w dzisiejszych czasach z podpisu elektronicznego wymaga nie lada cierpliwości, programowanie również, szczególnie gdy różni dostawcy mają dowolność w konfigurowaniu parametrów chociażby kart kryptograficznych. Brak standardów to standard? Czyżby?

Dla przykładu chcę wprowadzić do swojej aplikacji w formie appletu Javy możliwość podpisywania dokumentów przy wykorzystaniu podpisów kwalifikowanych. Wybór ubogi jeżeli chodzi o rynek dostawców tego typu rozwiązań - aż trzech, mój wybór nie wiem, czy trafny, firma Unizeto.

Otrzymałem biblioteki, otrzymałem kartę, otrzymałem czytnik, usiadłem ze współpracownikami.

Próba odwołania się z appletu i odczytanie listy certyfikatów, dla których dostępne są klucze prywatne. Pierwszy raz, działa, Drugi raz... działa.. Trzeci raz... Wyjątek (czyli użytkownikowi musimy zgłosić, błąd, tylko jaki?)

Dla lubiących programować i czytać dokumentacje techniczne
godne polecenia logi:

java.security.ProviderException: Initialization failed   
(...) 
Caused by: sun.security.pkcs11.wrapper.PKCS11Exception: CKR_SESSION_COUNT   
at sun.security.pkcs11.wrapper.PKCS11.C_OpenSession(Native Method)

`
I kilka uwag technicznych dla programujących z tzw dostawców (providerów) PKCS#11, a konkretnie z sun.security.pkcs11.SunPKCS11

  1. Utworzenie dynamicznie dostawcy poprzez wskazanie ścieżki do sterownika - C:\WINDOWS\system32\cryptoCertumPKCS11.dll (Profil bezpieczny) oraz jego nazwy (np. : Dostawca PKCS11)
  2. Zalogowanie się do magazynu certyfikatów podając kod PIN
  3. Pobranie magazynu certyfikatów - KeyStore
  4. Wypisanie identyfikatorów certyfikatów
  5. Wypisanie dostępnych kluczy publicznych oraz informacji czy istnieje klucz prywatny
  6. Zamknięcie dostępu do magazynu certyfikatów (metoda logout Providera)
  7. Usunięcie providera


Szczególnie na uwagę zwraca CKR_SESSION_COUNT (No sessions are available - brak dostępnych sesji), co to jest za stała?

Standardowe biblioteki Javy nie udostępniają informacji o dostępnych parametrach karty, więc trzeba było skorzystać z komponentów firmy trzeciej - IAIK, a konkretnie z bibliotek PKCS#11 Wrapper. Na szczęście dostarczane są za darmo wraz z dokumentacją.

Chwila prawdy: uruchamiam program wypisujący parametry dotyczące karty, na uwagę zasługuje parametr oraz jego wartość "ulMaxSessionCount: 4"

Wgląd w dokumentację techniczną PKCS#11 opublikowaną przez RSA (http://www.rsa.com/rsalabs/node.asp?id=2133). Mówiąc krótko - na karcie kryptograficznej można ustawić, ile razy jedna aplikacji może poprosić o dostęp do kluczy zawartych na karcie.

Czyli jak użytkownik uruchomi applet, cztery razy wskaże - "Proszę pokazać mi zawartość karty" to później nic innego nie pozostaje, jak zamknąć przeglądarkę, i na wejść na stronę, poczekać aż załaduje się applet, i a piać od nowa...

W przypadku Javy wygląda to jeszcze gorzej, mamy tak naprawdę możliwość otwarcia dwóch sesji, po czym występuje wskazany wyżej błąd.

Ciekawe jak to firma Unizeto chce rozwiązać w swoich programach, jeżeli będzie musiała skorzystać z Javy, np w obsłudze skrzynki podawczej?

Ciekawe też, czy inne Centra Certyfikacji stosują podobne mechanizmy "zabezpieczeń"?

Ciekawe co na to twórcy rozwiązań, jak podpiselektroniczny.pl, czy ePuap?

Odpowiedzi

Opcje wyświetlania odpowiedzi

Wybierz preferowany sposób wyświetlania odpowiedzi i kliknij "Zapisz ustawienia" by wprowadzić zmiany.

Witam

Napisałem applet który używa API z java.security. Pobiera on certyfikat z certyfikatów osobistych Windows i podpisuje wiadomość pobraną z pola . Dla niektórych kart/certyfikatów otrzymuję SignatureException i komunikat "Zły UID". Czy ktoś może mi wytłumaczyć, co oznacza ten błąd?

Pozdrawiam

Witam,
ostatnio napotkałem na inny problem z kartami Certum. Sprawa dotyczy kart w wersji >= 3.0.
Problem stanowi wspomniana już biblioteka cryptoCertumPKCS11.dll. Nie za bardzo potrafi ona współpracować z nowymi kartami Certum. Na szczęście problem jest tylko i aż informacyjny bo okazuje się że do nowych kat należy korzystać z nowej biblioteki cryptoCertum3PKCS.dll, które jest dedykowana właśnie do tych nowych kart i z nią już wszystko działa poprawnie.... myślę, że informacja przyda się może jakimś developerom :)

Pozdr.

Witam

Przede wszystkim - limit jednoczesnych sesji jest normalną praktyką i może wynikać np. z fizycznych ograniczeń karty. To NIE JEST ustawienie, ile razy jedna aplikacji może poprosić o dostęp do kluczy zawartych na karcie - to jest ustawienie, ile równoległych sesji można utrzymywać z kartą. W praktyce nie widzę potrzeby utrzymywania więcej niż jednej.

ulMaxSessionCount - maximum number of sessions that can be opened with the token at one time by a single application

Podejrzewam tutaj bardziej błąd programistyczny (nie zamykanie sesji po zakończeniu korzystania z karty i inicjowanie nowej sesji do każdej operacji) - nie wiem, czy na poziomie javowego API, czy gdzieś w kodzie aplikacji. Korzystanie z IAIKowego pkcs#11-wrappera nie wykazuje takich problemów. Korzystanie z biblioteki z poziomu C/C++ także - z tego co pamiętam - tego typu trudności nie przysparzało.

API Sunowego nie używałem.

> Ciekawe jak to firma Unizeto chce rozwiązać w swoich programach, jeżeli
> będzie musiała skorzystać z Javy, np w obsłudze skrzynki podawczej?

Działa.

Pozdrawiam.

Ciekawe jak to rozwiązaliśmy? Wiec tak:
Większość naszego oprogramowania opiera sie na technologii Java - Polecam zawartość działu download z Cerum.pl. Z IAIK nie ma takich problemów - wystarczy zakończyć bieżącą sesję, lub sprawdzić czy inna jest otwarta, tuż przed otwarciem nowej.
Co do 'problemu' to całkowicie zgadzam lklimek.
PS. a skrzynka podawcza działa bezproblemowo.

Pozdrawiam.