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