[ anaxim @ 20.07.2010. 10:43 ] @
Posto sam promenio rad na faxu iz POS sistema (ima vec 3 prijavljena slicna) uradio bih aplikaciju za evidenciju radnika koja bi imala autentifikaciju putem smart kartica. Interesuje me kakva je podrska u Javi za smart kartice ili bih morao da koristim native pozive ka apiju sistema na kome ce se izvrsavati aplikacija. Da li bi me mogli uputiti i na literaturu ka tome kako da isporgramiram smart karticu da u njenu mamoriju upisem promenljive koje meni trebaju i slicno.
[ kernel82 @ 20.07.2010. 20:19 ] @
Jako davno sam gledao ovo, u svakom slucaju verujem da moze bar malo pomoci

http://edn.embarcadero.com/article/31915
[ anaxim @ 21.07.2010. 07:09 ] @
Hvala na odgovoru, ali na zalost to nije to. Googlajuci pronasao sam smartcardio paket i probacu njega da iskoristim. Cilj mi je da aplikacija bude multiplatformska, te zbog toga ne bih da koristim nativ pozive operativnog sistema za rad sa smart karticama. Ako neko ima prakticna iskustva zamolio bih ga da ostavi barem svoje misljenje.
[ Toxter @ 21.07.2010. 07:35 ] @
Svojevremeno sam za diplomski koristio JPCSC (IBM-ova biblioteka) koja ima port i za Windows i za Linux.
Medjutim, tu se sve radi na nivou APDU komandi. Tako da ako si raspolozen za ucenje operativnog sistema smart kartica "in-deepth" onda mogu da preporucim ovu
biblioteku jer se meni pokazala jako stabilno.
Ako pitas za JavaCard, sto je nesto sasvim drugo, onda ne mozes JPCSC iskoristiti za to.

Pozdrav
[ erno @ 02.08.2010. 20:01 ] @
Pozdrav,

imas razlicite opcije sto se tice JavaCard. Sve zavisi od toga koliko zelis investirati i sta trebas implementirati, odnosno, sta je podrucje primjene tvog softwarea. Java Cards su poprilicno skupe pa bih ti postavio nekoliko pitanja:

1. sta tvoja aplikacija treba da radi, odnosno sta je podrucje primjene tvog rjesenja?
2. koliko mozes/zelis investirati u ovu temu?

Sun nudi besplatan SDK zajdno sa emulatorom za razvoj Java Card apleta - zadnja verzija je 3.* iako zasad nema konkretne implementacije karte na trzistu (pogledaj specifikaciju i bice ti jasno ;-)). naravno, ovo ne znaci da ih nece biti uskoro. Osim toga, imas milion proizvodjaca smart cards koje vrte JC RE. Npr. ja koristim NXP JCOP 41 karte. jako dobra solucija. imas jos milion drugih rjesenja (Infineon, Cryptoflex, Gemalto itd) i sva su dobra :-) - i love java cards.

Ucenje samog API-ja ti nece puno donijeti - da budemo iskreni, ali to je najmanje sto trebas znati. Sljedeca destinacija GlobalPlatform i onda sta vec trebas raditi (vjerovatno PKI, PKCS standardi, ...). Java Card nisu za neku hajku tipa: otvori rampu da utjeram auto, prijava radnika na radno mjesto itd itd. JCs su mocna rijesenja gdje trebas PKI, digitalne signature i slicno.

Sto se tice implementacije, sam RE (=runtime environment) ili bolje reci JC SDK omogucava pisanje, a RE izvrsavanje JC apleta sa jako jako smanjenom verzijom Java API, neke tipove podataka na koje smo navikli u Javi mozes zaboraviti: double, float, String itd. na raspolaganju ti stoje npr. byte, char, short i kod nekih karti i int sto opet ovisi od procesora karte (8, 16 i u zadnje vrijeme 32 bita). Na internetu ces naci razliku izmedju Java i JC RE. Uglavnom, napises aplet (java code), prevedes pomocu konvertora u cap file i onda downloadujes cap file na svoju kartu (koristi se izraz download a ne upload) ili u emulator (ja koristim recimo cref i jako je dobar osim sto ima mali milion ogranicenja (barem verzija koju ja koristim): npr. duzina RSA kljuca), ali to je emulator-ne treba nista previse ocekvati. za download ce ti trebati ili tool od proizvodjaca karte ili GP (=global platform) rjesenje. uz SDK neces dobiti ovaj tool - koliko ja znam. recimo JCOP tool za eclipse je uzasno tesko dobiti kao firma, a sa fizickim licima po tom pitanju i ne pricaju. Jedan od nedostataka Java Card je file system - ovo bi morao sam implementirati - meni nije do sad poznata ni jedna JC sa file systemom (iako sam negdje citao da postoje i takve karte) (pogledaj recimo PKCS15 za vise informacija).

zamalo da zaboravim, card reader ti treba isto :-). ja imam Omni Key 5321 i funkcionise odlicno (contact/contactless cards).

nacin na koji komuniciras sa kartom ne mora biti APDU, ali je ovo najcesce slucaj i ako mislis ovo izbjeci nemoj ni zapocinjati rad sa JCs niti sa smart cards uopste.

ukoliko trebas neku manje sigurnu aplikaciju: prijavljivanje radnika, logiranje radnog vremena, itd itd onda mozda ne bi bilo lose da pogledas druga rjesenja tipa mifare (ovdje moram reci da su ove karte haknute vec davno, koliko su sad sigurne nemam pojma - ne radim s njima vec duze vrijeme. hack je u svakom slucaju vrijedan pomena - nevjerovatan poduhvat).

osim JCs imas jos i druga rjesenja: multos, basiccard, cardos, acos itd itd. recimo multos je jedna (ako ne i najsigurnija karta) najsigurnijih karti. ovdje u svakom slucaju trebas pisati code u C-u ili assembleru - s ovim kartama nemam iskustva, ali cu uskoro dobiti nekoliko na testiranje.

nadam se da ce ti ovo pomoci u daljnjem radu. za ostalo pisi ovdje (draze mi je ovdje jer moda i drugi mogu nesto skontati a i ja isto tako ako neko ima iskustva sa drugima kartama) ili pm iako nemam bas puno vremena za citanje foruma, al ova tema je uvijek interesantna ;-) a isto tako drago mi je ako mogu pomoci.

pozzzz
[ boske3 @ 03.08.2010. 08:31 ] @
Pozdrav !

Ne znam koliko ce ti biti od pomoci ali bi trebao da pretrazis malo po bibliotekama
fakulteta za pocetak , ne znam na kojem si faksu i u kjem gradu zivis ali
evo ti novosadska biblioteka

http://biblioteka.ftn.uns.ac.rs/index.jsp

pa ukucaj java card

Ja sam radio diplomski davne 2004 na tu temu kada je sve tek pocinjalo
pa ti ne bi bilo lose da pogledas taj diplomski.

Jos nesto jako bitno , ne znam koji IDE koristis za programiranje u javi
ali obaveyno pogledaj NetBeans 6.9 skini ga i instliraj , jer on u
sebi ima vec ugradjen JavaCard SDK 3.02 i umnogome ce ti pomoci da krenes od necega

Evo ti i jedan tutorial za NetBeans i JavaCard

http://netbeans.org/kb/docs/javame/java-card.html

Pokusaj pa nadam se da ce ti pomoci ,i sam znam
kako je bilo da se od nicega napravi nesto pogotovo ako si bio prvi
tj. pionir u tome :)

Pozd
[ erno @ 03.08.2010. 16:49 ] @
hvala boske za dopunu ;-). za eclipse imas isto tako plug-in. ali ni sa jednim od ova dva alata neces moci downloadovati aplete na pravu kartu (ako se dobro sjecam, ne koristim ih vec duze). GPShell mozes recimo koristiti za download apleta na kartu - i trealo bi da radi sa svim kartama koje implementiraju GP specifikaciju - uglavnom sve.

sto se tice literature: Rankl/Effing nezaobilazno ako te tema smart cards zanima bas ekstremno. rankl ima i drugih radova na temu smart cards sa fokusom na Java Cards. inace za pocetak: Z. Chen (iako imas pola smeca unutra sa OCF-om (OpenCard Framework)), Smart Card Application Development Using Java (ima vise izdanja, ovdjetakodje imas smeca za OCF).

jos jednu stvar sam zaboravio sinoc: podrska za API se razlikuje od proizvodjaca do proizvodjaca tako da recimo duzina RSA kljuceva u specifikaciji (ili cak podrska za algoritam RSA/ECC) nece biti podrzana na svim karticama. ja sam imao problem npr. sa svojim apletom kojeg sam implementirao (JC specifikaciji 2.2.1) i na karti koja implementira 2.2.1 specifikaciju, a recimo upravo duzina kljuca nije bila podrzana. ima jos nekih primjera. znaci moraces skontati s kojom kartom hoces da radis i tek onda zapoceti posao. za pocetak SDK instalirati, eclipse ili kako boske rece NB, i cref ce biti dovoljan. tema je super interesantna tako da ako volis razvoj software, sigurnost brzo ces se ufurati u shemu ;-)

moj savjet jos: mani se 3.* jer nema ni jedne kartice trenutno na trzistu a da implementira ovu specifikaciju. kad se pojave bice interesantno (a i skupo), ali do tad pucaj 2.2.2.

@boske: moram te ispraviti u jednom: JC su puno starije od 2004 ;-)

pozzzz
[ ghost in the shell @ 03.08.2010. 17:45 ] @
Vidim da ovde ima ljudi koji zapravo znaju nesto o java karticama, pa reko da pitam dal mi neko moze pomoci oko instaliranja appleta na karticu. Kartica je gemalto top gx4.

Preko NetBeansa sam pokusao da instaliram cap fajl koji sam dobio kao primer uz GPShell, kao i primere koje sam dobio uz JCDK 2.2.1. Izlaz je manje vise identican (puca na istom mestu):
Code:

command: 00 A4 04 00 08 A0 00 00 00 18 43 4D 00 [SELECT]
>response: 6F 19 84 08 A0 00 00 00 18 43 4D 00 A5 0D 9F 6E 06 12 91 60 95 05 00 9F 65 01 FF
>90 00 [SW OK]


command: 80 50 00 00 08 7F 4A 46 0E 66 BC BE 63 [INITIALIZE UPDATE]
>response: 4D 00 93 48 01 09 51 6A 19 73 01 01 E5 B1 67 90 D0 D3 87 3E 3A CE C6 6A 21 C1 49 4E
>90 00 [SW OK]


command: 84 82 00 00 10 45 62 70 CA 00 85 12 FE 32 DF 46 C4 EB 08 E6 D5 [EXTERNAL AUTH]
>90 00 [SW OK]


command: 80 E6 02 00 1C 09 A0 00 00 00 62 03 01 0C 01 08 A0 00 00 00 18 43 4D 00 00 06 EF 04 C6 02 01 A8 00 [INSTALL]
>response: 00
>90 00 [SW OK]


command: 00 A4 04 00 08 A0 00 00 00 18 43 4D 00 [SELECT]
>response: 6F 19 84 08 A0 00 00 00 18 43 4D 00 A5 0D 9F 6E 06 12 91 60 95 05 00 9F 65 01 FF
>90 00 [SW OK]


command: 80 50 00 00 08 00 37 A1 54 86 55 49 03 [INITIALIZE UPDATE]
>response: 4D 00 93 48 01 09 51 6A 19 73 01 01 A8 BF 0C 5B 82 FB 5A E9 A7 66 A5 C1 AC 1B E4 E6
>90 00 [SW OK]


command: 84 82 00 00 10 82 C8 A6 F5 2D B6 84 BF E3 45 CD 17 51 6F 4F 16 [EXTERNAL AUTH]
>90 00 [SW OK]


command: 80 E8 00 00 EF C4 82 01 9B 01 00 13 DE CA FF ED 01 02 04 00 01 09 A0 00 00 00 62 
03 01 0C 01 02 00 1F 00 13 00 1F 00 0E 00 0B 00 36 00 0C 00 67 00 0A 00 13 00 00 00 6C 00 
00 00 00 00 00 01 01 00 04 00 0B 01 00 01 07 A0 00 00 00 62 01 01 03 00 0E 01 0A A0 00 00 
00 62 03 01 0C 01 01 00 14 06 00 0C 00 80 03 01 00 01 07 01 00 00 00 1F 07 00 67 00 02 10 
18 8C 00 01 18 11 01 00 90 0B 87 00 18 8B 00 02 7A 02 30 8F 00 03 3D 8C 00 04 3B 7A 05 23 
19 8B 00 05 2D 19 8B 00 06 32 03 29 04 70 19 1A 08 AD 00 16 04 1F 8D 00 0B 3B 16 04 1F 41 
29 04 19 08 8B 00 0C 32 1F 64 E8 19 8B 00 07 3B 19 16 04 08 41 8B 00 08 19 03 08 8B 00 09 
19 AD 00 03 16 04 8B 00 0A 7A 08 00 0A 00 00 00 00 00 00 00 00 00 00 05 00 36 00 0D 02 00 
00 00 06 80 03 00 03 [LOAD]
>69 85 [SW ERROR_CONDITIONS_NOT_SATISFIED]


A kad koristim GPShell (1.4.2) dobijam ovo:
Code:

PS C:\GPShell-1.4.2> GPShell.exe helloInstall.txt
enable_trace
establish_context
card_connect
* reader name Gemplus USB Smart Card Reader 0
select -AID a0000000030000
Command --> 00A4040007A0000000030000
Wrapped command --> 00A4040007A0000000030000
Response <-- 6A82
select_application() returns 0x80216A82 (6A82: The application to be selected could not be found.)


Zakucan sam na instalaciji vec nekoliko dana i jako bih cenio svaku pomoc. Totalni sam nub u svetu smart kartica pa ako sam se izlupetao budite nezni :P
[ erno @ 03.08.2010. 19:33 ] @
Mozes li postati svoj aplet ili barem reci sta radi? greska obicno nastaje kad imas identican applet i package ID. kako vec rekoh u jednom od svojih postova svaki proizvodjac ima svoju implementaciju specifikacije tako da gresku mozes dobiti i zbog sljedecih razloga:

- ne odgovarajuci parametri kod generisanja RSA/ECC kljuceva (duzina kljuca nije podrzana)
- algoritam (crypto, dig.sig.) koji koristis nije podrzan

ne znam kakav imas aplet, ali pokusaj implementirati samo one required metode: install, register, process (bez logike)... ako uspijes, onda odkomentiraj dio po dio coda i downloaduj na karticu. GPShell je malo zeznut al kad se nema alternative...

javi kako napreduje ;-)

ah da... jesi ti integrirao GPShell u NB ili? ne kuzim kako pokusavas downloadovati aplet na "karticu". ne koristim NB al koliko se sjecam imas mogucnost da koristis JC SDK, ali ne i da downloadujes aplet na kartu. ovdje je moguce da grijesim - molim da me neko ispravi ako nisam u pravu.

donju gresku dobijes kralju jer nemas download-ovan s tvojim AID-om na karti - nisi downladovao aplet na kartu. koristi GPShell da downloadujes cap file na karticu i onda pokusaj select raditi ;-).

moj savjet onima koji se zele baviti ovim igrackama: programiranje JC nije ono na sta su ljudi obicno navikli kod Jave -> stvarno trebas paziti na detalje jer te svaki moze kostati zivaca, vremena, love. znaci, malo truda se mora uloziti u ovu temu. koliko ce se isplatiti to je uvijek pitanje.

pozzzz
[ ghost in the shell @ 04.08.2010. 00:11 ] @
U pitanju je najbudjaviji HelloWorld, koji uzgred nisam ja ni pisao, bas da ne bih motao po glavi dal je kod los ili sta.

Code:

/*
* Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/

// /*
// Workfile:@(#)HelloWorld.java    1.6
// Version:1.6
// Date:06/06/03
//
// Archive:  /Products/Europa/samples/com/sun/javacard/samples/HelloWorld/HelloWorld.java
// Modified:06/06/03 17:05:59
// Original author:  Mitch Butler
// */

package com.sun.javacard.samples.HelloWorld;

import javacard.framework.*;

/**
*/

public class HelloWorld extends Applet
{
    private byte[] echoBytes;
    private static final short LENGTH_ECHO_BYTES = 256;

    /**
    * Only this class's install method should create the applet object.
    */
    protected HelloWorld()
    {
       echoBytes = new byte[LENGTH_ECHO_BYTES];
       register();
    }

    /**
    * Installs this applet.
    * @param bArray the array containing installation parameters
    * @param bOffset the starting offset in bArray
    * @param bLength the length in bytes of the parameter data in bArray
    */
    public static void install(byte[] bArray, short bOffset, byte bLength)
    {
       new HelloWorld();
    }

    /**
    * Processes an incoming APDU.
    * @see APDU
    * @param apdu the incoming APDU
    * @exception ISOException with the response bytes per ISO 7816-4
    */
    public void process(APDU apdu)
    {
       byte buffer[] = apdu.getBuffer();

       short bytesRead = apdu.setIncomingAndReceive();
       short echoOffset = (short)0;

       while ( bytesRead > 0 ) {
           Util.arrayCopyNonAtomic(buffer, ISO7816.OFFSET_CDATA, echoBytes, echoOffset, bytesRead);
           echoOffset += bytesRead;
           bytesRead = apdu.receiveBytes(ISO7816.OFFSET_CDATA);
       }

       apdu.setOutgoing();
       apdu.setOutgoingLength( (short) (echoOffset + 5) );

       // echo header
       apdu.sendBytes( (short)0, (short) 5);
       // echo data
       apdu.sendBytesLong( echoBytes, (short) 0, echoOffset );
    }

}


Ocigledno se nisam dovoljno precizno izrazio kad sam rekao "downloadujem applet". Mislio sam na cap fajl, naravno. NB ima ovaj plugin: Java Card Manager, hteo sam ga linkovati u prvoj poruci al iz nekog razloga nisam mogao da otvorim plugin portal na njihovom sajtu.

GPShell izvrsava ovu skriptu za instalaciju HelloWorld.cap:
Code:

enable_trace
establish_context
card_connect
select -AID a0000000030000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f // Open secure channel
delete -AID a00000006203010c0101
delete -AID a00000006203010c01
delete -AID a00000006203010c0101
install -file HelloWorld.cap -nvDataLimit 500 -instParam 00 -priv 2
# getdata
# close_sc // Close secure channel
# putkey // Put key
 // options:
 //          -keyind Key index
 //          -keyver Key version
 //          -key Key value in hex
card_disconnect
release_context


Sad sam izvrsavao liniju po liniju, prvo puca ovde: select -AID a0000000030000
Ali cak i kad sam to preskocio, nece da izvrsi: install -file HelloWorld.cap -nvDataLimit 500 -instParam 00 -priv 2

Gledao sam manifest cap fajla, AID aplikacije i paketa se razlikuju.
Da li mogu nekako da preskocim svu tu zajebanciju sa otvaranjem sigurnog kanala prema kartici i lepo metnem stvar kakva jeste?
Da li molim te mozes da mi kazes (po mogucstvu u retard-frendli-korak-po-korak formi XD) sta da uradim sa GPShellom da bih ubacio cap na karticu?
[ anaxim @ 04.08.2010. 07:47 ] @
Hvala na objasnjenjima. Nisam par dana bio na ES pa nisam odgovarao. Odlucio sam se za kombinaciju omnkikey readera i neke memorijske smart kartice, dakle jeftine kombinacija. Aplikacija ce biti bas za evidenciju radnika (klasika).
[ erno @ 04.08.2010. 17:46 ] @
@ghost: -aid karte koju ti imas nije isti sa onim s kojim pravis select -> visa.openplatform. prepravi sljedece i pokusaj ponovo:

select -AID A0000000030000

u

select -AID A000000018434D.

sto se tice samog GPShella imas nekoliko tutoriala a imas i samples koji dodju sa binary tako da mozes skontati kako otprilike funka. preskaces stepenice a to ne valja kralju moj. uzmi instaliraj SDK i vjezbaj na crefu ili jcwde. malo ces skontati kako to funkcionise i onda pokusaj kralju downloadovati aplet na real card.

@anaxim: mifare nisu lose ja sam dobio 3 komada 1k sa readerom, RFID interface, jako jednostavne za koristenje. ako ti bude trebalo pomoci pucaj. samo sto su haknute (potrazi hack na youtube - kraljevski hack nema sta).
[ ghost in the shell @ 06.08.2010. 13:29 ] @
Ahaha kolko si me krunisao ima da dobijem kompleks vise vrednosti :P Nasao sam skriptu za download na moju karticu (nikad ne bi rekao - dosla uz gpshell :P). Hvala na pomoci :)
[ comsi @ 09.12.2011. 12:16 ] @
Može li mi neko pomoći,

hoću da pročitam ATR sa smart kartice kako bih saznao podatke o čipu (tip, proizvođač...).
Kada pozovem funkciju ATR.getATR() dobijam povratnu vrednostu u nečitljivom fomatu. tipa: [B@e83912

evo mog koda:

CardTerminal citacKartica = citaciKartica.get(brojCitaca);
Card kartica = citacKartica.connect("*");
ATR atr = kartica.getATR();


System.out.println(atr.getBytes());


Zanima me kako da dekodiram ovu vrednost koju mi vraća i da dobijem nešto čitljivo??

Hvala.
[ Dejan Lozanovic @ 09.12.2011. 12:39 ] @
http://www.elitesecurity.org/t...c-elektronske-licne-karte-Javi

pogledaj od gorana source on je isti paket koristio ako se ne varam.
[ bantu @ 09.12.2011. 14:28 ] @
Code:
System.out.println(new String(atr.getBytes()));
[ erno @ 14.01.2012. 10:44 ] @
Nakon toliko vremena opet na ES-u :-)

ATR kako si i sam rekao sadrzi (direktno ili indirektno) podatke o karti. koliko znam ne mozes direktno iz byte[] responsa iscitati sve podatke (u, za covjeka, citljivom obliku). na internetu sam vidio bibilioteke sa nekoliko stotina karti gdje mozes traziti svoj ATR (napisi neki parser) i tako naci informacije o karti koju imas (proizvodjac/model (npr. NXP/JCOP41).

pozzzz

p.s. koja vrtsa karte se koristi u Srbiji za licne karte? JavaCard? sta su mogucnosti tih karti? programirao sam svoj id-dokument (authentication/digital signatures bazirano naravno na PKI) pa me zanima kako je to u Srbiji rjeseno... thnx
[ jovan1982 @ 22.06.2012. 09:57 ] @
Vidimo da je stari post ali zanima me da li neko ima iskustva u pisanju web appleta za rad sa smart karticama koji bi mi omogucio logovanje na web aplikaciju,kao i potpisivanje pdf dokumenta od strane veceg broja korisnika(dve funkcionalnost u dva odvojena apleta ).Web aplet mora biti potpisan kako bi se omogucio pristum fajlovima na klijentu.
[ ivan.mojsilovic @ 22.06.2012. 11:15 ] @
Zavisi koliko brzo ti aplet treba i koje OS zelis da podrzis.

Najbrzi nacin je ako radis za Win OS tako sto ces preko apleta citati iz Windows Store sertifikate i onda preko postojeceg middleware-a pristupiti kartici.

Tako sam ja radio za ono sto mi je trebalo jer su mi svi korisnici na Windoze.

Logovanje takodje, kad od middleware-a dobijes potvrdu i serijski broj kartice, na osnovu toga pustas ili odbijas korisnika da se uloguje.
Deo oko potpisivanja je malo komplikovaniji jer moras da uradis jos neke stvari.
[ jovan1982 @ 24.06.2012. 23:59 ] @
Pa korisnici mogu da budu bukvalno svi,linux,windows.Treba mi za nekih do 30 dana.Gledao sam sam neka resenja.Php tcpdf biblioteka ima mogucnost da implementira PDF potpis.Imam vec generisani pdf na serveru i isti preko web-a trebaju da potpisuju
korisnici,njih od 2-oje do 60-oro.Kapiram da to moram da radim preko web applet-a koji je potpisan,i mozda u kombinaciji sa javascript-php da menjam kreirani pdf na serveru.Sa pametnim karticama nemam iskustva,ali me cudi da koliko ima radnji,kafica,terminala gde se radnici prijavljuju kada dodju na posao da na web-u nema malo vise primera.Imam i drugu losiju varijantu da omogucim korisnicima da downloaduju pdf ,da ga potpisu preko JSignPdf ili nekog drugog programa i da ga opet uploadjuju,uz to da upload i download imaju ograniceno vreme ,da je fajl zakljucan za druge korisnike u medjuvremenu i da ukoliko korisnik ne uploaduje potpisani fajl u odredjenom periodu(3 min) da on biva nevazeci-jako komplikovano za korisnika.
Ono sto najkrace treba jeste applet u vidu dugmeta gde ce pisati-Potpisi,ako nije ubacena smart kartica da kaze -Ubaci karticu,-Unesi Pin,i na kraju -Uspesno potpisano.Pdf ne mora ni da mu se otvara.
[ ivan.mojsilovic @ 25.06.2012. 09:37 ] @
Bice gusto :)

Mi nismo radili sa direktnim citanjem sa kartice (nemamo linux i mac korisnike kojima je potpis trebao) vec samo sa windows OS.

Koristili smo biblioteku iText za samo potpisivanje. Bikvalno nas aplet zatrazi listu sertifikata od windows-a, prikaze listu u combo box-u, user izabere sertifikat kojim zeli da potpise dokument, unese pin i to je to.

Ne mora da otvara PDF da bi ga potpisao.

E sad ako treba da cackas direkt na kartici mozes i to i kod nekih tipova karitca (java card) imas lep API i nije tesko, ali kod onih kod kojih to nemas imaces dosta zezanja.
[ jovan1982 @ 25.06.2012. 18:16 ] @
Nasao sam ovo na netu mozda moze da pomogne deluje jako zanimljivo [url=http://www.springcard.com/blog/2010/java-pcsc-accessing-smartcards-from-a-web-page/][/url]
[ jovan1982 @ 26.06.2012. 00:09 ] @
Po svemu sudeci sve ce se zavrsiti na potpisivanju na strani klijenta preko pdftcp bibiloteke koja umece mesta za potpis i kasnijim uploadom istog na server,ako neko zna kako bih mogao da potisujem na strani servera bio bih jako zahvalan ...
[ jovan1982 @ 26.06.2012. 12:36 ] @
A jel ti dokument ostaje na serveru ili mora da se uploaduje kada ga potpisujes preko itext-a i appleta...Posto
je meni potrebno da jedan isti dokument potpise veci broj korisnika,naravno bez promena na samom dokumentu kako bi potpisi bili validni.Gledam da izbegnem upload fajla,kako se ne bi desilo da neko gazi fajl koji su drugi vec potpisali.Jedno od resenja koje razmartam je i da preko php tcpdf biblioteke generisem pdf koji ima mesta za
potpise i gde pdf sadrzi javascript koji bi iz browsera preko javascript-a i ajax-a probao da uploadujem na
klik u formi pdf-a,ako je to uopste moguce.


[Ovu poruku je menjao jovan1982 dana 26.06.2012. u 14:50 GMT+1]

[Ovu poruku je menjao jovan1982 dana 26.06.2012. u 14:50 GMT+1]
[ ivan.mojsilovic @ 26.06.2012. 14:34 ] @
Evo kako to radi kod nas. Ulogujes se na aplikaciju, kliknis potpisi dokument, aplet se otvori, svuce dokument, potpise dokument, uploaduje ga nazad ili kao nov dokument ili doda novu verziju (imas checkbox da izaberes u apletu).

Dokument moze da potpise neogranicen broj korisnika (testirali do 20, mrzelo nas vise :) ).

Ako neko uzme pa promeni dokument jbg njegov problem, cim ga neko otvori kukace da nije validan tako da tu ne mozemo da uticemo. Onaj kome je to bitno da se ne desi, koristi workflow-ve gde ni ne moze da promeni dokument, vec samo da ga potpise.

[ jovan1982 @ 26.06.2012. 15:03 ] @
Ok ,meni bi bas trebalo tako nesto .Jel mozes da ponudis neki kod ,uputstvo.Das neki tutorial.
[ ivan.mojsilovic @ 26.06.2012. 15:07 ] @
A koji server koristis za to? Neki open soource DMS ili nesto svoje?
[ jovan1982 @ 26.06.2012. 15:18 ] @
Apache ,php ,Bluehost, u pitanju je pdf dokument koji se potpisuje...Dokument se generise preko php-pear-a.U pitanju je php aplikacija koja za korisnike generise pdf dokumente-kompenzacione izjave koje moraju biti potpisane od strane korisnika.Nakon sto se svi usaglase snima se pdf na serveru ,tako da se od tog momenta novi ne generise nego se otvara snimljeni,ali koji sada mora da se potpisuje.Imam nekoliko resenja za to najgora sa download-om ,malo bolja sa otvaranjem pdf-a na php stranici sa pdf dugmetom koje poziva ajax-php i snima isti na serveru,bolja varijanta sa potpisanim apletom(kao kod vas),a najbolja-potpisivanje na serveru...
Sve u svemu,nesto svoje...

[Ovu poruku je menjao jovan1982 dana 26.06.2012. u 16:34 GMT+1]

[Ovu poruku je menjao jovan1982 dana 26.06.2012. u 17:14 GMT+1]

[Ovu poruku je menjao jovan1982 dana 26.06.2012. u 17:47 GMT+1]
[ jovan1982 @ 07.07.2012. 13:10 ] @
Zdravo!
Pisem desktop aplikaciju(koju cu po uspesnom zavrsetku da konvertujem u web aplet) za potpisivanje pdf-a koristeci itext biblioteku.

Evo koda
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package javapotpisivanje7;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.security.PdfPKCS7;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.*;
import java.security.cert.CertificateException;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.HashMap;
import javax.security.cert.X509Certificate;
/**
*
* @author Jovo
*/
public class JavaPotpisivanje7 {

/**
* @param args the command line arguments
*/
public static void main(String[] args) throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, DocumentException, SignatureException, InvalidKeyException, NoSuchProviderException {

KeyStore ks = KeyStore.getInstance("Windows-MY");

ks.load(null, null) ;

//deo koji dodajem



//dodajem
Enumeration en = ks.aliases() ;

String alias = (String)ks.aliases().nextElement();
PrivateKey key = (PrivateKey)ks.getKey(alias, "password".toCharArray());
java.security.cert.Certificate[] chain = ks.getCertificateChain(alias);

PdfReader reader = new PdfReader("Za Potpis.pdf");
FileOutputStream fout = new FileOutputStream("signed.pdf");
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0',null,true);
PdfSignatureAppearance sap = stp.getSignatureAppearance();

sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
sap.setLayer2Text("Ovde ce da bude potpis.\n\nDate: some date");
Calendar cal = Calendar.getInstance();
PdfDictionary dic = new PdfDictionary();
dic.put(PdfName.FT, PdfName.SIG);
dic.put(PdfName.FILTER, new PdfName("SAFE.PPKSF"));
dic.put(PdfName.SUBFILTER, new PdfName("adbe.pkcs7.detached"));
dic.put(PdfName.M, new PdfDate(cal));
//dic.put(PdfName.NAME, new PdfString(PdfPKCS7.getSubjectFields((X509Certificate)chain[0]).getField("CN")));

sap.setCryptoDictionary(dic);
HashMap exc = new HashMap();
exc.put(PdfName.CONTENTS, new Integer(0x2502));
sap.preClose(exc);

//PdfPKCS7 pk7 = new PdfPKCS7(key, chain, null, "SHA1", null, false);

//PdfPKCS7 pk7 = new PdfPKCS7(key, chain, null, "SHA1", null, false);
//PdfPKCS7 pk7 = new PdfPKCS7(null, chain, null, "SHA1", true);
//PdfPKCS7 pk7 = new PdfPKCS7(key, chain, null, "SHA1", null, false);

//dodajem
//PdfPKCS7 pk7 = new PdfPKCS7(key, chain, alias, alias, true);

PdfPKCS7 pk7 = new PdfPKCS7(key, chain, "SHA1", null, false);

//dodajem
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
byte buf[] = new byte[8192];
int n;
InputStream inp = sap.getRangeStream();
while ((n = inp.read(buf)) > 0) {
messageDigest.update(buf, 0, n);
}
byte hash[] = messageDigest.digest();
byte sh[] = pk7.getAuthenticatedAttributeBytes(hash, cal, hash, null, true);
pk7.update(sh, 0, sh.length);

PdfDictionary dic2 = new PdfDictionary();
byte sg[] = pk7.getEncodedPKCS7(hash, cal);
byte out[] = new byte[0x2500 / 2];
System.arraycopy(sg, 0, out, 0, sg.length);
dic2.put(PdfName.CONTENTS, new PdfString(out).setHexWriting(true));
sap.close(dic2);
}
}

SVE U SVEMU,PO POKRETANJU APLIKACIJE KREIRA SE NOVO POLJE ALI SE NE POTPISE-POZOVE SE I KARTICA I TRAZI SE PIN BROJ.
dic.put(PdfName.NAME, new PdfString(PdfPKCS7.getSubjectFields((X509Certificate)chain[0]).getField("CN")));//OVAJ DEO MI PRAVI PROBLEME
PRETPOSTAVLJAM DA DEO KOJI PRAVI PROBLEME KOJI JE U OVOM MOMENTU POD // GDE BI TREBALO DA SE POZIVA SAMO POLJE
KADA SE SKINE KOMENTAR PRIJAVLJUJE SE GRESKA.
U DELU
KeyStore ks = KeyStore.getInstance("Windows-MY");

ks.load(null, null) ;
TAKODJE MOZE BITI PROBLEM...

AKO NEKO ZNA ZASTO I KAKO DA RESIM OVAJ PROBLEM BILO BI SUPER.
ZANIMA ME DA LI SAM NA DOBROM PUTU.


[Ovu poruku je menjao jovan1982 dana 07.07.2012. u 15:33 GMT+1]

[Ovu poruku je menjao jovan1982 dana 07.07.2012. u 16:15 GMT+1]

[Ovu poruku je menjao jovan1982 dana 07.07.2012. u 16:16 GMT+1]