Kłopoty z kartą Certum

2008-03-14 00:00:00 +0000


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?