Cryptostick und Firefox

Hi,

Cryptostick läuft soweit für SSH, jetzt wollte ich den Cryptostick auf für die Client Authorisierung bei Webseiten verwenden.
Dazu habe ich den Apache konfiguriert mit einem self-signed Zertifikat ausgestattet. Dan habe ich ein Client Zertifikat erstellt zum Testen, dieses in den Firefox importiert und alles läuft.

Jetzt soll der Cryptostick das oben erwähnte Client Zertifikat ersetzen. Also habe ich das Client Zertifikat erstaml wieder aus dem Firefox gelöscht.

Dann habe ich grob folgendes gemacht:

Zunächst habe ich mit gpgsm --gen-key ein CSR erstellt, welches ich mit meiner CA signiert habe.
Anschließend habe ich das CA Root Zertifikat und mein eigenes, sobene erstelltest importiert mit

gpgsm --import CA/cacert.pem
gpgsm --import CA/jannng.crt

Hat auch soweit geklappt und es wird mir mit gpgsm -K janning
angezeigt.

Dann habe ich im Firefox die debug lib pkcs11 von Peter Koch geladen. Das klappt auch, es wird angezeigt:
Debug CryptoStick 86D

wenn ich jetzt auf die Seit egehe die ein Client Zertifikat benötigt, erhalte ich:

Bitte geben Sie das Master-Passwort für Debug:CryptoStick 86D ein

Keine ahnung, was das sein soll. Meine PIN ist es jedenfalls nicht.

Im debug.log steht:

140731430385408 11/09 12:43:20 Login: started, S1, State:RO-Public, Type:User, Pin=*******
140731430385408 11/09 12:43:20 check_SPE: SCardControl() received 12 bytes
140731430385408 11/09 12:43:20 check_SPE: SecPIN 0A
140731430385408 11/09 12:43:20 check_SPE: SecPIN 12
140731430385408 11/09 12:43:20 VerifyPinPCSC: User-PIN=’’, CLA/REF=00/82, Ascii-Format, Min/MaxLen=1/16
140731430385408 11/09 12:43:20 card_get_fbz: PinRef: 0x82
140731430385408 11/09 12:43:20 SendAPDU: 00:CA:00:C4 Lc:0 Le:0(100 bytes)
140731430385408 11/09 12:43:20 SendAPDU: SCardTransmit(5 bytes) => 9 bytes
140731430385408 11/09 12:43:20 SendAPDU: SW=9000 Len=7:00202020000003
140731430385408 11/09 12:43:20 VerifyPinPCSC: card_get_fbz(0x82)=Success, fbz=0
140731430385408 11/09 12:43:20 pin_gui: Mode=INIT
140731430385408 11/09 12:43:20 pin_gui: Mode=ASKPIN
140731430385408 11/09 12:43:20 VerifyPinPCSC: Got PIN ‘’
140731430385408 11/09 12:43:20 pin_gui: Mode=EXIT
140731430385408 11/09 12:43:20 VerifyPinPCSC: invalid PIN-Length, must 1 <= 0 <= 16
140731430385408 11/09 12:43:20 Login: VerifyPinPCSC()=unspecific error
140731430385408 11/09 12:43:20 GetSessionInfo: started, S1
140731430385408 11/09 12:43:20 GetSessionInfo: S1: Slot=2 State:RO-Public, Flags:RO
140731430385408 11/09 12:43:20 FindObject: Init S1 TemplateCount=2
140731430385408 11/09 12:43:20 FindObject: Template0 Token=True
140731430385408 11/09 12:43:20 FindObject: Template1 Class=Certificate
140731430385408 11/09 12:43:20 FindObject: Found=0
140731430385408 11/09 12:43:20 FindObject: Find S1 Max=16 Return
140731430385408 11/09 12:43:20 FindObject: Final S1

ich habe auch irgendwie die Zusammenhänge zwischen gpg, x509, gpgsm und libpcks11 noch nicht verstanden.
Kann mir jemand helfen?

Gruß
Janning

Ok, no i realized that i have to import my cert into my card with

gpg2 --card-edit

admin
writecert 3 <foo.crt

this worked so far. But when i want to read it from the card with

readcert 3 > foo.crt

Befehl> readcert 3 > foo.crt
gpg: error reading certificate from card: Nicht gefunden

no even writing doesn’t work anymore…

Heisst das, dass Du selbst nach einem kompletten Neustart kein Zertifikat mehr schreiben kannst?

Zu Deiner anderen Frage:

OpenPGP und X.509/SMIME leisten im Grunde das selbe und beschreiben das Format fuer kryptographische Schluessel und verschluesselte Daten/Nachrichten. Wir haben es also mit zwei Standards zu tun und je nach Anwendung wir der einer oder der andere Standard verwendet. Leider macht dieser Umstand die Nutzung von Kryptographie nicht leichter…
GnuPG ermoeglicht in erster Linie Datei und Emailverschluesselung, Signaturen und Schluesselverwaltung im OpenPGP Format. Seit - ich glaube - Version 2.1 unterstuetzt GnuPG zusaetzlich auch das X.509 Format. Genaugenommen verwendet man fuer X.509 die Applikation gpgsm, die Teil des GnuPG Paketes ist.
PKCS#11 ist eine weit verbreitete Schnittstelle um Anwendungen den Zugriff auf Chipkarten und USB Tokens wie den Crypto Stick zu ermoeglichen. Beispielsweise wird diese von Firefox oder TrueCrypt verwendet. PKCS#11 basiert auf dem X.509 Standard und hat mit OpenPGP nichts zu tun. Um ein bestimmtes Geraet mittels PKCS11 nutzen zu koennen braucht man einen herstellerspezifischen Treiber. Fuer den Crypto Stick ist dies libpcks11 von Peter Koch. Zukuenftig soll man hierfuer auch OpenSC nutzen koennen, das klappt derzeit aber noch nicht.
Ich hoffe die Situation ist nun etwas klarer geworden?

[quote=“janning”]Dann habe ich im Firefox die debug lib pkcs11 von Peter Koch geladen. Das klappt auch, es wird angezeigt:
Debug CryptoStick 86D[/quote]

Wird denn auch ein Zertifikat im Firefox angezeigt - oder nur der Token?

[quote]wenn ich jetzt auf die Seite gehe die ein Client Zertifikat benötigt, erhalte ich:
Bitte geben Sie das Master-Passwort für Debug:CryptoStick 86D ein
Keine ahnung, was das sein soll. Meine PIN ist es jedenfalls nicht.[/quote]

Doch, gemeint ist hier deine PIN, auch wenn sich der Firefox misverständlich ausdrückt. Firefox fragt nämlich vor dem Zugriff auf einen Zertifikatspeicher nach dem “Master-Passwort” dieses Zertifikatsspeichers. Und der Cryptostick wird wie ein zusätzlicher Zertifikatsspeicher behandelt.

[quote]Im debug.log steht:

140731430385408 11/09 12:43:20 VerifyPinPCSC: card_get_fbz(0x82)=Success, fbz=0
…[/quote]

fbz=0 bedeutet, dass der Fehlbedienungszähler der PIN auf 0 steht, also kein Versuch für eine PIN-EIngabe mehr möglich ist. Die PIN muss erst mal entsperrt werden. Aber wie ich im Log erkennen kann, steht der Fehlbedienungszähler der Admin-PIN (noch) auf 3. Man kann die PIN also mit der Admin-PIN entsperren.

Na klar - immer nur fragen, wenn’s weiter Probleme gibt. :slight_smile:

Viele Grüße

Peter

Danke Jan, danke Peter, so langsam verstehe ich die Unterschiede zwischen gpg x509 S/Mime pkcs11 usw. Aber manchmal komme ich mir auch vor wie bei StarTrek. “Ich werde die Deflektorphalanx mit einem Ionenstrahl neu kallibrieren und eine Ebene-3-Diagnose durchführen…”

also, ich beschreib mal wa sich tue:

ubtunu 11.04 frisch eingeloggt:

[code]gpg --card-status

Application ID …: D27600012401020000050000086D0000
Version …: 2.0
Manufacturer …: ZeitControl
Serial number …: 0000086D
Name of cardholder: Janning Vygen
Language prefs …: de
Sex …: unbestimmt
URL of public key : [nicht gesetzt]
Login data …: janning
Signature PIN …: zwingend
Key attributes …: 2048R 2048R 2048R
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key …: CBB3 30E2 3DFC 082F AE66 25F5 BF3C D665 BB88 7DA0
created …: 2011-10-03 11:10:35
Encryption key…: 765F 88B8 42CE 149F FCDF 9310 F8EF 4F63 C7D0 D99C
created …: 2011-10-03 11:15:17
Authentication key: 1657 78A3 DAB8 74B9 6BAD B112 9359 08D5 A9EE 88A1
created …: 2011-10-03 11:18:04
General key info…: pub 2048R/BB887DA0 2011-10-03 Janning Vygen vygen@kicktipp.de
sec# 2048R/2560F970 erzeugt: 2011-10-03 verfällt: niemals
ssb> 2048R/BB887DA0 erzeugt: 2011-10-03 verfällt: niemals
Kartennr.: 0005 0000086D
ssb> 2048R/C7D0D99C erzeugt: 2011-10-03 verfällt: niemals
Kartennr.: 0005 0000086D
ssb> 2048R/A9EE88A1 erzeugt: 2011-10-03 verfällt: niemals
Kartennr.: 0005 0000086D

[/code]
Dann Firefox gestartet, Modul libpkcs11_debug.so war schon geladen. Stick wurde angezeigt als Status “Nicht vorhanden”

log Auszug

[quote]140389500208896 11/10 09:55:04 GetSlotInfo: started, Slot=2
140389500208896 11/10 09:55:04 GetTokenInfo: started, Slot=2
140389500208896 11/10 09:55:04 GetTokenInfo: SCardConnect(German Privacy Foundation Crypto Stick v1.2 00 00)=Unknown error: 0xFFFFFFFF8010000B
140389500208896 11/10 09:55:04 GetSlotInfo: started, Slot=1
[/quote]

das kam jede Sekunde, dann habe ich den Stick
ausgesteckt und wieder eingesteckt:

[quote]140389500208896 11/10 09:55:53 GetTokenInfo: started, Slot=2
140389500208896 11/10 09:55:53 SendAPDU: 00:A4:04:00 Lc:6(D2:76:00:01:24:01) Le:0
140389500208896 11/10 09:55:53 SendAPDU: SCardTransmit(12 bytes) => 25 bytes
140389500208896 11/10 09:55:53 SendAPDU: SW=9000 Len=23:62158410D27600012401020000050000086D00008A0105
140389500208896 11/10 09:55:53 SendAPDU: 00:CA:00:4F Lc:0 Le:0(20 bytes)
140389500208896 11/10 09:55:53 SendAPDU: SCardTransmit(5 bytes) => 18 bytes
140389500208896 11/10 09:55:53 SendAPDU: SW=9000 Len=16:D27600012401020000050000086D0000
140389500208896 11/10 09:55:53 card_get_serial: OpenPGP card Version 2.00, Serial 0000086D
140389500208896 11/10 09:55:53 card_init_context: started, Typ=77
140389500208896 11/10 09:55:53 check_SPE: SCardControl() received 12 bytes
140389500208896 11/10 09:55:53 check_SPE: SecPIN 0A
140389500208896 11/10 09:55:53 check_SPE: SecPIN 12
140389500208896 11/10 09:55:53 GetTokenInfo: New Card 0000086D in Slot 2, new Info, Flags=RW,LoginRequired
140389500208896 11/10 09:55:53 GetMechanismList: started, Slot=2
140389500208896 11/10 09:55:53 C_GetMechanismList Slot=2 Count=???
140389500208896 11/10 09:55:53 GetMechanismList: started, Slot=2
140389500208896 11/10 09:55:53 C_GetMechanismList Slot=2 Maxcount=3 Count=3
140389500208896 11/10 09:55:53 OpenSession: started, Slot=2, Flags=RO+Serial, Notify=Yes
140389500208896 11/10 09:55:53 OpenSession: first session
140389500208896 11/10 09:55:53 New Session 1/1: Flags=4,RO State=RO-Public
140390220003136 11/10 09:55:53 GetSlotInfo: started, Slot=2
140390220003136 11/10 09:55:53 GetSlotInfo: started, Slot=1
[/quote]

Wenn ich mir jetzt meine Zertifikate anzeigen lassen will, fragt er nach dem “Master-Passwort” für den Cryptostick.
ich tipp es ein, aber es werden dann keine Zertifikate angezeigt. Alle Tabs außer Server und Zertifizierungsstellen sind leer.

Ich bekomme dann in der Logdatei das zu sehen:

[quote]140390220003136 11/10 09:59:49 Login: started, S1, State:RO-Public, Type:User, Pin=******
140390220003136 11/10 09:59:49 check_SPE: SCardControl() received 12 bytes
140390220003136 11/10 09:59:49 check_SPE: SecPIN 0A
140390220003136 11/10 09:59:49 check_SPE: SecPIN 12
140390220003136 11/10 09:59:49 VerifyPinPCSC: User-PIN=’’, CLA/REF=00/82, Ascii-Format, Min/MaxLen=1/16
140390220003136 11/10 09:59:49 card_get_fbz: PinRef: 0x82
140390220003136 11/10 09:59:49 SendAPDU: 00:CA:00:C4 Lc:0 Le:0(100 bytes)
140390220003136 11/10 09:59:49 SendAPDU: SCardTransmit(5 bytes) => 9 bytes
140390220003136 11/10 09:59:49 SendAPDU: SW=9000 Len=7:00202020030003
140390220003136 11/10 09:59:49 VerifyPinPCSC: card_get_fbz(0x82)=Success, fbz=3
140390220003136 11/10 09:59:49 pin_gui: Mode=INIT
140390220003136 11/10 09:59:49 pin_gui: Mode=ASKPIN
140390220003136 11/10 09:59:49 VerifyPinPCSC: Got PIN ''
140390220003136 11/10 09:59:49 pin_gui: Mode=EXIT
140390220003136 11/10 09:59:49 VerifyPinPCSC: invalid PIN-Length, must 1 <= 0 <= 16
140390220003136 11/10 09:59:49 Login: VerifyPinPCSC()=unspecific error
140390220003136 11/10 09:59:49 FindObject: Init S1 TemplateCount=2
140390220003136 11/10 09:59:49 FindObject: Template0 Token=True
140390220003136 11/10 09:59:49 FindObject: Template1 Class=Certificate
140390220003136 11/10 09:59:49 FindObject: Found=0
140390220003136 11/10 09:59:49 FindObject: Find S1 Max=16 Return
140390220003136 11/10 09:59:49 FindObject: Final S1
[/quote]

Da steht etwas von unspecific error. Ob der PIN korrekt war, msste ich ja am Counter auf dem Stick sehen. Leider kann ich jetzt nach dem Firefox zugegriffen hat nicht mehr auf den Stick mit gpg:

[quote]janning@antilope:~$ gpg --card-status
gpg: selecting openpgp failed: ec=6.108
gpg: OpenPGP Karte ist nicht vorhanden: Allgemeiner Fehler
[/quote]

Da hilft dann wieder das übliche killen des scdaemon. Kann man das irgendwie abstellen? Das nervt total und macht die Sache nicht vertrauenswürdiger (und das sollte sie sein, nicht wahr :slight_smile:

Und nach dem Kill des scdaemon komme ich wieder an den Stick und er zeigt mir:

[quote]PIN retry counter : 3 0 3
[/quote]

also vermute ich, dass das Laden des Zertifikats nicht geklappt hat, der PIN aber korrekt war.

Also probiere ich das nochmal mit dem Zertifikat:

[quote]gpg2 --card-edit

Befehl> admin
Admin-Befehle sind erlaubt

Befehl> writecert 3 < janning.crt
// hier wird nach der Admin-Pin gefragt
Befehl>

… Keine Antwort, sieht also gut aus??..]

Befehl> readcert 3 > foo.crt
Befehl> quit
[/quote]

Ein diff auf beide Dateien zeigt, dass alles korrekt ist. Beide Dateien sind identisch.

Also Firefox starten, aber hier wird der Cryptostick jetzt gar nicht angezeigt. Rausziehen, neu einstecken.
Dann ist er wieder da.

Aber wenn ich mir die Zertifikate anzeigen lassen will, sehe ich dasselbe wie oben, also erst Eingabe der PIN, dann leere Zertifikatsliste (in allen Tabs, außer Server und Zertifizierungsstellen)

Dann habe ich mal versucht unter Kryptographie-Module den Stick auszuwählen und dort “Einloggen” anzuwählen. Dann kommt die PIN Abfrage und dann “Einloggen fehlgeschlagen”.

Bin ratlos.

Erst mal eine grundlegende Informationen zum Zusammenspiel zwischen GPG und anderen Anwendungen:

Einen Token und/oder SmartCard kann man exklusiv oder im Shared-Modus öffnen. GPG (bzw. scdaemon) öffnet den Token exklusiv, meine PKCS#11-Bibliothek dagegen nicht. Beides hat Vor- und Nachteile. Das exklusive Öffnen ist sicherer verhindert aber die gleichzeitige Nutzung mehrere Anwendungen.

Ich selber nutze GPG nicht, glaube mich aber erinnern zu können, dass der scdaemon eine Option hat, die dazu führt, dass scdaemon den Token zwar exklusiv öffnet, ihn aber ein paar Sekunden nach der Benutzung wieder schliesst. Das könnte hier helfen.

[quote]ubtunu 11.04 frisch eingeloggt:

gpg --card-status ....
Dann Firefox gestartet, Modul libpkcs11_debug.so war schon geladen. Stick wurde angezeigt als Status “Nicht vorhanden”[/quote]

GPG hat in diesem Fall den Token exklusiv geöffnet und deshalb kann keine andere Anwendung mit dem Token sprechen.

Hier erkenne ich eine Schlampigkeit in meinem Programm. der Fehler 0x8010000B (SCARD_E_SHARING_VIOLATION) würde normalerweise zum Hinweis führen, dass der Token gesperrt ist. Aber hier scheint es sich um ein 64bit System zu handeln und der 32bit Fehlercode wird falsch in einen 64bit Wert umgewandelt. Ich ändere das bei Gelegeheit, aber an der Tatsache, dass der Token gesperrt ist, lässt sich nun mal nichts ändern.

Und genau das beendet die Verbindung zwischen scdaemon und dem TOken und danach kann meine Bibliothek den Token öffnen.

[quote]Wenn ich mir jetzt meine Zertifikate anzeigen lassen will, fragt er nach dem “Master-Passwort” für den Cryptostick.
ich tipp es ein, aber es werden dann keine Zertifikate angezeigt. Alle Tabs außer Server und Zertifizierungsstellen sind leer.[/quote]

[quote]Ich bekomme dann in der Logdatei das zu sehen:
140390220003136 11/10 09:59:49 pin_gui: Mode=INIT
140390220003136 11/10 09:59:49 pin_gui: Mode=ASKPIN
140390220003136 11/10 09:59:49 VerifyPinPCSC: Got PIN ''
140390220003136 11/10 09:59:49 pin_gui: Mode=EXIT
140390220003136 11/10 09:59:49 VerifyPinPCSC: invalid PIN-Length, must 1 <= 0 <= 16
140390220003136 11/10 09:59:49 Login: VerifyPinPCSC()=unspecific error
[/quote]

Das sieht merkwürdig aus. Wirst du vom Firefox nach der PIN gefragt oder von der PKCS#11-Bibliothek? DIe Logdatei erweckt auf mich den EIndruck, als versuchte die PKCS#11-Bibliothek einen PIN-Abfrage Dialog zu starten (Routine pin_gui). Aber genau das funktioniert unter Linux (noch) nicht und meine Bibliothek sollte es deshalb dem Firefox überlassen, die PIN abzufragen. Ich hatte bisher keine Gelegenheit meine Bibliothek unter 64bit Linux zu testen - könnte sein, dass hier noch ein Fehler vorliegt, der die Bibliothek faktisch nutzlos macht.

Schick mir mal eine komplette Debug-Datei.

Das ist wieder das Sharing-Problem. Da eine andere Anwendung den Tokenim Shared-Modus geöffnet hat, kann gpg den Token nicht mehr exklusiv öffnen. Du könntest mal ganz bewusst eine falsche PIN eingeben und überprüfen, ob das den PIN-Counter von 3 auf 2 reduziert. Ich vermute wegen folgender Meldung:

eher, dass gar keine PIN erkannt und zum Token geschickt wird (PIN-Länge muss zwischen 1 und 16 liegen, war hier aber 0)

Natürlich nervt das - aber es verhindert, dass mehrer Anwendungen gleichzeitig auf die Karte zugreifen. Und dieses Verhalten ist von gpg ausdrücklich so vorgesehen und gewünscht.

Kannst du gpg selber kompilieren? Falls ja, dann könntest du eine einzige Zeile im Source ändern und scdaemon würde den Token ebenfalls im Shared-Modus öffen und dieses Problem wäre weg. Mach das aber nur wenn du wirklich genau weisst, was das zu Folge hat.

Ich vermute eher, dass die PIN-EIngabe mit dem 64bit-Firefox nicht funktioniert und meine Bibliothek das vorhandene Zertifikat deshabl nicht anzeigen kann. Aber für eine detailliertere Analyse benötige ich die komplette Logdatei.

Auch das bestätigt meine Vermutung, dass hier irgendwas mit der PIN-EIngabe fehlschlägt.

Viele Grüße

Peter

Es gibt folgenden scdaemon Parameter, vielleicht ist es der den Peter meint (gnupg.org/documentation/manuals/gnupg/Scdaemon-Options.html):

[quote]–card-timeout n
If n is not 0 and no client is actively using the card, the card will be powered down after n seconds. Powering down the card avoids a potential risk of damaging a card when used with certain cheap readers. This also allows non Scdaemon aware applications to access the card. The disadvantage of using a card timeout is that accessing the card takes longer and that the user needs to enter the PIN again after the next power up.

Note that with the current version of Scdaemon the card is powered down immediately at the next timer tick for any value of n other than 0. [/quote]

p11 glue (p11-glue.freedesktop.org/) ist ein Projekt welches u.a. das Sharing Problem loesen will. Das hilft jetzt noch nicht aber hoffentlich mittelfristig.