OpenPGP Card und Zertifikate
Voraussetzungen
Beschrieben wird die Verwendung der OpenPGP Card unter Linux (im konkreten Beispiel: Gentoo). Sinngemäß sollte alles auch auf andere Distributionen oder sogar Windows angewendet werden können. Folgende Voraussetzungen müssen erfüllt sein:
- Der Kartenleser und die Karte selbst werden vom System erkannt und sind mittels GnuPG nutzbar
- Die Karte wurde mit GnuPG initialisiert (Schlüssel installiert)
- GnuPG in Version 2.0.x wurde mit SmardCard-Support installiert. Der gpg-agent läuft.
Letzteres kann z.B. unter Gentoo mit KDE durch Aktivierung folgenden Eintrages in der Datei /etc/kde/startup/agent-startup.sh erreicht werden:
if [ -x /usr/bin/gpg-agent ]; then
eval "$(/usr/bin/gpg-agent --daemon)"
fi
Mit diesen Voraussetzungen kann die Karte dem Programm zur Verwaltung der X.509 Zertifikate bekanntgegeben werden:
$ gpgsm --learn-card
Falls hier ein Fehler angezeigt wird, liegt das evtl. daran, daß bereits ein Zertifikat zu einem auf der Karte befindlichen Schlüssel vorhanden ist. Dann sollte schon jetzt das dazugehörige Root-Zertifikat importiert werden:
$ gpgsm --learn-card
gpgsm: no issuer found in certificate
gpgsm: invalid certificate: Fehlerhaftes Zertifikat
$ gpgsm --import Unitas-Network-cacert.pem
gpgsm: certificate imported
gpgsm: gesamte verarbeitete Anzahl: 1
gpgsm: importiert: 1
$ gpgsm --learn-card
Besonderheiten
Üblicherweise erhält bei der Verwendung von X.509-Zertifikaten jeder Benutzer ein Zertifikat, mit welchem er signieren sowie ver- und entschlüsseln kann. In dieser Anleitung sollen allerdings die auf der Karte gespeicherten PGP-Schlüssel als private Schlüssel genutzt werden. In der vorliegenden Version 2.0 kann eine OpenPGP-Karte 3 Schlüssel speichern, je einen zum Signieren, zum Verschlüsseln und zum Authentizieren.
Damit genügt nicht mehr nur ein Zertifikat je Benutzer. Ein zum Signatur-Schlüssel gehörendes Zertifikat kann nicht zum Entschlüsseln genutzt werden, da das mit dem Signatur-Schlüssel nicht geht. Ein mit dem Verschlüsselungs-Schlüssel ausgestelltes Zertifikat kann nicht zum Signieren genutzt werden. Da nützt es auch nichts, einen PGP-Schlüssel in GnuPG mit den Funktionen (Usage) "Signieren" und "Verschlüsseln" auszustatten. Entscheidend ist der Speicherort des Schlüssels in der Karte. Die Karte entschlüsselt nur mit dem Schlüssel, welcher auf dieser als Verschlüsselungs-Schlüssel gespeichert ist und signiert nur mit dem Schlüssel, welcher als Signatur-Schlüssel gespeichert ist. Die dem Schlüssel mit GnuPG zugewiesenen Funktionen sind dabei egal (müssen aber trotzden passen).
Deswegen benötigt jeder Benutzer ein Zertifikat zum Signieren (das funktioniert aber auch zum Authentisieren) und eines zum Verschlüsseln.
Anforderung Signatur-Zertifikat
Die Zertifikatsanforderung (Certificate Signing Request, CSR) für das Signatur-Zertifikat wird wie folgt erstellt:
$ gpgsm --gen-key > ~/mmustermann-sign-csr.pem
gpgsm (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
(1) RSA
(2) Vorhandener Schlüssel
(3) Vorhandener Schlüssel auf der Karte
Ihre Auswahl? 3
Karten-Seriennummer: D2760001240102000005000010B10000
Vorhandene Schlüssel:
(1) E978E23BC41B8B741800305E70369D773B6D9C5A OPENPGP.1
(2) 2561DB6401CC9388B3B9E487E13B99E9D14FA81F OPENPGP.2
(3) 4CCCA587122896DE936BF6F8F81673713380787D OPENPGP.3
Ihre Auswahl? 1
Mögliche Vorgänge eines RSA-Schlüssels:
(1) signieren, verschlüsseln
(2) signieren
(3) verschlüsseln
Ihre Auswahl? 2
Bitte geben sie den Namen des X.509 Subjekts ein: C=DE, ST=Thueringen, L=Gera, O=Unitas Network GmbH, OU=Sign, CN=Max Mustermann, EMAIL=mmustermann@unitas-network.de
Email-Adresse eingeben (Beenden mit einer leeren Zeile):
> mmustermann@unitas-network.de
> mmustermann@unitas-network.com
> mmustermann@unitas-network.net
>
DNS Namen eingeben (Optional. Beenden mit einer leeren Zeile):
>
Bitte geben Sie die URIs ein (Optional. Beenden mit einer leeren Zeile):
>
Parameter die für die Zertifikatsanforderung benutzt werden sollen:
Key-Type: card:OPENPGP.1
Key-Length: 1024
Key-Usage: sign
Name-DN: C=DE, ST=Thueringen, L=Gera, O=Unitas Network GmbH, OU=Sign, CN=Max Mustermann, EMAIL=mmustermann@unitas-network.de
Name-Email: mmustermann@unitas-network.de
Name-Email: mmustermann@unitas-network.com
Name-Email: mmustermann@unitas-network.net
Really create request? (y/N) y
Die Zertifikatsanforderung wird erzeugt. Dies kann einen Moment dauern ...
gpgsm: about to sign CSR for key: &E978E23BC41B8B741800305E70369D773B6D9C5A
gpgsm: certificate request created
Fertig. Sie sollten nun diese Anforderung an die CA senden.
Die möglichen Label für das X.509 Subjekt können mit "info ksba" nachgelesen werden (Appendix A).
Die Anforderung befindet sich nun in der Datei ~/mmustermann-sign-csr.pem und kann an die CA übergeben werden. Die oben ausgegebene Schlüssellänge von 1024 ist nicht korrekt, tatsächlich ist dieser, wie auf der Karte gespeichert, 2048 Bit lang:
$ openssl req -noout -text -in mmustermann-sign-csr.pem
Certificate Request:
Data:
Version: 0 (0x0)
Subject: emailAddress=mmustermann@unitas-network.de, CN=Max Mustermann, OU=Sign, O=Unitas Network GmbH, L=Gera, ST=Thueringen, C=DE
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ec:c4:81:63:39:b9:33:9e:8b:d1:09:8b:d0:6a:
ba:23:20:d9:55:fd:e5:b2:0f:80:11:4d:3f:6f:cb:
a6:0e:70:9a:6a:8f:8c:74:88:03:fd:62:5f:f4:82:
c7:f9:c3:4c:81:76:15:96:6b:2a:85:4a:40:75:b9:
40:6d:cf:5c:a6:d1:64:02:17:0c:1e:68:de:57:a6:
6e:5f:5b:cf:21:5d:cb:0f:46:55:b1:e7:65:c0:d9:
be:73:60:c0:c9:3e:ba:f0:ed:f2:59:aa:5f:24:12:
fa:b7:a9:08:08:47:55:63:55:8b:1a:62:ed:e7:e2:
e2:20:16:30:93:40:f3:7d:43:3c:c4:1e:74:48:31:
71:aa:83:e5:85:22:67:40:e6:9a:5d:75:20:ed:b9:
d4:bc:49:5e:28:b9:7b:37:85:93:6f:d1:59:f7:b0:
ae:51:c5:48:f5:e8:83:74:1d:aa:60:65:2d:75:e9:
69:08:15:ad:02:1d:d0:2f:53:43:28:59:1c:5c:64:
d3:f1:25:73:3a:01:c6:83:fd:b0:be:8b:d1:93:f5:
92:2a:33:8c:2b:bf:e4:b6:50:81:cc:4a:4f:74:96:
ec:af:0d:35:5e:10:3b:f7:6a:2b:d6:48:89:94:84:
d4:9d:a2:88:54:21:1e:54:04:9f:a9:f1:27:94:06:
ef:c1
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Alternative Name:
email:mmustermann@unitas-network.de, email:mmustermann@unitas-network.com, email:mmustermann@unitas-network.net
X509v3 Key Usage: critical
Digital Signature, Non Repudiation
Signature Algorithm: sha1WithRSAEncryption
d2:13:08:6c:04:37:bd:44:01:3b:0b:20:20:f5:e2:84:c4:bb:
8c:91:eb:81:f4:94:74:ac:ed:9b:66:7c:07:1f:d0:3f:e1:ee:
03:c2:63:b2:8a:4f:57:e3:f7:a5:6a:a3:71:e7:1a:28:97:77:
f9:b3:88:84:f4:3b:c0:04:2e:16:a2:44:82:d4:19:ad:05:b8:
ae:84:d7:50:70:d0:d6:c0:e2:92:96:74:20:e3:2a:d7:ad:d0:
64:1b:76:de:f4:51:89:b8:27:cc:67:8c:1e:3a:86:43:be:b6:
3c:88:3d:84:a6:f6:af:b8:79:6f:4e:65:fc:6e:dc:da:1b:09:
08:e3:ad:dd:e3:09:e9:d2:3c:c0:87:54:74:3c:e0:b5:57:15:
fe:60:e2:21:0a:35:3c:4e:bd:4c:30:9e:89:52:c4:b3:05:75:
9f:6a:98:ff:f9:d4:9c:35:2f:55:85:a8:d9:ae:68:04:69:10:
ed:16:30:b1:a4:21:c2:ed:9d:29:25:db:70:7f:c3:0a:59:29:
a9:de:f9:22:b8:a6:db:67:dd:8f:2b:95:ca:c3:18:55:fa:f7:
bc:f1:34:ca:42:49:59:29:19:45:31:98:97:bf:c6:39:84:c6:
c1:7c:ac:cc:e3:9f:cf:61:17:5e:93:bc:fa:46:67:67:2a:ab:
22:b9:a3:49
Anforderung Verschlüsselungs-Zertifikat
Problem
Hier wird es nun richtig schwierig. Das Problem:
Jede X.509 Zertifikatsanforderung wird mit dem zugehörigen privaten Schlüssel signiert. In diesem Fall wäre das der Verschlüsselungs-Schlüssel auf der OpenPGP-Karte. Wie oben bereits beschrieben, kann man mit dem Verschlüsselungs-Schlüssel nicht signieren. Also bleibt nur die Ausführung folgender Schritte:
- Backup der privaten GnuPG-Schlüssel einspielen
- Funktion (Leistungsfähigkeit, Usage) des Verschlüsselungs-Schlüssels von "Verschlüsseln" in "Signieren" ändern
- Schlüssel als Signatur-Schlüssel auf die Karte verschieben
- Zertifikatsanforderung erstellen
- den "richtigen" Signatur-Schlüssel wieder auf die Karte schieben
- Backup-Schlüsselbund wieder entfernen
Dabei tritt das zusätzliche Problem auf, daß GnuPG keine Möglichkeit bietet, die Funktion eines Schlüssels nachträglich zu ändern (Punkt 2). Deswegen wurde ein Patch erstellt, welcher GnuPG um diese Funktionalität erweitert. Dieser Patch kann hier für die gewünschte GnuPG-Version (ab 2.0.22) heruntergeladen werden (gnupg-<version>-change_usage.patch). Gentoo-Anwender können auch gleich das entsprechende Ebuild nutzen oder unser Overlay per Layman einbinden.
Bei diesem Patch handelt es sich um einen schnell erstellten Hack, welcher so auf keinen Fall in eine offizielle Version gehört. Es wird empfohlen, diesen wirklich nur zum hier beschriebenen Erstellen der Zertifikatsanforderung zu nutzen und ansonsten die offizielle GnuPG-Version zu verwenden.
Backup des privaten Schlüsselrings einspielen
Das wurde bereits in "OpenPGP Card initialisieren" beschrieben. Dabei aber bitte nicht direkt mit dem Backup arbeiten (per Symlink u.ä.), sondern mit einer Kopie, da im Folgenden Änderungen stattfinden! Und auch den öffentlichen Schlüsselbund sichern! Hier nochmal in Kurzform:
$ mv ~/.gnupg/secring.gpg ~/.gnupg/secring.gpg.clean
$ mv ~/.gnupg/pubring.gpg ~/.gnupg/pubring.gpg.clean
$ cp <Pfad zu gemountetem Backup-Medium>/secring.gpg ~/.gnupg/secring.gpg
Funktionsänderung Verschlüsselungs-Schlüssel
Dazu wird GnuPG aufgerufen.
Bitte im Folgenden nicht blind den Befehl zur Schlüsselauswahl (z.B. "key 2") kopieren, sondern an Hand von z.B. "Aufruf" und "verfällt" den korrekten Schlüssel wählen!
$ gpg --edit-key A3DD814C
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Geheimer Schlüssel ist vorhanden.
pub 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals Aufruf: SC
Vertrauen: uneingeschränkt Gültigkeit: uneingeschränkt
sub 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: S
sub 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: E
sub 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: A
sub 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals Aufruf: E
[ uneing.] (1). Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
[ uneing.] (2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
[ uneing.] (3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> key 2
pub 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals Aufruf: SC
Vertrauen: uneingeschränkt Gültigkeit: uneingeschränkt
sub 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: S
sub* 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: E
sub 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: A
sub 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals Aufruf: E
[ uneing.] (1). Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
[ uneing.] (2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
[ uneing.] (3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> usage
Changing usage of a subkey.
Mögliche Vorgänge eines RSA-Schlüssels: Signieren Verschl. Authentisierung
Derzeit erlaubte Vorgänge: Signieren Verschl.
(U) Umschalten der Signaturfähigkeit
(V) Umschalten der Verschlüsselungsfähigkeit
(A) Umschalten der Authentisierungsfähigkeit
(Q) Beenden
Ihre Auswahl? v
Mögliche Vorgänge eines RSA-Schlüssels: Signieren Verschl. Authentisierung
Derzeit erlaubte Vorgänge: Signieren
(U) Umschalten der Signaturfähigkeit
(V) Umschalten der Verschlüsselungsfähigkeit
(A) Umschalten der Authentisierungsfähigkeit
(Q) Beenden
Ihre Auswahl? q
Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren.
Benutzer: "Max Mustermann (born 1976-02-01 in Musterstadt, Germany)"
2048-Bit RSA Schlüssel, ID A3DD814C, erzeugt 2013-10-06
pub 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals Aufruf: SC
Vertrauen: uneingeschränkt Gültigkeit: uneingeschränkt
sub 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: S
sub* 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: S
sub 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: A
sub 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals Aufruf: E
[ uneing.] (1). Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
[ uneing.] (2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
[ uneing.] (3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> save
Sollte es den Befehl "usage" nicht geben, wird nicht die gepatchte GnuPG-Version genutzt (s.o.).
Schlüssel auf Karte verschieben
Der eigentliche Signaturschlüssel wird nun durch den Verschlüsselungs-Schlüssel ersetzt:
$ gpg --edit-key A3DD814C
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Geheimer Schlüssel ist vorhanden.
pub 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals Aufruf: SC
Vertrauen: uneingeschränkt Gültigkeit: uneingeschränkt
sub 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: S
sub 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: S
sub 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: A
sub 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals Aufruf: E
[ uneing.] (1). Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
[ uneing.] (2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
[ uneing.] (3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> toggle
sec 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: niemals
(1) Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
(2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
(3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> key 3
sec 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: niemals
ssb* 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: niemals
(1) Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
(2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
(3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> keytocard
Signature key ....: A999 E9F2 470A 7D32 0628 CBC6 6DCB 2754 C5F2 B24A
Encryption key....: 30FE EFC9 67AC 8E65 1523 03A1 5F78 0E9C 6FC8 2C96
Authentication key: 986F 3F5E 2CBE 904C 8CFB 9422 CEDC 0EAB AB60 5DFC
Wählen Sie den Speicherort für den Schlüssel:
(1) Signatur-Schlüssel
(3) Authentisierungs-Schlüssel
Ihre Auswahl? 1
gpg: WARNING: such a key has already been stored on the card!
Vorhandenen Schlüssel ersetzen? (j/N) j
Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren.
Benutzer: "Max Mustermann (born 1976-02-01 in Musterstadt, Germany)"
2048-Bit RSA Schlüssel, ID 6FC82C96, erzeugt 2013-10-06
sec 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: niemals
ssb* 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: niemals
Kartennummer:0005 000010B1
ssb 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: niemals
(1) Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
(2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
(3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> save
Nun befindet sich der eigentliche Verschlüsselungs-Schlüssel als Signatur-Schlüssel auf der Karte (am ">" zu erkennen):
$ gpg --list-secret-keys
/home/mmustermann/.gnupg/secring.gpg
---------------------------------
sec 2048R/A3DD814C 2013-10-06
uid Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
uid Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
uid Max Mustermann (privat) <maxm@mustermann-privat.de>
ssb 2048R/177416CC 2013-10-06
ssb 2048R/C5F2B24A 2013-10-06
ssb> 2048R/6FC82C96 2013-10-06
ssb 2048R/AB605DFC 2013-10-06
Zertifikatsanforderung erstellen
Da sich der Karteninhalt geändert hat, lesen wir diese nochmal neu in gpgsm ein:
$ rm ~/.gnupg/private-keys-v1.d/*
$ gpgsm --learn-card
Der Rest funktioniert nun fast so wie schon beim eigentlichen Signaturschlüssel beschrieben, nur daß als "mögliche Vorgänge" die 3 (verschlüsseln) gewählt wird:
$ gpgsm --gen-key > ~/mmustermann-crypt-csr.pem
gpgsm (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
(1) RSA
(2) Vorhandener Schlüssel
(3) Vorhandener Schlüssel auf der Karte
Ihre Auswahl? 3
Karten-Seriennummer: D2760001240102000005000010B10000
Vorhandene Schlüssel:
(1) 2561DB6401CC9388B3B9E487E13B99E9D14FA81F OPENPGP.1
(2) 2561DB6401CC9388B3B9E487E13B99E9D14FA81F OPENPGP.2
(3) 4CCCA587122896DE936BF6F8F81673713380787D OPENPGP.3
Ihre Auswahl? 1
Mögliche Vorgänge eines RSA-Schlüssels:
(1) signieren, verschlüsseln
(2) signieren
(3) verschlüsseln
Ihre Auswahl? 3
Bitte geben sie den Namen des X.509 Subjekts ein: C=DE, ST=Thueringen, L=Gera, O=Unitas Network GmbH, OU=Crypt, CN=Max Mustermann, EMAIL=mmustermann@unitas-network.de
Email-Adresse eingeben (Beenden mit einer leeren Zeile):
> mmustermann@unitas-network.de
> mmustermann@unitas-network.com
> mmustermann@unitas-network.net
>
DNS Namen eingeben (Optional. Beenden mit einer leeren Zeile):
>
Bitte geben Sie die URIs ein (Optional. Beenden mit einer leeren Zeile):
>
Parameter die für die Zertifikatsanforderung benutzt werden sollen:
Key-Type: card:OPENPGP.1
Key-Length: 1024
Key-Usage: encrypt
Name-DN: C=DE, ST=Thueringen, L=Gera, O=Unitas Network GmbH, OU=Crypt, CN=Max Mustermann, EMAIL=mmustermann@unitas-network.de
Name-Email: mmustermann@unitas-network.de
Name-Email: mmustermann@unitas-network.com
Name-Email: mmustermann@unitas-network.net
Really create request? (y/N) y
Die Zertifikatsanforderung wird erzeugt. Dies kann einen Moment dauern ...
gpgsm: about to sign CSR for key: &2561DB6401CC9388B3B9E487E13B99E9D14FA81F
gpgsm: certificate request created
Fertig. Sie sollten nun diese Anforderung an die CA senden.
Auch hier lassen wir uns die Anforderung nochmal anzeigen:
$ openssl req -noout -text -in mmustermann-crypt-csr.pem
Certificate Request:
Data:
Version: 0 (0x0)
Subject: emailAddress=mmustermann@unitas-network.de, CN=Max Mustermann, OU=Crypt, O=Unitas Network GmbH, L=Gera, ST=Thueringen, C=DE
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:eb:43:f4:a2:c9:28:bb:c8:a8:58:19:53:e3:22:
d8:d5:03:bb:4b:8d:59:a8:6a:02:7c:4d:a6:63:97:
3c:6d:94:36:de:6a:fc:55:70:9c:d4:03:04:17:cc:
3d:ef:c7:ce:96:c5:32:3b:f2:b6:a2:9a:ba:37:cf:
14:a4:ad:27:e3:86:13:62:c2:0e:02:97:3a:4d:90:
50:67:12:e9:2f:7a:2a:12:95:60:9f:82:54:c5:87:
dd:c9:e9:93:0e:b7:07:50:ed:58:fc:a8:26:1d:57:
8d:dc:7e:69:56:59:df:14:75:e9:ce:be:49:af:67:
6b:d7:d6:67:ee:38:89:ab:78:c5:cc:bf:09:eb:46:
ab:3a:12:87:7d:04:d9:82:64:ee:ce:d8:3f:bd:bd:
d1:8c:3f:e5:cd:d9:07:f7:69:e8:5e:d6:37:bf:72:
ae:a1:69:31:3d:76:8c:50:9b:de:3b:63:10:ee:80:
e3:33:81:a8:ef:a0:e6:e6:4a:b7:8e:76:2b:f3:3a:
55:c9:6b:e2:c4:98:a0:43:c4:db:c3:81:29:d4:c9:
c1:1b:e8:ee:ec:95:c3:d6:2d:53:ee:2b:5e:2a:97:
a0:a0:34:56:ad:07:89:02:ca:b5:59:8e:f5:98:9c:
bf:53:51:fb:e4:cd:4b:fa:1a:f7:64:86:d4:5d:95:
4f:0f
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Alternative Name:
email:mmustermann@unitas-network.de, email:mmustermann@unitas-network.com, email:mmustermann@unitas-network.net
X509v3 Key Usage: critical
Key Encipherment, Data Encipherment
Signature Algorithm: sha1WithRSAEncryption
54:ae:09:17:48:91:83:7e:ce:ac:59:c1:d7:e2:90:ec:54:af:
65:39:23:55:72:12:0e:54:37:7d:b5:13:cc:44:7c:04:e1:f9:
7d:50:13:b4:de:b6:5b:57:45:b3:8d:7e:ce:65:8f:35:f6:31:
50:99:9b:02:40:bf:0e:2c:0f:98:ae:c0:9c:00:fe:1c:7f:a1:
dd:cc:96:ca:26:28:f6:df:b5:86:d2:14:f2:59:95:d3:4c:ba:
7d:16:cb:85:98:a7:01:e6:ad:fb:9d:54:47:db:8d:a4:2a:03:
89:7d:6b:97:4d:ca:34:08:72:c3:4a:dc:b1:e0:f1:59:9a:cb:
0d:cf:2d:53:58:7d:e1:0e:b1:b5:7a:17:47:a8:a9:5c:db:e5:
fd:53:99:9b:b1:c3:22:3d:ce:c5:ff:d5:2c:78:1a:93:3a:78:
58:13:c9:03:1e:5a:d6:e7:86:cf:6b:3f:af:e5:8c:64:5a:45:
0f:55:d3:78:8f:f7:2a:7c:b2:97:7c:a4:ff:e2:1c:89:53:af:
04:d1:b6:8f:ff:58:d1:88:69:d7:1b:06:c6:e1:43:99:c4:fa:
03:a0:4e:21:f2:82:6f:cc:e2:a1:71:9c:97:46:bf:15:5e:88:
ca:14:8d:cb:41:63:d2:73:71:58:6b:0d:02:cc:8b:71:11:8a:
df:67:31:9e
Signaturschlüssel auf Karte wiederherstellen
Der temporär als Signaturschlüssel gespeicherte Verschlüsselungs-Schlüssel wird nun wieder durch den eigentlichen Signaturschlüssel ersetzt:
$ gpg --edit-key A3DD814C
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Geheimer Schlüssel ist vorhanden.
pub 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals Aufruf: SC
Vertrauen: uneingeschränkt Gültigkeit: uneingeschränkt
sub 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: S
sub 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: S
sub 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: 2015-10-06 Aufruf: A
sub 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals Aufruf: E
[ uneing.] (1). Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
[ uneing.] (2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
[ uneing.] (3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> toggle
sec 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: niemals
Kartennummer:0005 000010B1
ssb 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: niemals
(1) Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
(2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
(3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> key 2
sec 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals
ssb* 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: niemals
Kartennummer:0005 000010B1
ssb 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: niemals
(1) Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
(2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
(3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> keytocard
Signature key ....: 30FE EFC9 67AC 8E65 1523 03A1 5F78 0E9C 6FC8 2C96
Encryption key....: 30FE EFC9 67AC 8E65 1523 03A1 5F78 0E9C 6FC8 2C96
Authentication key: 986F 3F5E 2CBE 904C 8CFB 9422 CEDC 0EAB AB60 5DFC
Wählen Sie den Speicherort für den Schlüssel:
(1) Signatur-Schlüssel
(3) Authentisierungs-Schlüssel
Ihre Auswahl? 1
gpg: WARNING: such a key has already been stored on the card!
Vorhandenen Schlüssel ersetzen? (j/N) j
Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren.
Benutzer: "Max Mustermann (born 1976-02-01 in Musterstadt, Germany)"
2048-Bit RSA Schlüssel, ID C5F2B24A, erzeugt 2013-10-06
sec 2048R/A3DD814C erzeugt: 2013-10-06 verfällt: niemals
ssb 2048R/177416CC erzeugt: 2013-10-06 verfällt: niemals
ssb* 2048R/C5F2B24A erzeugt: 2013-10-06 verfällt: niemals
Kartennummer:0005 000010B1
ssb 2048R/6FC82C96 erzeugt: 2013-10-06 verfällt: niemals
Kartennummer:0005 000010B1
ssb 2048R/AB605DFC erzeugt: 2013-10-06 verfällt: niemals
(1) Max Mustermann (born 1976-02-01 in Musterstadt, Germany)
(2) Max Mustermann (Unitas Network) <mmustermann@unitas-network.de>
(3) Max Mustermann (privat) <maxm@mustermann-privat.de>
gpg> save
Backup-Schlüsselbund entfernen
Das wurde auch bereits in "OpenPGP Card initialisieren" beschrieben:
$ rm ~/.gnupg/secring.gpg
$ rm ~/.gnupg/pubring.gpg
$ mv ~/.gnupg/secring.gpg.clean ~/.gnupg/secring.gpg
$ mv ~/.gnupg/pubring.gpg.clean ~/.gnupg/pubring.gpg
Damit verfügen Karten und lokaler Schlüsselbund wieder über den ursprünglichen Inhalt. Nur gpgsm muß noch den aktuellen Kartenstatus holen:
$ rm ~/.gnupg/private-keys-v1.d/*
$ gpgsm --learn-card
Zertifikat erstellen
Nach dem Import der beiden Zertifikatsanforderungen (mmustermann-crypt-csr.pem und mmustermann-sign-csr.pem) in die CA werden diese signiert und damit 2 Zertifikate ausgestellt.Dabei ist zu beachten, daß die Schlüsselnutzung (Usage) laut Antrag (Verschlüsseln oder Signieren) erhalten bleibt.
Die Zertifikate werden im PEM-Format exportiert (mmustermann-crypt-cert.pem und mmustermann-sign-cert.pem). Außerdem sollte das Root-Zertifikat der CA im PEM-Format vorliegen (Unitas-Network-cacert.pem).
Zertifikate importieren
Root- und Benutzer-Zertifikat können nun importiert werden:
$ gpgsm --import Unitas-Network-cacert.pem
gpgsm: gesamte verarbeitete Anzahl: 1
gpgsm: importiert: 1
$ gpgsm --import mmustermann-sign-cert.pem
gpgsm: gesamte verarbeitete Anzahl: 1
gpgsm: importiert: 1
$ gpgsm --import mmustermann-crypt-cert.pem
gpgsm: gesamte verarbeitete Anzahl: 1
gpgsm: importiert: 1
Anschließend kann man sich die Zertifikate anzeigen lassen:
$ gpgsm --list-keys
~/.gnupg/pubring.kbx
---------------------------------
ID: 0xFFFFFFFF9C294A6B
S/N: 0096A601DB1CC451DC
Issuer: /CN=Unitas Signing Authority/OU=Signing Authority/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=ca@unitas-network.de
Subject: /CN=Unitas Signing Authority/OU=Signing Authority/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=ca@unitas-network.de
aka: ca@unitas-network.de
validity: 2008-09-01 13:25:16 through 2018-08-30 13:25:16
key type: 2048 bit RSA
key usage: certSign crlSign
chain length: unlimited
fingerprint: E0:B3:92:D6:CB:3F:53:95:8A:85:A2:6E:99:D4:77:A4:9C:29:4A:6B
ID: 0x39A8AB30
S/N: 0096A601DB1CC451E6
Issuer: /CN=Unitas Signing Authority/OU=Signing Authority/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=ca@unitas-network.de
Subject: /CN=Max Mustermann/OU=Sign/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=mmustermann@unitas-network.de
aka: mmustermann@unitas-network.de
aka: mmustermann@unitas-network.com
aka: mmustermann@unitas-network.net
validity: 2013-10-14 13:54:00 through 2014-10-14 13:54:00
key type: 2048 bit RSA
key usage: digitalSignature nonRepudiation
fingerprint: 39:96:F7:A8:2D:2F:3E:86:E0:E0:01:F8:B3:64:20:EE:39:A8:AB:30
ID: 0x1A4D0699
S/N: 0096A601DB1CC451E5
Issuer: /CN=Unitas Signing Authority/OU=Signing Authority/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=ca@unitas-network.de
Subject: /CN=Max Mustermann/OU=Crypt/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=mmustermann@unitas-network.de
aka: mmustermann@unitas-network.de
aka: mmustermann@unitas-network.com
aka: mmustermann@unitas-network.net
validity: 2013-10-14 13:52:00 through 2014-10-14 13:52:00
key type: 2048 bit RSA
key usage: keyEncipherment dataEncipherment
fingerprint: 9B:34:D3:48:8A:08:EA:12:C9:3A:72:B5:6A:D0:19:ED:1A:4D:06:99
Anpassen Konfiguration
Um den selbst erstellten/importieren Schlüsseln bzw. Zertifikaten vertrauen zu können und diese somit zum Signieren und Verschlüsseln nutzen zu können, müssen folg. Dateien in ~/.gnupg angepaßt werden:
gpg-agent.conf
allow-mark-trusted
gpgsm.conf
disable-trusted-cert-crl-check
disable-crl-checks
disable-policy-checks
auto-issuer-key-retrieve
trustlist.txt
E0:B3:92:D6:CB:3F:53:95:8A:85:A2:6E:99:D4:77:A4:9C:29:4A:6B S
In der trustlist.txt steht der Fingerprint des CA-Zertifikates, wie er mit "gpgsm --list-keys" angezeigt wurde.
Ist alles korrekt, werden die Benutzer-Zertifikat dem geheimen Schlüssel auf der Karte zugeordnet:
$ gpgsm --list-secret-keys
/home/jdeckert/.gnupg/pubring.kbx
---------------------------------
ID: 0x39A8AB30
S/N: 0096A601DB1CC451E6
Issuer: /CN=Unitas Signing Authority/OU=Signing Authority/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=ca@unitas-network.de
Subject: /CN=Max Mustermann/OU=Sign/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=mmustermann@unitas-network.de
aka: mmustermann@unitas-network.de
aka: mmustermann@unitas-network.com
aka: mmustermann@unitas-network.net
validity: 2013-10-14 13:54:00 through 2014-10-14 13:54:00
key type: 2048 bit RSA
key usage: digitalSignature nonRepudiation
fingerprint: 39:96:F7:A8:2D:2F:3E:86:E0:E0:01:F8:B3:64:20:EE:39:A8:AB:30
card s/n: D2760001240102000005000010B10000
ID: 0x1A4D0699
S/N: 0096A601DB1CC451E5
Issuer: /CN=Unitas Signing Authority/OU=Signing Authority/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=ca@unitas-network.de
Subject: /CN=Max Mustermann/OU=Crypt/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=mmustermann@unitas-network.de
aka: mmustermann@unitas-network.de
aka: mmustermann@unitas-network.com
aka: mmustermann@unitas-network.net
validity: 2013-10-14 13:52:00 through 2014-10-14 13:52:00
key type: 2048 bit RSA
key usage: keyEncipherment dataEncipherment
fingerprint: 9B:34:D3:48:8A:08:EA:12:C9:3A:72:B5:6A:D0:19:ED:1A:4D:06:99
card s/n: D2760001240102000005000010B10000
Unter KDE sollte in Kleopatra das Zertifikat nun unter "meine Zertifikate" angezeigt werden. Damit kann es z.B. auch in der KMail-Konfiguration der entsprechenden Identität zugeordnet werden (unter "Kryptografie"als S/MIME-Signaturzertifikat und S/MIME-Verschlüsselungszertifikat).
Test
Ver- und Entschlüsseln
Wir erstellen eine Testdatei:
$ echo "Das ist ein Test" > ~/Test.txt
und verschlüsseln diese an uns selbst. Dazu benötigen wir den Keygrip:
$ gpgsm --dump-cert mmustermann | egrep "keygrip|keyUsage"
keygrip: E978E23BC41B8B741800305E70369D773B6D9C5A
keyUsage: digitalSignature nonRepudiation
keygrip: 2561DB6401CC9388B3B9E487E13B99E9D14FA81F
keyUsage: keyEncipherment dataEncipherment
Im Beispiel ist der Verschlüsselungsschlüssel der zweite (2561DB6401CC9388B3B9E487E13B99E9D14FA81F). Diesen nutzen wir als Parameter:
$ gpgsm --armor --encrypt --recipient "&2561DB6401CC9388B3B9E487E13B99E9D14FA81F" Test.txt >Test.txt.asc
gpgsm: encrypted data created
Das Entschlüsseln testen wir mit:
$ gpgsm --decrypt Test.txt.asc
gpgsm: DBG: recp 0 - issuer: `1.2.840.113549.1.9.1=#636140756E697461732D6E6574776F726B2E6465,CN=Unitas Signing Authority,OU=Signing Authority,O=Unitas Network GmbH,L=Gera,ST=Thueringen,C=DE'
gpgsm: DBG: recp 0 - serial: 0096A601DB1CC451E5
Das ist ein Test
Dabei muß die Karten-PIN abgefragt werden. In der letzten Zeile steht der entschlüsselte Text - es hat alo funktioniert. Das Entschlüsseln sollte nun nochmal ohne eingelegte Karte getestet werden, das darf dann nicht funktionieren.
Signieren
Nun signieren wir die Testdatei mit dem privaten Schlüssel:
$ gpgsm --armor --sign Test.txt >Test.txt.asc
gpgsm: Das Zertifikat kann nicht zum Signieren benutzt werden
gpgsm: Das Zertifikat kann nicht zum Signieren benutzt werden
gpgsm: policies not checked due to --disable-policy-checks option
gpgsm: CRLs not checked due to --disable-crl-checks option
gpgsm: signature created
Dabei muß wieder die Karten-PIN korrekt eingegeben werden.
Die erzeugte Signatur können wir noch prüfen:
$ gpgsm --verify Test.txt.asc
gpgsm: Signatur erzeugt am 2013-10-14 14:41:55 mittels Zertifikat ID 0x39A8AB30
gpgsm: policies not checked due to --disable-policy-checks option
gpgsm: CRLs not checked due to --disable-crl-checks option
gpgsm: Korrekte Signatur von "/CN=Max Mustermann/OU=Sign/O=Unitas Network GmbH/L=Gera/ST=Thueringen/C=DE/EMail=mmustermann@unitas-network.de"
gpgsm: alias "mmustermann@unitas-network.de"
gpgsm: alias "mmustermann@unitas-network.com"
gpgsm: alias "mmustermann@unitas-network.net"
Damit ist die korrekte Funktion überprüft.
Artikelaktionen