Nitrokey Start - Import existing PKCS12


#1

Hallo zusammen,

Ich habe vor kurzem einen Nitrokey Start gekauft, da ich bei meiner Recherche gelsen haben man könne vorhandene PKCS12 Zertifikate einspielen.

Ich habe sämtliche Schritte der SMIME Email Encryption vollzogen, leider ohne Erfolg. Ich bekomme zwar genau die vorgegebene Ausgaben, jedoch ist danach nichts auf dem NK drauf.

Ich nutze Windows 10 und habe OpenSC 32&64 installiert.

Kann mir jemand erklären was ich falsch mache?

Mein Ziel ist es das vorhandene Zertifikat zu importieren und den privaten Schlüssel zur Dechiffrierung einer Textdatei zu nutzen.

Schon mal vielen Dank und Grüße
Ben


#2

Hi Ben,

was für ein Zertifikat ist das? Also welche Schlüsselattribute?

Was gibt pkcs15-tool -k -c aus?

Ich nehme an, du nutzt version 0.19 von OpenSC?

Liebe Grüße
Alex


#3

Hi Alex,

ja ich nutze die OpenSc 0.19. Die Ausgabe sieht wie folgt aus:

pkcs15-tool.exe -k -c -v
Using reader with a card: Nitrokey Nitrokey Start 0
Connecting to card in reader Nitrokey Nitrokey Start 0…
Using card driver OpenPGP card.
Trying to find a PKCS#15 compatible card…
Found OpenPGP card!
Card has 0 Certificate(s).

Card has 0 Private key(s).

Das Zertifikat ist im Format PKCS12, ist also ein Zertifikat mit privatem Schlüssel. Beides soll auf den Token falls möglich. Sonst benötige ich nichts. Ziel wäre es dann programmatisch den Token zur Entschlüsselung einer Textdatei einzusetzen, welche mit dem öffentlichen Schlüssel des Zertifikats verschlüsselt worden ist.

Danke schon mal.

Grüße und schönes Wochenende
Ben


#4

Hey Ben,

kannst du vielleicht -vvv an den Befehl anhängen? Dann ist das Programm gesprächiger und wir erfahren, was los ist. Oder du fängst zunächst an, uns die Ausgabe im “normalen” Fall zu zeigen.

Ansonten: Wo kommt denn das Zertifikat her? Ich kann mir vorstellen, dass es vielleicht zu groß für den Start ist oder einen nicht unterstützten Schlüssel enthält oder oder oder…

Falls die Informationen der Ausgabe persönliche Informationen enthalten oder du dir unsicher bist, dann kannst du sie auch an unsere Support-Adresse schicken.

Liebe Grüße
Alex


#5

Hey Ben,

wie eben per Mail besprochen handelt es sich hierbei um ein Problem, dass bereits im Entwicklungszweig gefixt ist. Das heißt, dass Version 0.20 von OpenSC nicht mehr davon betroffen sein wird. Bis dahin kann hier eine aktuelle Version heruntergeladen werden.

Liebe Grüße
Alex


#6

Hi Alex,
super, wie bereits besprochen passt das so.

Jetzt kommt Teil 2, ich packs einfach mal hier mit rein.
Ich möchte nicht mit den gegebeen Tools den Import des Schlüssels und Zertifikat durchführen, sondern programmatisch. Ich nutze zusätzlich PKSC11Interop, läuft grundsätzlich wunderbar.

Ich kann mich damit am Token anmelden und auf Slots zugreifen.

Jedoch benötige ich für den Import ein paar Informationen:

Welche Attribute benötige für das Zertifikat?
Ich gehe mal davon aus, dass CKA_CLASS,CKA_CERTIFICATE_TYPE, CKA_VALUE gesetzt sein muss, was aber noch alles?

Gleiches für den PrivateKey…

Habt ihr da ne Dokumentation zu?

Danke und Gruß
Ben


#7

Hi Ben,

welche Attribute du benötigst, hängt ja vom use-case ab, oder? Oder wie darf ich deine Frage verstehen?

Wenn es euch darum geht, eine interne pki aufzubauen, würde ich mal nach empfohlenen Standards im Netz schauen. Um ehrlich zu sein, kenne ich mich damit auch nicht sehr gut aus.

Liebe Grüße
Alex


#8

Hi Alex,

es geht hier nicht um Attribute unserer Usecases, sondern um die notwendigen Attribute die man benötigt ein Zertifikat oder einen Privaten Schlüssel auf der Smartcard speichern zu können.

Wir sind hier beim PKCS11 Standard, die Funktion C_Create_Object bekommt diese Attribute übergeben, z.B. dass es sich um ein Zertifikat handelt und dessen Wert. Ich hatte beim RSA SID 800 einen Doku in der drin stand welche dieser Attribute gesetzt sein müssen und das fehlt mir hier. Finden konnte ich leider auch sonst nichts. Aber ich suche weiter.

Ich weiß nicht inwiefern ihr Softwareentwickler auf euer Seite habt, aber vielleicht kann hier jemand was zu beitragen?

Danke und Grüße
Benjamin


#9

Hey Benjamin,

ich könnte mal in den Code schauen, um zu sehen, welche Attribute OpenSC dafür verwendet.

Letztlich bietet OpenSC aber nur eine Emulation von PKCS11 für den Nitrokey. Die intern verbaute OpenPGP Card interessiert sich dafür nicht so sehr. Die nimmt einfach ein Zertifikat in binary Form entgegen. OpenSC liest dieses dann bei Bedarf aus und arbeitet damit weiter.

Deshalb würde ich jetzt annehmen, ohne mich so tief mit PKCS11 beschäftigt zu haben, dass diese Variablen keine praktische Bedeutung haben.

Aber vielleicht lehne ich mich jetzt wirklich weit aus dem Fenster :smile:

@jan hast du etwas hierzu zu sagen?

Liebe Grüße
Alex


#10

Hi,

ich hab nun mal das Debuglogging eingeschatet und versucht rauszufinden was schief geht, fällt mir auf die Schnelle echt schwer…folgends ist mir jedoch aufgefallen:

P:5812; T:5524 2019-02-28 14:29:26.860 [opensc-pkcs11] pkcs15-cert.c:355:sc_pkcs15_pubkey_from_cert: returning with: 0 (Success)
P:5812; T:5524 2019-02-28 14:29:26.860 [opensc-pkcs11] pkcs15-lib.c:2733:sc_pkcs15init_select_intrinsic_id: returning with: 20
P:5812; T:5524 2019-02-28 14:29:26.860 [opensc-pkcs11] Cert(ID:38c08b1cb7d20d8ebd5625f55209ec01aabe6c27) rv 20
P:5812; T:5524 2019-02-28 14:29:26.861 [opensc-pkcs11] pkcs15-lib.c:2747:select_id: called
P:5812; T:5524 2019-02-28 14:29:26.861 [opensc-pkcs11] pkcs15-lib.c:2757:select_id: returning with: 0 (Success)
P:5812; T:5524 2019-02-28 14:29:26.861 [opensc-pkcs11] Select ID Cert(ID:38c08b1cb7d20d8ebd5625f55209ec01aabe6c27) rv 0
P:5812; T:5524 2019-02-28 14:29:26.861 [opensc-pkcs11] Store cert( C=DE, S=RLP, L=Lu, O=JV, CN=WGS_testuser,E=none@voegele.info,ID:38c08b1cb7d20d8ebd5625f55209ec01aabe6c27,der(000002162461ADD0,860))
P:5812; T:5524 2019-02-28 14:29:26.861 [opensc-pkcs11] pkcs15-lib.c:2247:sc_pkcs15init_store_data: called
P:5812; T:5524 2019-02-28 14:29:26.861 [opensc-pkcs11] pkcs15-openpgp.c:398:openpgp_store_data: called
P:5812; T:5524 2019-02-28 14:29:26.862 [opensc-pkcs11] ID=38C08B1CB7D20D8EBD5625F55209EC01 AABE6C27 is not valid.
P:5812; T:5524 2019-02-28 14:29:26.862 [opensc-pkcs11] pkcs15-openpgp.c:414:openpgp_store_data: returning with: -1300 (Invalid arguments)
P:5812; T:5524 2019-02-28 14:29:26.862 [opensc-pkcs11] pkcs15-lib.c:2252:sc_pkcs15init_store_data: returning with: -1300 (Invalid arguments)
P:5812; T:5524 2019-02-28 14:29:26.862 [opensc-pkcs11] pkcs15-lib.c:2074:sc_pkcs15init_store_certificate: returning with: -1300 (Invalid arguments)
P:5812; T:5524 2019-02-28 14:29:26.862 [opensc-pkcs11] libopensc return value: -1300 (Invalid arguments)

Hilft das jemandem weiter?
Danke und Grüße
Ben


#11

Hi Ben,

aber mit welchem Befehl? :smile:

Kind regards
Alex


#12

Hi Alex,

damit:

List<ObjectAttribute> oas = new List<ObjectAttribute>();
oas.Add(new ObjectAttribute(CKA.CKA_TOKEN, true));
oas.Add(new ObjectAttribute(CKA.CKA_VALUE, p12.DER));
oas.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_CERTIFICATE));
oas.Add(new ObjectAttribute(CKA.CKA_CERTIFICATE_TYPE, CKC.CKC_X_509));

oas.Add(new ObjectAttribute(CKA.CKA_LABEL, p12.Label));

oas.Add(new ObjectAttribute(CKA.CKA_PRIVATE, false));

oas.Add(new ObjectAttribute(CKA.CKA_SUBJECT, p12.Subject));
oas.Add(new ObjectAttribute(CKA.CKA_ISSUER, p12.Issuer));
oas.Add(new ObjectAttribute(CKA.CKA_SERIAL_NUMBER, p12.SerialNumber));
oas.Add(new ObjectAttribute(CKA.CKA_ID, p12.cka_id()));

ObjectHandle oh = session.CreateObject(oas);

Grundsätzlich wird da ein C_CreateObject der PKCS11 Schnittstelle aufgerufen. Die Session ist gültig, mit dem Admint PIN am Token angemeldet. Der Zertifikat ist dasselbe wie im obigen Test, nur der Weg ist nun ein anderer… Aber ihr schreibt ja, wenn man ne PKCS11 Schnittstelle hat, sollte das auch funktionieren.

Grüße
Ben


#13

Die häufigste Grund für Fehler ist der, dass das Zertifikat zu groß ist. Die Fehlermeldung lässt das aber nicht unbedingt erkennen. Da für den Nitrokey das Zertifikat nur ein Blob ist, könntest Du auch einfach eine kleine Textdatei zu Testzwecken verwenden. Die Attribute sollten also keine Rolle spielen.


#14

Hi Jan,

das Zertifikat das ich teste via PKCS11 auf den Nitrokey zu bekommen kann ich problemlos via pksc15-init importieren, samt Privatekey. Also sollte wir doch die Größe ausschließen können. Die Attribute speilen definitiv eine Rolle, sieht man auch wenn man in den Code von OpenSC schaut. Deshalb auch shon grundsätzlich die Frage ob es für denNitrokey eine entsprechenden Dokumentation darüber gibt.

Hab ihr grundsätzlich Erfahrung mit dem Import von Zertifikaten via PKCS11? Ich bin nicht in der Lage diesen Fehler so detailliert zu analisieren, dass ich ggf. eine Lösung finde. Mir fehlt dafür einfach die Zeit im Projekt. Ich habe bisher eigentlich schon zu viel dafür investiert.

Jetzt muss noch etwas zu dem Blob fragen, denn bisher habe ich mich hier nicht tiefer informiert. Wie bekomme ich technisch das Zertifikat programmatisch auf den Token. Ich suche nach ner C# Lösung.

Grüße und Danke
Ben


#15

Wir haben damit nicht viel Erfahrung. Ein Blick in OpenSC - wie Du schreibst - wäre auch mein nächster Tipp gewesen. Das müsste sich sonst mal ein Entwickler anschauen. Falls Du dafür ein Budget hast, könnten wir das gerne machen. Andernfalls fürchte ich, dass wir dazu in nächster Zeit nicht kommen werden. Falls Du einen Beispiel-Code hättest um das Problem nachzustellen, würde das aber in jedem Fall deutlich helfen.


#16

Hi,

den Beispielcode muss ich vorbereiten, den kann ich so aktuell nicht rausgeben. Ein Budget habe ich keins, jedoch würden wir zwischn 150-200 Sticks abnehmen, dass wenn ich auf dem geforderten Weg arbeiten kann.

Ich schau mal ob ich Montag was zur Verfügung stellen kann.

Schönes WE.

Grüße
Ben