Direkt zum Inhalt | Direkt zur Navigation

Benutzerspezifische Werkzeuge

Unitas Network GmbH

This Slogan Viewlet registered to Chameleon Theme
Sie sind hier: Startseite / Wissenswertes / Anleitungen / Smartcards / OpenPGP Card und Zertifikate

OpenPGP Card und Zertifikate

Nutzung der OpenPGP Card mit X.509 Zertifikaten. Damit ist dann z.B. S/MIME und Browserauthentication möglich.

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:

  1. Backup der privaten GnuPG-Schlüssel einspielen
  2. Funktion (Leistungsfähigkeit, Usage) des Verschlüsselungs-Schlüssels von "Verschlüsseln" in "Signieren" ändern
  3. Schlüssel als Signatur-Schlüssel auf die Karte verschieben
  4. Zertifikatsanforderung erstellen
  5. den "richtigen" Signatur-Schlüssel wieder auf die Karte schieben
  6. 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