jarsigner mit Tokens
Um Java Applets und JAR Files zu signieren nutzt man den jarsigner, der normalerweise ein Java-Keystore (.jks) file nutzt. Es ist allerdings ungünstig Codesigning Zertifikate einfach so in Files herumliegen zu haben (auch wenn man diese gesondert sichert). Es ist anzuraten ein Zertifikat besser in einer SmartCard oder einem Token zu speichern.
Der Oracle jarsigner.exe verwendet die Java Security Provider der JCE API. Um damit ein Hardware Token anzusprechen gibt es im wesentlichen 2 Methoden. Entweder den PKCS#11 Provider (benötigt eine PKCS#11 library (.dll oder .so) des Hardwareherstellers) oder unter Windows den Microsoft CryptoAPI (MSCAPI) treiber. Letzteres hat den Vorteil dass die meisten Smartcards unter Windows 7 oder 2008 bereits Treiber beim einstecken installieren. Diese Minitreiber sind nur begrenzt nutzbar, aber für das signieren reicht es aus.
Bei meinen Versuchen habe ich aber einige Einschränkungen gefunden:
- Es wird Java 5,6 oder 7(>b144) benötigt.
- Ich habe nur die Java Distribution von Sun/Oracle getestet
- In der 64bit Variante wird der Provider aktuell nur von Java 7 ausgeliefert
- Über MSCAPI wird immer in getrenntem Dialog nach PIN gefragt
c:\Program Files (x86)\Java\jdk1.6.0_24\bin>keytool -list -storetype Windows-MY Keystore-Typ: Windows-MY Keystore-Provider: SunMSCAPI Ihr Keystore enthält 4 Einträge. ... FIRMA AG, PrivateKeyEntry, Zertifikatsfingerabdruck (MD5): 57:EF:97:04:EA:91:EE:FF:CF:BF:7F:75:AE:E1:A2:7D ... c:\Program Files (x86)\Java\jdk1.6.0_24\bin>jarsigner.exe -storetype Windows-MY %TEMP%\test.jar "FIRMA AG"Als Speicher für die Zertifikate verwende ich ein Athena ASEKey Crypto Token in das ich mit den Athena IDProtect Tools auf einem anderen Computer das Codesigning Zertifikat von Verisign (Promo:WINQUAL99) importiert habe. Das Zertifikat ist übrigens ein Authenticode Class 3 Zertifikat das es aktuell für Teilnehmer am Microsoft WinQual Programm für ein Jahr günstig ($99) gibt. Entgegen den Angaben von Verisign lässt sich dieses auch problemlos für Java Signig verwenden. Einziges Problem bei der Sache, mit -storepass oder -keypass lässt sich die PIN für die SmartCard nicht angeben, diese fragt immer mit einem Popup nach entsprechender Freigabe. Ich habe in den Athena Tools keine Möglichkeit gefunden diese abzuschalten (allerdings geht es mit der PKCS#11 API, wie ich im nächsten Beitrag berichten werde).
c:\Program Files (x86)\Java\jdk1.6.0_24\bin>jarsigner -verify -certs -verbose %T EMP%\test.jar 134 Thu Jun 02 23:27:48 CEST 2011 META-INF/MANIFEST.MF 258 Fri Jun 03 00:04:02 CEST 2011 META-INF/FIRMA_AG.SF 4764 Fri Jun 03 00:04:02 CEST 2011 META-INF/FIRMA_AG.RSA 0 Thu Jun 02 23:23:38 CEST 2011 META-INF/ sm 15104 Sun Mar 06 04:56:06 CET 2011 jarsigner.exe X.509, CN=FIRMA AG, OU=Software Development, OU=Digital ID Class 3 - Microsoft Software Validation v2, O=FIRMA AG, ST=Baden-Wuerttemberg, C=DE [certificate is valid from 21.12.10 01:00 to 22.12.11 00:59] X.509, CN=VeriSign Class 3 Code Signing 2010 CA [certificate is valid from 08.02.10 01:00 to 08.02.20 00:59] [KeyUsage extension does not support code signing] X.509, CN=VeriSign Class 3 Public Primary Certification Authority - G5 [certificate is valid from 08.11.06 01:00 to 17.07.36 01:59] [KeyUsage extension does not support code signing] s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified.Update: Ich habe das ganze gerade mit der b144 von Java 7 getestet, und damit lassen sich sowohl mit 32bit als auch mit der 64bit Version der MSCAPI Provider für die Signatur von JAR Files via Smart Token nutzen.