niedziela, 2 października 2011

Podpis kwalifikowany

W Javie korzystam z bibliotek standardu PKCS#11, które są implementowane przez następujące pliki:
  • KIR (SZAFIR) / SIGILLUM (PWPW) - ccpkip11.dll (taka samą nazwę pliku, ale inną lokalizację ma sterownik karty 64-bit),
  • UNIZETO (CERTUM) - cryptoCertum3PKCS.dll (taka samą nazwę pliku, ale inną lokalizację ma sterownik karty 64-bit. Dla starszych kart - numery ośmiocyfrowe - jest sterownik karty o nazwie cryptoCertumPKCS11.dll),
  • MOBICERT - dla nowszych kart Siemensa od połowy 2010 roku - cmp11.dll i cmp1164.dll (dla systemów 64-bit),
  • CENCERT - enigmap11.dll i enigmap11-x64.dll (dla systemów 64-bit).
Na początku do obsługi standardu PKCS#11 wykorzystywałem standardową implementację firmy Sun (teraz Oracle). Jednak ze względu na liczne problemy (czasami nawet losowo pojawiające się błędy), zacząłem wykorzystywać bibliotekę IAIK. Teraz mogę w prosty sposób dostać się do listy kluczy publicznych (bez konieczności podawania PIN-u do karty).  Wcześniej musiałem z góry znać numer slotu (później nauczyłem się wcześniej odczytywać odpowiedni numer slotu, jednak wymagało to nie lada kombinacji).
    Jedyną wadą jest konieczność dołączania nowego jara (iaikPkcs11wrapper.jar) i biblioteki dll do systemu obsługującego karty (pkcs11wrapper.dll).

28 komentarzy:

  1. Czy udało się zdobyć enigmap11.dll dla 64 bitów ? Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. Teraz jest dll dla 64-bitów - enigmap11-x64.dll. Tylko nie wiem po co, bo i tak wiekszość przeglądarek to 32-bitowe i wymagają 32-bitowej Javy.

      Usuń
  2. Niestety nie. Ale są 2 opcje:
    1) napisać do nich może mają 64-bit bibliotekę dll
    2) kazać używać Javy 32-bit na systemie 64-bit i wrzucić (jeżeli się samo nie wrzuca podczas instalacji ich oprogramowania) bibliotekę 32-bit) enigmap1.dll do katalogu SysWow64. I tak większość przeglądarek jest 32-bit i wymaga 32-bit Javy.

    OdpowiedzUsuń
  3. udało się zdobyć wersję dla 64bit w międzyczasie podesłali odpowiednią wersję. Natomiast narazie nie udaje mi się rozwiązać problemu z podłączeniem MOBICERT. Próbowałem z cmP11.dll i cmCSP.DLL...

    OdpowiedzUsuń
  4. Z cmP11.dll nie miałem problemów.

    OdpowiedzUsuń
  5. Cześć,
    też troszkę się bawię z tematem.

    Czy mógłbyś podpowiedzieć w jaki sposób wczytywałeś numer slotu.
    Aktualnie na moje potrzeby PKCS11 działa OK. Jedyny problem (poza tym że nie wiem jak pobrać numer slotu), to fakt, że ścieżka do pliku ze sterownikiem do karty nie może zawierać nawiasu(ów). Normalnie nie ma z tym problemów, chyba że się używa Windows 7 64Bit jak ja.

    Do czasu Javy 1.7 to chyba był spory problem, aktualnie udało mi się zrobić tak, że przy pomocy funkcji systemowych winapi robię krótką scieżkę prowadzącą do sterownika i to mi zawsze działa OK (rozwiązanie z shortpath nie działało w javie 1.6).

    Wracając do slotu, aktualnie dla kart CENCERT i UNIZETO u mnie wszystko działa OK, gdy podam slotListIndex = 0 ... jedynie dla KIRu wyszło w testach że muszę podać slotListIndex = 3, ale myślę że te wartości mogą się zmieniać, stąd

    aby nie umknęło ponowię prośbę o podpowiedz w jaki sposób odczytać numer slotu.

    Z góry dzięki

    Pozdrawiam

    OdpowiedzUsuń
  6. Ze ścieżką i nawiasami też miałem problem.
    Odczytanie numeru slotu są 2 wyjścia:
    1) używać biblioteki IAIK
    2) przy wyszukiwaniu klucza publicznego zapisywać numer slotu pod który został wgrany (dot. dostawców KIR i SIGILLUM, przy reszcie po prostu nie podaję parametru slotListIndex).

    OdpowiedzUsuń
  7. Możesz napisać jak skracałeś tą ścieżkę żeby była bez nawiasów?

    OdpowiedzUsuń
  8. Dopiero zauważyłem Twój wpis ...
    Ścieżkę skracam przy pomocy natywnych funkcji WinAPI z Windows. Do winapi dostaję się korzystając z JNA.

    [code]
    public static String GetShortPathName(String path) {
    byte[] shortt = new byte[256];

    //Call CKernel32 interface to execute GetShortPathNameA method
    int a = CKernel32.INSTANCE.GetShortPathNameA(path, shortt, 256);
    String shortPath = Native.toString(shortt);
    return shortPath;

    }

    public interface CKernel32 extends Kernel32 {

    CKernel32 INSTANCE = (CKernel32) Native.loadLibrary("kernel32", CKernel32.class);

    int GetShortPathNameA(String LongName, byte[] ShortName, int BufferCount);
    }
    [/code]

    OdpowiedzUsuń
    Odpowiedzi
    1. Skracanie scieżki stosujesz dla wszystkich ścieżek do dll czy tylko dla tej z (x86)?

      Usuń
  9. Mam natomiast pytanie do Ciebie dotyczące sygillum.
    Trafiłem na problem bo mój program Javowy działał poprawnie z: Unizeto, Cencert i KIR (reszty nie miałem okazji testować). Obecnie natknąłem się na PWPW i okazało się że nie działa. Co ciekawe chodzi dokładnie na tym samym driverze co KIR, ale w przypadku KIRu zadziałało mi nie podawanie slotu i iteracja po wszystkich slotach, natomiast w przypadku PWPW to nie chce działać. Znajduje się odpowidni slot, odczytuje mi się z karty certyfikat, itd, ale po wykonaniu:
    C_Login..
    ks = KeyStore.getInstance("PKCS11");
    ks.load(null, pin);

    wywala mi się z komunikatem load failed,
    natomiast jak jawnie w configu podam slot = 3
    to działa.

    Chciałbym żeby to działało uniwersalnie, tzn bez podawania slotu, tylko żeby slot był poprawnie detektowany jak w innych kartach, ale na tę chwilę się zatrzymałem i nie wiem co z tym począć.

    OdpowiedzUsuń
  10. Z tego co wiem pwpw to jest sigillum. Ja już nie korzystam z Sunowego KeyStore.getInstance("PKCS11"), ale kod gdzieś mam i w poniedziałek napiszę jak to robiłem.

    OdpowiedzUsuń
  11. Dzięki,
    Istotnie jest to sigillum, ale najciekawsze jest to ze KIR to też sygillum, a karty KIRowskie mi chodza OK.

    OdpowiedzUsuń
  12. Może tak. Wg moje wiedzy w Polsce mamy 5-ciu dostawców: KIR, SIGILLUM, UNIZETO, MOBICERT, CENCERT.

    OdpowiedzUsuń
  13. istotnie, masz rację, napisałem nieprecyzyjnie, KIR i SIGILLUM (PWPW) używają tych samych kart, cryptotech,

    znalazłeś może ten kawałek kodu, chętnie bym zerknął

    OdpowiedzUsuń
  14. witam, czy wiesz może skąd ściągnąć ccpkip11.dll w wersji 32 i 64 bitowej

    OdpowiedzUsuń
    Odpowiedzi
    1. Należy zainstalować CryptoCard Suite i donstalować dodatek CCSuiteX64.
      Szczegóły tutaj: http://www.cryptotech.com.pl/Produkty/CryptoCard_Suite_Pobieranie,content.html

      Usuń
    2. Ten komentarz został usunięty przez autora.

      Usuń
  15. dzięki!! - podczas korzystania z certyfikatu KIR za każdym razem muszę wpisywać PIN do podpisu, czy istnieje możliwość zapamiiętania tego PINU ?? Mój kod poniżej:

    properties.setProperty("KEY_STORE_SUPPORT_PROVIDER", "IAIK");
    properties.setProperty("SLOT_ID", "3");
    properties.setProperty("SESSION_POOL_MAX_SIZE", "100");
    properties.setProperty("MULTI_THREAD_INIT", "true");
    properties.setProperty("LOGIN_KEYSTORE_SESSION_ON_DEMAND", "false");
    properties.setProperty("LOGIN_KEYSTORE_SESSION_ON_DEMAND", "false");
    properties.setProperty("PKCS11_NATIVE_MODULE", driver);

    OdpowiedzUsuń
    Odpowiedzi
    1. jestem w stanie wymusić zapamniętanie PINu - podczas podpisywania wielu dokumentów jest to dość uciążliwe

      Usuń
    2. Gdy korzystasz z obsługi katy za pomocą PKCS#11 to musisz to obsłużyć sam.

      Usuń
    3. a moge inaczej niz za pomoca pkcs#11 - potrzebna mi lista dostepnych certów od KIR plus prywatny klucz - moze masz jakis prostszy sposob??

      Usuń
    4. Można tak: http://javaczysen.blogspot.com/2012/10/sunmscapi.html

      Usuń
  16. Witam Panow,

    widze ze nie tylko ja noce spedzam na zglebianiu podpisu elektronicznego :)

    Probuje podpisac edeklaracje xml uzywajac xades4j, czy ktorys z Panow ma doswiadczenie w tym temacie?

    OdpowiedzUsuń
    Odpowiedzi
    1. Niestety nie używałem tej biblioteki. Pewnie chodzi o podpis w formacie xades-bes.

      Usuń
    2. Ten komentarz został usunięty przez autora.

      Usuń