das java-keytool mit opensc pkcs#11-provider funktioniert nur mit debug-option aktiviert ist
Habe ich die neueste opensc 0.12.2 läuft auf ubuntu 11.10 mit OpenJDK ( java-version "1.6.0_22")
Lesen kann ich meine smartcard (Feitian ePass PKI) mit
pkcs15-tool --dump
Versuche ich jetzt, um meine smartcard mit keytool:
keytool
-providerClass sun.security.pkcs11.SunPKCS11 \
-providerArg /etc/opensc/opensc-java.cfg \
-keystore NONE -storetype PKCS11 -list
was zu einem Fehler führt:
keytool error: java.security.KeyStoreException: PKCS11 not found
java.security.KeyStoreException: PKCS11 not found
at java.security.KeyStore.getInstance(KeyStore.java:603)
at sun.security.tools.KeyTool.doCommands(KeyTool.java:621)
at sun.security.tools.KeyTool.run(KeyTool.java:194)
at sun.security.tools.KeyTool.main(KeyTool.java:188)
Caused by: java.security.NoSuchAlgorithmException: PKCS11 KeyStore not available
at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
at java.security.Security.getImpl(Security.java:696)
at java.security.KeyStore.getInstance(KeyStore.java:600)
... 3 more
Wenn ich den selben Befehl mit debug-Optionen aktiviert, wie diese:
keytool
-providerClass sun.security.pkcs11.SunPKCS11 \
-providerArg /etc/opensc/opensc-java.cfg \
-keystore NONE -storetype PKCS11 -list \
-J-Djava.security.debug=sunpkcs11
es plötzlich funktioniert:
... debug infos ...
Enter keystore password:
sunpkcs11: login succeeded
Keystore type: PKCS11
Keystore provider: SunPKCS11-OpenSC
Your keystore contains 2 entries
...
Certificate fingerprint (MD5): ...
...
Certificate fingerprint (MD5): ...
Das gleiche Verhalten, wenn ich es konfigurieren statisch:
$ grep opensc /usr/lib/jvm/java-6-openjdk/jre/lib/security/java.security
security.provider.7=sun.security.pkcs11.SunPKCS11 /etc/opensc/opensc-java.cfg
und meine config
$ cat /etc/opensc/opensc-java.cfg
name = OpenSC
description = SunPKCS11 w/ OpenSC Smart card Framework
library = /usr/lib/opensc-pkcs11.so
Meine Vermutung, es hat etwas zu tun mit openjdk oder interne Paket sun.security
die kann in der Regel nicht verwendet werden, da es sich um ein internes Paket. Aktivieren von Debug-Optionen aktivieren Sie das interne Paket?
InformationsquelleAutor Janning | 2011-11-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hab das gleiche problem heute, und ich hackte auf die java-Quellen, bis ich die Quelle des Problems. Ich weiß, diese Frage ist schon ziemlich alt und haben bereits eine akzeptierte Antwort, aber das ist auch nicht eine wirkliche Antwort.
Grundsätzlich die SunPKCS11-Anbieter hat eine Liste aller verfügbaren slots, dann Holen Sie den slot Sie angegeben haben in Ihrer config, und geben Sie den Fehler (da du nicht angegeben-Steckplatz und für den Standardwert).
Wenn im debug, nach der alle verfügbaren slots, es tut Liste aller slots, die mit einem smartcard eingefügt. Nachdem wir drucken alle diese Informationen über die slot-Liste es tut initialisieren seine Slot-id-variable überschreiben, was du geschrieben hast (oder vergessen zu schreiben) in deiner config. Der neue Wert ist richtig, da es gelesen wird aus dem opensc-defaults.
Dies ist der entsprechende code aus SunPKCS11.java von openjdk-Projekt:
Also, ein workaround ist es, immer in deiner config einen negativen Wert wie
slot = -1
, so dass der provider immer die Suche nach der richtigen.Ich habe versucht: bugs.openjdk.java.net/show_bug.cgi?id=100318
Die
slot = -1
trick hat nicht funktioniert für mich in meinem Ruf zukeytool
. Aber das hinzufügen-J-Djava.security.debug=sunpkcs11
auf der Kommandozeile funktioniert hat.du hast einen anderen Fehler. Siehe bugs.openjdk.java.net/browse/JDK-8039912
Bestätigt in
openjdk-7-jdk:i386, 7u111-2.6.7-1
. Da ich beideopenjdk7
undOracle JDK 7
installiert, habe ich zunächst geprüftkeytool
war verbunden mit dem binary von Open JDK 7. Geändert Oracle JDK 7 und das problem ist Weg.InformationsquelleAutor eppesuig
Hinzufügen der debug-flag, um die Befehlszeile für mich gearbeitet:
Oder manuell angeben, dass der Schlitz in der cfg-Datei:
InformationsquelleAutor Hans-Christoph Steiner
Kann ich bestätigen, dieses Verhalten mit Hilfe von java JDK 1.6.0_20
Sogar ein einfaches java-Programm funktioniert nur mit -Djava.Sicherheit.debug=sunpkcs11 gesetzt.
mit /etc/pkcs11_java.cfg
InformationsquelleAutor serf