Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Podpisanie maila podpisem kwalifikowanym - potrzebni testerzy z kartami UNIZETO i KIR

1,251 views
Skip to first unread message

proko...@gmail.com

unread,
Sep 19, 2008, 5:34:11 PM9/19/08
to
Witam serdecznie,

Jako, ze praca wymusila na mnie posiadanie certyfikatu
kwalifikowanego, chcialem go wykorzystac piszac oficjalnego maila do
mojej gminy... no i dowiedzialem sie, ze nie ma mozliwosci podpisania
certyfikatem kwalifikowanym wiadomosci e-mail. Maly research "why"? Bo
sprzedawcy tego "kwalifikowanego" podpisu w ten sposob robia sobie
rynek na zakup dodatkowo "komercyjnego" certyfikatu do maili. No bo
mozliwosc zalaczenia wydruku z dowolnego programu do maila i
opatrzenia takiego maila podpisem kwalifikowanym odsylalaby do lamusa
te wszystkie e-faktury i e-skrzynki podawcze... Outlooka w systemie
kazdy ma (chce czy nie chce) i potrafi on podpis elektroniczny
zweryfikowac trzy razy lepiej niz "kwalifikowane" oprogramowanie. Ale
nie o tym.

Pogrzebalem nieco i popelnilem aplet, ktory wysyla maile podpisane
podpisem kwalifikowanym. (jednak sie da pomimo zapewnien na stronach
producentow ze nie ma takiej mozliwosci). Co wiecej wszystko zrobione
w czystej Javie bez zadnego "hakowania" i na open sourcach z
wykorzystaniem biblioteki PKCS#11 dolaczonej do zestawu z karta.

Mi dziala to super z karta Sigillum - wysylam maile SMIME podpisane
kwalifikowanym podpisem. Prosilbym osoby posiadające karty KIR i
UNIZETO o sprawdzenie czy z ich kartami aplikacja zadziala. Aplikacja
(a raczej aplet) bedzie oczywiście całkiem for free udostępniona.

Link do aplikacji do testowania:
http://java.bart.prokop.name/smail/

Mikolaj Rydzewski

unread,
Sep 22, 2008, 4:37:42 AM9/22/08
to
proko...@gmail.com wrote:

> Jako, ze praca wymusila na mnie posiadanie certyfikatu
> kwalifikowanego, chcialem go wykorzystac piszac oficjalnego maila do
> mojej gminy... no i dowiedzialem sie, ze nie ma mozliwosci podpisania
> certyfikatem kwalifikowanym wiadomosci e-mail. Maly research "why"? Bo
> sprzedawcy tego "kwalifikowanego" podpisu w ten sposob robia sobie
> rynek na zakup dodatkowo "komercyjnego" certyfikatu do maili.

Napisz cos wiecej o tym czego 'nie mozna' i dlaczego. Czy ten
kwalifikowany certyfikat to nie jest po prostu plik w odpowiednim
formacie PK-cos-tam ktory mozna zaimportowac do Thunderbirda, Outlooka,
uzyc za pomoca openssl, itd? Jak to dziala i dlaczego jest zle?

proko...@gmail.com

unread,
Sep 23, 2008, 4:12:20 AM9/23/08
to
On Sep 22, 10:37 am, Mikolaj Rydzewski <m...@ceti.pl> wrote:
> Napisz cos wiecej o tym czego 'nie mozna' i dlaczego. Czy ten
> kwalifikowany certyfikat to nie jest po prostu plik w odpowiednim
> formacie PK-cos-tam ktory mozna zaimportowac do Thunderbirda, Outlooka,
> uzyc za pomoca openssl, itd? Jak to dziala i dlaczego jest zle?
Nie!!! certyfikak kwalifikowany, to zgodnie z ustawa o podpisie
elektronicznym:
- wydawany jest przez jedno z centrum kwalifikacji (obecnie dzialaja
3)
- jest zapisany wylacznie na karcie kryptograficznej (nie otrzyma sie
go w postaci pliku; w pliku co najwyzej mozna dostac tzw. certyfikat
komercyjny, ktory nie jest prawnie wiazacy)
- podpisanie dokumentu certyfikatem kwalifikowanym ma prawnie sile
podpisu wlasnorecznego

Z roznych DZIWNYCH wzgledow (prywatnie mysle ze chodzi o kase, jak
zawsze), firmy oferujace podpisy kwalifikowane ustawiaja takie
atrybuty certyfikatow, ze z Outlooka NIE DA sie uzyc certyfikatu
kwalifikowanego do podpisywania maili. Od biedy udalo mi sie
kwalifikowanym podpisac dokument WORD (tylko w wersji 2007). Dla mnie
natomiast byloby bardzo wygodnie np. wysylac faktury czy pisma e-
mailem podpisanym cyfrowo. Umowmy sie, ze obecnie Outlook jest chyba
jednym z najbardziej rozpowszechnionych programow ktore umozliwiaja
weryfikacje podpisu elektronicznego. Przede wszystkim chodzi o to, ze
Outlook potrafi zweryfikowac podpis "prosto z pudelka" - bez
koniecznosci instalacji roznych wynalazkow.

Poniewaz udalo mi sie z uzyciem czystej Javy napisac klienta SMTP,
ktory potrafi uzywajac czystej JAVY dobrac sie do podpisu
kwalifikowanego na karcie Sigillum i podpisac maila, chcialbym to
wytestowac przy uzyciu kart UNIZETO i KIR, stad moj post. Czy sa na
grupie osoby chetne do testow, ktore posiadaja certyfikat?

Mikolaj Rydzewski

unread,
Sep 23, 2008, 5:06:47 AM9/23/08
to
proko...@gmail.com wrote:
> Z roznych DZIWNYCH wzgledow (prywatnie mysle ze chodzi o kase, jak
> zawsze), firmy oferujace podpisy kwalifikowane ustawiaja takie
> atrybuty certyfikatow, ze z Outlooka NIE DA sie uzyc certyfikatu
> kwalifikowanego do podpisywania maili. Od biedy udalo mi sie
> kwalifikowanym podpisac dokument WORD (tylko w wersji 2007). Dla mnie
> natomiast byloby bardzo wygodnie np. wysylac faktury czy pisma e-
> mailem podpisanym cyfrowo. Umowmy sie, ze obecnie Outlook jest chyba
> jednym z najbardziej rozpowszechnionych programow ktore umozliwiaja
> weryfikacje podpisu elektronicznego. Przede wszystkim chodzi o to, ze
> Outlook potrafi zweryfikowac podpis "prosto z pudelka" - bez
> koniecznosci instalacji roznych wynalazkow.

Dzieki za wyjasnienie. Jak rozumiem, do podpisywania plikow, wysylania
maili, itd. sluza jakies ichniejsze programy-potworki? Jak jest z
uzywaniem tego nie w windowsach?

proko...@gmail.com

unread,
Sep 23, 2008, 7:50:49 AM9/23/08
to
> Dzieki za wyjasnienie. Jak rozumiem, do podpisywania plikow, wysylania
> maili, itd. sluza jakies ichniejsze programy-potworki? Jak jest z
> uzywaniem tego nie w windowsach?
Tak, wymyslono np. format SDOC, bedacy zrzutem do jakiegos spakowanego
archiwum bitmapy będącej wydrukiem z worda... i hash wyciagniety z
tych bitmap jest podpisywany kluczem prywatnym zapisanym w karcie.

Poza Windowsami... zero obslugi. Rozwiazaniem byloby udostepnienie
biblioteki PKCS#11 dla systemow innych niz Windows. Ja ogolnie
wszystkie operacja na tym robie w czystej Javie bez wspomagania sie
zadnym JINI, wiec kwestia dobrej woli dostawcow, zeby np. dali pliki
*.so. Ale raczej nie ma co na to liczyc. Widze, ze tworzony jest na
sile rynek zamknietego rozwiazania - przyklad wykluczenie uzywania
podpisu kwalifikowanego do podpisywania maili. Smieszne - dokument
worda moge podpisac "programem potworkiem" i wyslac jako zalaczniki do
maila - ok, ale samego maila nie wolno mi podpisac. Podpisy
kwalifikowane sa zwyklymi podpisami RSA o dlugosci 1024 bit, do tego
jest nakladany certyfikat wydany przez jedna z tych 3 firm.
Kwalifikowany oznacza, ze jedna z tych 3 firm mnie obejrzala i
skopiowala moj dowod osobisty a klucz RSA wgrali mi na karte i karte
mi wreczyli. Klucza z karty oczywiscie nie da sie wyjac (karta dostaje
hash i go podpisuje). Co wiecej nie ma zwyczaju ktory powinien byc
wprowadzony, ze klucz generuje ja sobie sam, a centrum prosze tylko o
certyfikat dla klucza publicznego. Ale nie... zapewne firma z
namaszczenia panstwowego jest na tyle zaufana, ze mozna jej zaufac i
powierzyc wygenerowanie klucza prywatnego :)

Tymoteusz

unread,
Sep 24, 2008, 9:54:59 AM9/24/08
to

Skoro korzystać z javy i nie napisałes własnego provider'a to pewnie
używaż dostarczonego przez sun' a PKCS#11 gdzie podpinasz plik ze
sterownikiem PKCS11 udostępnionym przez producenta karty. Jesli tak to
ja również tworzyłem taki aplet korzystając z karty KIR'u i dostawcy
CryptoTech'u i jeśli chodzi o działanie samego podpisywania i
walidacje to nie ma żadnych problemów. Natomiast jeśli chciałbyś
rozbudować aplet o np. zapis, uzuwanie certyfikatów z karty
(oczywiśnie nie kwalifikowanych) lub np. o dobrą obsługę zdarzeń
związanych z karta (wyjęcie karty, zły pin itd.) to PKCS11 dostarczony
przez sun jest tragicznym rozwiązaniem. Nie ma zadnych funckji
związanych ze zdarzeniami zapis certyfikatu nie działa poprawnie, nie
wykorzystuje nawet połowy udostępniach przez sterownik funkcji.
Dlatego duże lepiej jest napisać własnego providera i interfejs
pomiędzy sterownikiem a providerem.

Pozdrawiam,
Grzesiek

proko...@gmail.com

unread,
Sep 25, 2008, 6:08:11 AM9/25/08
to
> Skoro korzystać z javy i nie napisałes własnego provider'a to pewnie
> używaż dostarczonego przez sun' a PKCS#11 gdzie podpinasz plik ze
> sterownikiem PKCS11 udostępnionym przez producenta karty. Jesli tak to
> ja również tworzyłem taki aplet korzystając z karty KIR'u i dostawcy
> CryptoTech'u i jeśli chodzi o działanie samego podpisywania i
> walidacje to nie ma żadnych problemów.
Problemy znikają dopiero w najnowszej wersji oprogramowania
CryptoTech :)

> Dlatego duże lepiej jest napisać własnego providera i interfejs
> pomiędzy sterownikiem a providerem.

Tu sie nie zgadzam, rownie dobrze mozna pisac wlasny system
operacyjny. Akurat do moich potrzeb (zrobienie podpisu elektronicznego
pod wiadomością e-mail) to co daje Sun jest w 100% wystarczające.
Zresztą wolałbym nie grzebać w karcie kryptograficznej, bo po co?

Czy mogbys podac, jakie parametry przy Sunowskiej PKCS11 sa potzrebne
do obslugi karty KIR?
W przypadku Sigillum (dla podpisu kwalifikowanego jest to):

name = SmartCard
library = wiadomo sciezka do DLLki
slot = 3

Szczegolnie istatny jest tu slot :)

jarojaro

unread,
Oct 15, 2008, 6:31:26 AM10/15/08
to
A ja mam problem z podpisem kwalifikowanym Sigillum, tyle tylko ze
xml'owym.

Moj przypadek testowy przy uzyciu key-stora, JKS dziala poprawnie, ale
kiedy tylko probuje w jakis sposob dobrac sie do certyfikatu na karcie
"wypada" podczas skladania podpisu.

Przyklad wyglada tak (nic szczegolnego):


public class Sign {

private static final String DOC_TXT =
"C:\\opt\\eclipse\\workspace\\Sig\\envelope.xml";

private static final String RES_FILE =
"C:\\opt\\eclipse\\workspace\\Sig\\out.xml";

public static void main(String[] args) throws
FileNotFoundException, SAXException, IOException,
ParserConfigurationException, InstantiationException,
IllegalAccessException, ClassNotFoundException,
NoSuchAlgorithmException, InvalidAlgorithmParameterException,
KeyStoreException,

UnrecoverableEntryException, CertificateException,
MarshalException, XMLSignatureException, Exception {

// Create a DOM XMLSignatureFactory that will be used to
// generate the enveloped signature.
//// XMLSignatureFactory fac =
XMLSignatureFactory.getInstance("DOM");

XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

// Create a Reference to the enveloped document (in this case,
// you are signing the whole document, so a URI of "" signifies
// that, and also specify the SHA1 digest algorithm and
// the ENVELOPED Transform.
String sha1 = DigestMethod.SHA1;
DigestMethod dm = fac.newDigestMethod(sha1, null);
String enveloped = Transform.ENVELOPED;
Transform tf0 = null;
Reference ref = null;
tf0 = fac.newTransform(enveloped, (TransformParameterSpec) null);
ref = fac.newReference("", dm, Collections.singletonList(tf0),
null, null);

// Create the SignedInfo.
SignedInfo si =
fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,
(C14NMethodParameterSpec) null),
fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
Collections.singletonList(ref));

KeyStore.PrivateKeyEntry keyEntry =
Windows_MYKeyStore.getKeyEntryFromKeyStore();

X509Certificate cert = (X509Certificate) keyEntry.getCertificate();

// Create the KeyInfo containing the X509Data.
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
x509Content.add(cert.getSubjectX500Principal().getName());
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

// Instantiate the document to be signed.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new
FileInputStream(DOC_TXT));

// Create a DOMSignContext and specify the RSA PrivateKey and
// location of the resulting XMLSignature's parent element.
DOMSignContext dsc = new
DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());

System.err.println(keyEntry.getPrivateKey().getAlgorithm());
System.err.println(keyEntry.getPrivateKey().getFormat());
System.err.println(keyEntry.getPrivateKey().toString());

// Create the XMLSignature, but don't sign it yet.
XMLSignature signature = fac.newXMLSignature(si, ki);

// Marshal, generate, and sign the enveloped signature.
signature.sign(dsc);

// Output the resulting document. FOR DEBUGGING.
OutputStream os = new FileOutputStream(RES_FILE);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
}
}


Przy czym:

linika: Windows_MYKeyStore.getKeyEntryFromKeyStore() jest zroznicowana i

1) w przypadku Providera "SunMSCAPI" zwiera (certyfikat zostal
zainstalowany w systemie):

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

Enumeration e = ks.aliases();
for (; e.hasMoreElements();) {
System.out.println(e.nextElement());
}
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry)
ks.getEntry(Windows_MYKeyStore.ENTRY_ALIAS,new
KeyStore.PasswordProtection(Windows_MYKeyStore.ENTRY_PASS.toCharArray()));

return keyEntry;


2) w przypadku PKCS11 inicjalizacja mniej wiecej odpowiada podanym
przez Ciebie przykladzie.


W obu przypadkach proces "wypada" wyjatekiem w linice signature.sign(dsc);


przy czym dla konfiguracji 1):

java.lang.RuntimeException: Z?y UID.

at
org.jcp.xml.dsig.internal.dom.DOMRSASignatureMethod.sign(DOMRSASignatureMethod.java:146)
at
org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:367)
at Sign.main(Sign.java:105)

dla konfiguracji 2:

sun.security.pkcs11.wrapper.PKCS11Exception: CKR_DEVICE_ERROR
at sun.security.pkcs11.wrapper.PKCS11.C_Sign(Native Method)
at sun.security.pkcs11.P11Signature.engineSign(P11Signature.java:474)
at java.security.Signature$Delegate.engineSign(Signature.java:1128)
at java.security.Signature.sign(Signature.java:522)
at
org.jcp.xml.dsig.internal.dom.DOMRSASignatureMethod.sign(DOMRSASignatureMethod.java:143)
at
org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:367)
at Sign.main(Sign.java:105)


Moze jakis pomysl ?

0 new messages