{"id":4436,"date":"2026-10-26T07:00:00","date_gmt":"2026-10-26T06:00:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=4436"},"modified":"2026-10-25T20:16:27","modified_gmt":"2026-10-25T19:16:27","slug":"eine-openpgp-smartcard-ein-thinkpad-gnupg-fedora-und-ich","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/eine-openpgp-smartcard-ein-thinkpad-gnupg-fedora-und-ich\/","title":{"rendered":"Eine OpenPGP-Smartcard, ein ThinkPad, GnuPG, Fedora und ich"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Mit diesem Beitrag teile ich meine Erfahrungen mit der Inbetriebnahme einer <a href=\"https:\/\/de.wikipedia.org\/wiki\/OpenPGP\">OpenPGP<\/a>&#8211;<a href=\"https:\/\/de.wikipedia.org\/wiki\/Chipkarte\">Smartcard<\/a> und des Smartcard-Leser in meinem ThinkPad T14s Gen1. Ihr erfahrt, was alles zu tun war und was ich davon halte. Aber beginnen wir doch ganz am Anfang.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Motivation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Es war einmal die <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/meine-froscon-2026\/\" data-type=\"post\" data-id=\"4404\">FrOSCon 2026<\/a>. Dort sah ich am Merchandise-Stand im Foyer diese schicken OpenPGP-Smartcards und einige Karten-Lese\/Schreib-Ger\u00e4te ausliegen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich sprach meine Bekannten auf ihre Erfahrungen mit diesen Karten und GnuPG an, welche \u00fcberwiegend mit Kopfsch\u00fctteln und St\u00f6hnen reagierten. Offenbar sind sie nicht so leicht f\u00fcr etwas zu interessieren wie ich. Doch schien mir das Thema f\u00fcr den Moment weniger reizvoll und ich habe das Thema erstmal vertagt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das Thema lie\u00df mich jedoch nicht los und so habe ich auf der Zugfahrt nach Hause nochmal nachgelesen, was es mit <a href=\"https:\/\/gnupg.org\">GnuPG<\/a> und <a href=\"https:\/\/www.openpgp.org\">OpenPGP<\/a> auf sich hat. Denn dass ich mich zuletzt damit besch\u00e4ftigt hatte, war schon eine Weile her.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mein ThinkPad T14s Gen1 besitzt einen Smartcard-Leser, den ich bisher noch nie verwendet hatte. Dieser lachte mich geradezu an und vielleicht half noch der ein oder andere Satz von Christian und ich bestellte mir die <a href=\"https:\/\/www.floss-shop.de\/de\/security-privacy\/smartcards\/4\/openpgp-smart-card-v3.4-mifare-desfire?c=5\">OpenPGP Smart Card V3.4 + MiFare DESFire<\/a> im <a href=\"https:\/\/www.floss-shop.de\">FLOSS-Shop<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Inbetriebnahme von Kartenleser und Erkennen der Karte<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Das kann doch nicht so schwer sein. Das ist doch schnell erledigt.<\/p>\n<cite>Ber\u00fchmte letzte Worte unbekannter Herkunft.<\/cite><\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --card-status\ngpg: selecting card failed: No such device\ngpg: OpenPGP card not available: No such device<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Vorstehender Code-Block zeigt, dass es nicht auf Anhieb klappte. Dann halt erstmal Fehlersuche bzw. die Suche nach Dokumentation und Anleitungen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der erste Fehler war schnell gefunden. Der Smartcard-Leser war im UEFI noch deaktiviert. Ich habe die Angewohnheit, alle Ger\u00e4te, die ich nicht regelm\u00e4\u00dfig verwende, dort abzuschalten. Nachdem der Kartenleser aktiviert war, wurde er auch von Linux erkannt \u2013 von <code>gpg<\/code> jedoch nicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Auf der <a href=\"https:\/\/www.floss-shop.de\/de\/security-privacy\/smartcards\/4\/openpgp-smart-card-v3.4-mifare-desfire?c=5\">Produktseite<\/a> wird folgende URL zu Anleitungen und Erkl\u00e4rungen zu GnuPG, Kartenlesern mit und ohne Pinpad und zur Einrichtung und Verwendung der OpenPGP-Karte verlinkt: <a href=\"https:\/\/wiki.datenkollektiv.net\/public\/gnupg\/gnupg-card-howto\">https:\/\/wiki.datenkollektiv.net\/public\/gnupg\/gnupg-card-howto<\/a>. Leider lieferte dieser Link einen <a href=\"https:\/\/de.wikipedia.org\/wiki\/HTTP-Statuscode#code502\">HTTP-502-Fehler<\/a> zur\u00fcck, als ich die Seite gebraucht h\u00e4tte. Also habe ich das Sprachmodell meiner Wahl um Rat gebeten, welches mir geraten hat, doch erstmal die erforderlichen Treiber und Tools zur Nutzung des Kartenlesers zu installieren. Na gut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ sudo dnf install pcsc-lite pcsc-lite-ccid pcsc-tools\n~]$ sudo systemctl enable --now pcscd.service<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Leider war es damit noch nicht getan und das Sprachmodell fing langsam das Halluzinieren an. Also bediente ich mich der Suchmaschine meines geringsten Misstrauens und recherchierte auf althergebrachte Weise. Ich war schon ziemlich genervt, als ich endlich einen passenden Hinweis in der <a href=\"https:\/\/docs.nitrokey.com\/nitrokeys\/features\/openpgp-card\/fedora-gnupg-configuration\">Nitrokey-Dokumentation<\/a> fand. Nachdem ich diese durchgearbeitet hatte, war ich einen gro\u00dfen Schritt weiter:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --card-status\nReader ...........: Alcor Micro AU9540 00 00\nApplication ID ...: D27600012401030400050000DA260000\nApplication type .: OpenPGP\nVersion ..........: 3.4\nManufacturer .....: ZeitControl\nSerial number ....: 0000DA26\nName of cardholder: &#91;not set]\nLanguage prefs ...: de\nSalutation .......: \nURL of public key : &#91;not set]\nLogin data .......: &#91;not set]\nSignature PIN ....: forced\nKey attributes ...: rsa2048 rsa2048 rsa2048\nMax. PIN lengths .: 64 64 64\nPIN retry counter : 3 0 3\nSignature counter : 0\nKDF setting ......: off\nSignature key ....: &#91;none]\nEncryption key....: &#91;none]\nAuthentication key: &#91;none]\nGeneral key info..: &#91;none]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Karte wird von <code>gpg<\/code> erkannt, ist wie erwartet noch leer und kann nun endlich benutzt werden. Die Karte ist mit einer PIN und einer Admin-PIN versehen, welche bei bestimmten Operationen bzw. zum Entsperren der Karte abgefragt werden. Beide PINs sind auf individuelle PINs zu \u00e4ndern. Sonst ist das Ganze sinnlos (siehe <code>--change-pin<\/code>).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">GPG-Schl\u00fcssel auf der Karte generieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ab hier hilft die Manpage <code>gpg(1)<\/code> weiter. Der folgende Code-Block zeigt die Abfolge von Befehlen zur Generierung von GPG-Schl\u00fcsseln auf der Karte:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --edit-card\n\nReader ...........: Alcor Micro AU9540 00 00\nApplication ID ...: D27600012401030400050000DA260000\nApplication type .: OpenPGP\nVersion ..........: 3.4\nManufacturer .....: ZeitControl\nSerial number ....: 0000DA26\nName of cardholder: &#91;not set]\nLanguage prefs ...: de\nSalutation .......: \nURL of public key : &#91;not set]\nLogin data .......: &#91;not set]\nSignature PIN ....: forced\nKey attributes ...: rsa2048 rsa2048 rsa2048\nMax. PIN lengths .: 64 64 64\nPIN retry counter : 3 0 3\nSignature counter : 0\nKDF setting ......: off\nSignature key ....: &#91;none]\nEncryption key....: &#91;none]\nAuthentication key: &#91;none]\nGeneral key info..: &#91;none]\n\ngpg\/card&gt; admin\nAdmin commands are allowed\n\ngpg\/card&gt; generate\nMake off-card backup of encryption key? (Y\/n) Y\n\nPlease note that the factory settings of the PINs are\n   PIN = '123456'     Admin PIN = '12345678'\nYou should change them using the command --change-pin\n\nPlease specify how long the key should be valid.\n         0 = key does not expire\n      &lt;n&gt;  = key expires in n days\n      &lt;n&gt;w = key expires in n weeks\n      &lt;n&gt;m = key expires in n months\n      &lt;n&gt;y = key expires in n years\nKey is valid for? (0) \nKey does not expire at all\nIs this correct? (y\/N) y\n\nGnuPG needs to construct a user ID to identify your key.\n\nReal name: Bob\nEmail address: bob@example.com\nComment: der Baumeister\nYou selected this USER-ID:\n    \"Bob (der Baumeister) &lt;bob@example.com&gt;\"\n\nChange (N)ame, (C)omment, (E)mail or (O)kay\/(Q)uit? O\nWe need to generate a lot of random bytes. It is a good idea to perform\nsome other action (type on the keyboard, move the mouse, utilize the\ndisks) during the prime generation; this gives the random number\ngenerator a better chance to gain enough entropy.\nrogpg: Note: backup of card key saved to '\/home\/jkastning\/.gnupg\/sk_9C88B267003429CB.gpg'\ngpg: revocation certificate stored as '\/home\/jkastning\/.gnupg\/openpgp-revocs.d\/2B3FFC727504AFFAEF0C50C080B662D727FEFF5F.rev'\npublic and secret key created and signed.\n\npub   rsa2048 2026-10-23 &#91;SC]\n      2B3FFC727504AFFAEF0C50C080B662D727FEFF5F\nuid                      Bob (der Baumeister) &lt;bob@example.com&gt;\nsub   rsa2048 2026-10-23 &#91;A]\nsub   rsa2048 2026-10-23 &#91;E]\n\n\ngpg\/card&gt; list\n\nReader ...........: Alcor Micro AU9540 00 00\nApplication ID ...: D27600012401030400050000DA260000\nApplication type .: OpenPGP\nVersion ..........: 3.4\nManufacturer .....: ZeitControl\nSerial number ....: 0000DA26\nName of cardholder: &#91;not set]\nLanguage prefs ...: de\nSalutation .......: \nURL of public key : &#91;not set]\nLogin data .......: &#91;not set]\nSignature PIN ....: forced\nKey attributes ...: rsa2048 rsa2048 rsa2048\nMax. PIN lengths .: 64 64 64\nPIN retry counter : 3 0 3\nSignature counter : 4\nKDF setting ......: off\nSignature key ....: 2B3F FC72 7504 AFFA EF0C  50C0 80B6 62D7 27FE FF5F\n      created ....: 2026-10-23 18:42:38\nEncryption key....: 35CD 7AA9 CADB CA74 6103  C261 9C88 B267 0034 29CB\n      created ....: 2026-10-23 18:42:38\nAuthentication key: 04C5 D0D4 E501 B90A 51BF  85FE B6C6 967B EFF5 5EF9\n      created ....: 2026-10-23 18:42:38\nGeneral key info..: \npub  rsa2048\/80B662D727FEFF5F 2026-10-23 Bob (der Baumeister) &lt;bob@example.com&gt;\nsec&gt;  rsa2048\/80B662D727FEFF5F  created: 2026-10-23  expires: never     \n                                card-no: 0005 0000DA26\nssb&gt;  rsa2048\/B6C6967BEFF55EF9  created: 2026-10-23  expires: never     \n                                card-no: 0005 0000DA26\nssb&gt;  rsa2048\/9C88B267003429CB  created: 2026-10-23  expires: never     \n                                card-no: 0005 0000DA26\n\ngpg\/card&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Fertig. Auf der Karte befinden sich nun je ein Schl\u00fcsselpaar zum Signieren, Ver- und Entschl\u00fcsseln und f\u00fcr die Authentisierung (z.B. an einem SSH-Dienst). Ein Backup und ein Widerrufszertifikat wurden in folgenden Pfaden gespeichert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Backup: <code>.gnupg\/sk_9C88B267003429CB.gpg<\/code><\/li>\n\n\n\n<li>Widerrufszertifikat: <code>.gnupg\/openpgp-revocs.d\/2B3FFC727504AFFAEF0C50C080B662D727FEFF5F.rev<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Das Off-Card-Backup enth\u00e4lt nur den Encryption Key, nicht aber den Prim\u00e4rschl\u00fcssel.<\/strong> Ich empfehle, beide Dateien sicher und offline aufzubewahren. Sie sollten nicht auf dem Host verbleiben, wo sie kompromittiert werden k\u00f6nnen. Die Schaltkreise auf der Smartcard verhindern, dass der geheime\/private Schl\u00fcssel von der Karte ausgelesen werden kann. So ist auch eine nachtr\u00e4gliche Erstellung einer weiteren Sicherheitskopie nicht m\u00f6glich. <strong>Achtung:<\/strong> Mit dem Off-Card-Backup k\u00f6nnen nicht alle Schl\u00fcssel wiederhergestellt werden. Dies wird in meinen Augen im <a href=\"https:\/\/gnupg.org\/howtos\/card-howto\/en\/smartcard-howto-single.html#id2506175\">GnuPG HOWTO<\/a> nicht deutlich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mir ist bei der Generierung aufgefallen, dass ich weder das Verfahren noch die Schl\u00fcssell\u00e4nge ausw\u00e4hlen konnte. Es wurde RSA 2048 Bit gew\u00e4hlt. Das ist mir ehrlich gesagt zu kurz. Leider gibt weder <code>gpg(1)<\/code> noch das <a href=\"https:\/\/gnupg.org\/documentation\/howtos.html#GnuPG-cardHOWTO\">GnuPG Smartcard HOWTO<\/a> Hinweise, ob sich die Schl\u00fcssell\u00e4nge beeinflussen l\u00e4sst. Erst durch Suchen und Ausprobieren habe ich herausgefunden, dass man diese Parameter mit dem Admin-Befehl <code>key-attr<\/code> \u00e4ndern kann. Der folgende Code-Block zeigt den Weg dorthin:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --edit-card\n\u2026\ngpg\/card&gt; admin\nAdmin commands are allowed\n\ngpg\/card&gt; key-attr\nChanging card key attribute for: Signature key\nPlease select what kind of key you want:\n   (1) RSA\n   (2) ECC\nYour selection? 2\nPlease select which elliptic curve you want:\n   (1) Curve 25519 *default*\n   (4) NIST P-384\n   (6) Brainpool P-256\nYour selection? \nThe card will now be re-configured to generate a key of type: ed25519\nNote: There is no guarantee that the card supports the requested\n      key type or size.  If the key generation does not succeed,\n      please check the documentation of your card to see which\n      key types and sizes are supported.\nChanging card key attribute for: Encryption key\nPlease select what kind of key you want:\n   (1) RSA\n   (2) ECC\nYour selection?<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die folgenden Beispiele nutze ich jedoch weiterhin den bereits erstellten rsa2048-Schl\u00fcssel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im Schl\u00fcsselbund des Hosts werden die Schl\u00fcssel wie folgt dargestellt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --list-keys\npub   rsa2048 2026-10-23 &#91;SC]\n      2B3FFC727504AFFAEF0C50C080B662D727FEFF5F\nuid           &#91;ultimate] Bob (der Baumeister) &lt;bob@example.com&gt;\nsub   rsa2048 2026-10-23 &#91;A]\nsub   rsa2048 2026-10-23 &#91;E]\n\n~]$ gpg --list-secret-keys\nsec&gt;  rsa2048 2026-10-23 &#91;SC]\n      2B3FFC727504AFFAEF0C50C080B662D727FEFF5F\n      Card serial no. = 0005 0000DA26\nuid           &#91;ultimate] Bob (der Baumeister) &lt;bob@example.com&gt;\nssb&gt;  rsa2048 2026-10-23 &#91;A]\nssb&gt;  rsa2048 2026-10-23 &#91;E]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zuerst werden die \u00f6ffentlichen Schl\u00fcssel angezeigt, die im Schl\u00fcsselbund des Hosts gespeichert sind. Ich empfehle, diese ebenfalls zu sichern und auf einem anderen Medium aufzubewahren. Gehen sie verloren, k\u00f6nnen sie nicht mithilfe der Smartcard rekonstruiert werden. Anschlie\u00dfend werden Informationen zu den privaten Schl\u00fcsseln ausgegeben. Das &#8218;&gt;&#8216; hinter den Schl\u00fcsseln zeigt an, dass sich die geheimen\/privaten Schl\u00fcssel auf einer Smartcard befinden und nicht im Schl\u00fcsselbund vorliegen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Eine Datei signieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Schl\u00fcsseloperationen funktionieren wie gewohnt. Statt der Passphrase wird man nach der PIN der Smartcard gefragt. Im folgenden Beispiel signiere ich eine Textdatei, wobei ich explizit angebe, welche User-ID f\u00fcr die Signatur benutzt werden soll. Anschlie\u00dfend verifiziere ich die Signatur:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --sign --local-user bob@example.com datei\n~]$ gpg --verify datei\ndatei      datei.gpg  \n&#91;jkastning@t14s ~]$ gpg --verify datei.gpg \ngpg: Signature made Fr 23 Okt 2026 21:31:44 CEST\ngpg:                using RSA key 4384D92F686DC876A3CFF458E8AF43DE9E151FF3\ngpg:                issuer \"bob@example.com\"\ngpg: checking the trustdb\ngpg: marginals needed: 3  completes needed: 1  trust model: pgp\ngpg: depth: 0  valid:   2  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 2u\ngpg: depth: 1  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 1f, 0u\ngpg: next trustdb check due at 2030-06-22\ngpg: Good signature from \"Bob (der Baumeister) &lt;bob@example.com&gt;\" &#91;ultimate]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Die Karte auf Werkseinstellungen zur\u00fccksetzen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Soll das Schl\u00fcsselmaterial von der Karte entfernt werden, z.B. weil man sie weitergeben m\u00f6chte, kann sie wie folgt auf Werkseinstellungen zur\u00fcckgesetzt werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --edit-card\n\nReader ...........: Alcor Micro AU9540 00 00\nApplication ID ...: D27600012401030400050000DA260000\nApplication type .: OpenPGP\nVersion ..........: 3.4\nManufacturer .....: ZeitControl\nSerial number ....: 0000DA26\nName of cardholder: &#91;not set]\nLanguage prefs ...: de\nSalutation .......: \nURL of public key : &#91;not set]\nLogin data .......: &#91;not set]\nSignature PIN ....: forced\nKey attributes ...: rsa2048 rsa2048 rsa2048\nMax. PIN lengths .: 64 64 64\nPIN retry counter : 3 0 3\nSignature counter : 5\nKDF setting ......: off\nSignature key ....: 4384 D92F 686D C876 A3CF  F458 E8AF 43DE 9E15 1FF3\n      created ....: 2026-10-23 19:29:37\nEncryption key....: 245E CD79 8DF9 D0FE 233B  9C95 D955 9262 22CF B708\n      created ....: 2026-10-23 19:29:37\nAuthentication key: 7C86 CC37 9C74 776B 162E  AE31 FD5C 43DB 9DCD 233E\n      created ....: 2026-10-23 19:29:37\nGeneral key info..: \npub  rsa2048\/E8AF43DE9E151FF3 2026-10-23 Bob (der Baumeister) &lt;bob@example.com&gt;\nsec&gt;  rsa2048\/E8AF43DE9E151FF3  created: 2026-10-23  expires: never     \n                                card-no: 0005 0000DA26\nssb&gt;  rsa2048\/FD5C43DB9DCD233E  created: 2026-10-23  expires: never     \n                                card-no: 0005 0000DA26\nssb&gt;  rsa2048\/D955926222CFB708  created: 2026-10-23  expires: never     \n                                card-no: 0005 0000DA26\n\ngpg\/card&gt; admin\nAdmin commands are allowed\n\ngpg\/card&gt; factory-reset\ngpg: OpenPGP card no. D27600012401030400050000DA260000 detected\n\ngpg: Note: This command destroys all keys stored on the card!\n\nContinue? (y\/N) y\nReally do a factory reset? (enter \"yes\") yes\n\ngpg\/card&gt; list\n\nReader ...........: Alcor Micro AU9540 00 00\nApplication ID ...: D27600012401030400050000DA260000\nApplication type .: OpenPGP\nVersion ..........: 3.4\nManufacturer .....: ZeitControl\nSerial number ....: 0000DA26\nName of cardholder: &#91;not set]\nLanguage prefs ...: de\nSalutation .......: \nURL of public key : &#91;not set]\nLogin data .......: &#91;not set]\nSignature PIN ....: forced\nKey attributes ...: rsa2048 rsa2048 rsa2048\nMax. PIN lengths .: 64 64 64\nPIN retry counter : 3 0 3\nSignature counter : 0\nKDF setting ......: off\nSignature key ....: &#91;none]\nEncryption key....: &#91;none]\nAuthentication key: &#91;none]\nGeneral key info..: &#91;none]\n\ngpg\/card&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bitte denkt dran, auch die entsprechenden Schl\u00fcssel aus dem Schl\u00fcsselbund eures Hosts zu entfernen. Damit ist der saubere Ausgangszustand wiederhergestellt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vorhandene Schl\u00fcssel auf die Smartcard verschieben<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bitte erstellt ein Backup des <code>.gnupg<\/code>-Verzeichnisses, denn eure privaten Schl\u00fcssel werden auf die Karte verschoben (nicht kopiert). Ihr k\u00f6nnt sie anschlie\u00dfend von der Karte nicht zur\u00fcckholen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich demonstriere hier, wie Beispiel-Schl\u00fcssel auf die Karte verschoben werden und werfe anschlie\u00dfend alles weg. Der folgende Code-Block zeigt den Vorgang:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --edit-key B5248E9B6E71B11BD9B979E996E2980D6CF4189E\ngpg (GnuPG) 2.4.9; Copyright (C) 2025 g10 Code GmbH\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n\nSecret key is available.\n\ngpg: checking the trustdb\ngpg: marginals needed: 3  completes needed: 1  trust model: pgp\ngpg: depth: 0  valid:   2  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 2u\ngpg: depth: 1  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 1f, 0u\ngpg: next trustdb check due at 2030-06-22\nsec  brainpoolP256r1\/96E2980D6CF4189E\n     created: 2026-10-24  expires: never       usage: SC  \n     trust: ultimate      validity: ultimate\nssb  brainpoolP256r1\/2403FEED88DD3FE9\n     created: 2026-10-24  expires: never       usage: E   \n&#91;ultimate] (1). Kim &lt;kim@example.com&gt;\n\ngpg&gt; key 1\n\nsec  brainpoolP256r1\/96E2980D6CF4189E\n     created: 2026-10-24  expires: never       usage: SC  \n     trust: ultimate      validity: ultimate\nssb* brainpoolP256r1\/2403FEED88DD3FE9\n     created: 2026-10-24  expires: never       usage: E     \n&#91;ultimate] (1). Kim &lt;kim@example.com&gt;\n\ngpg&gt; keytocard\nPlease select where to store the key:\n   (2) Encryption key\nYour selection? 2\n\nsec  brainpoolP256r1\/96E2980D6CF4189E\n     created: 2026-10-24  expires: never       usage: SC  \n     trust: ultimate      validity: ultimate\nssb* brainpoolP256r1\/2403FEED88DD3FE9\n     created: 2026-10-24  expires: never       usage: E     \n&#91;ultimate] (1). Kim &lt;kim@example.com&gt;\n\nNote: the local copy of the secret key will only be deleted with \"save\".\ngpg&gt; save<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe zuvor lokal einen GPG-Schl\u00fcssel mit dem Algorithmus <a href=\"https:\/\/www.rfc-editor.org\/info\/rfc5639\/\">Brainpool P-256<\/a> erstellt und anschlie\u00dfend den Encryption Key mit <code>keytocard<\/code> in den Encryption-Slot auf der Karte verschoben. Nicht im Code-Block zu sehen ist, wie ich den Hauptschl\u00fcssel in den Signatur-Slot der Karte verschoben habe. Die privaten Schl\u00fcssel von Kim befinden sich nun auf der Karte, was sich mit <code>gpg --card-status<\/code> \u00fcberpr\u00fcfen l\u00e4sst:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --card-status\nReader ...........: Alcor Micro AU9540 00 00\nApplication ID ...: D27600012401030400050000DA260000\nApplication type .: OpenPGP\nVersion ..........: 3.4\nManufacturer .....: ZeitControl\nSerial number ....: 0000DA26\nName of cardholder: &#91;not set]\nLanguage prefs ...: de\nSalutation .......: \nURL of public key : &#91;not set]\nLogin data .......: &#91;not set]\nSignature PIN ....: forced\nKey attributes ...: brainpoolP256r1 brainpoolP256r1 rsa4096\nMax. PIN lengths .: 64 64 64\nPIN retry counter : 3 0 3\nSignature counter : 0\nKDF setting ......: off\nSignature key ....: B524 8E9B 6E71 B11B D9B9  79E9 96E2 980D 6CF4 189E\n      created ....: 2026-10-24 18:20:39\nEncryption key....: 203F 7E4C 23A0 BB06 DB51  B3E9 2403 FEED 88DD 3FE9\n      created ....: 2026-10-24 18:20:39\nAuthentication key: &#91;none]\nGeneral key info..: pub  brainpoolP256r1\/96E2980D6CF4189E 2026-10-24 Kim &lt;kim@example.com&gt;\nsec&gt;  brainpoolP256r1\/96E2980D6CF4189E  created: 2026-10-24  expires: never     \n                                        card-no: 0005 0000DA26\nssb&gt;  brainpoolP256r1\/2403FEED88DD3FE9  created: 2026-10-24  expires: never     \n                                        card-no: 0005 0000DA26\nssb   brainpoolP256r1\/5B658E197413BAE0  created: 2026-10-24  expires: never<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Ausgabe von <code>gpg --list-secret-keys<\/code> zeigt ebenfalls durch das &#8218;&gt;&#8216;-Zeichen an, dass die privaten Schl\u00fcssel auf einer Smartcard liegen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>~]$ gpg --list-secret-keys\nsec&gt;  brainpoolP256r1 2026-10-24 &#91;SC]\n      B5248E9B6E71B11BD9B979E996E2980D6CF4189E\n      Card serial no. = 0005 0000DA26\nuid           &#91;ultimate] Kim &lt;kim@example.com&gt;\nssb&gt;  brainpoolP256r1 2026-10-24 &#91;E]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tut euch selbst einen Gefallen und pr\u00fcft im Vorfeld, welche Algorithmen ihr f\u00fcr eure Schl\u00fcssel verwendet und welche von eurer Smartcard unterst\u00fctzt werden. Versucht ihr, Schl\u00fcssel auf die Karte zu verschieben, die von der Smartcard nicht unterst\u00fctzt werden, schl\u00e4gt dies mit kryptischen Fehlermeldungen fehl. Diese sind so irref\u00fchrend, dass ich ein Sprachmodell um Rat bitten musste, um meinem Fehler auf die Spur zu kommen. Ich hatte zuerst versucht, Schl\u00fcssel mit dem Algorithmus <code>Curve 25519<\/code> auf die Karte zu verschieben. Dieser wird von der Karte nicht unterst\u00fctzt. Die Fehlermeldung behauptete jedoch, ich h\u00e4tte die Admin-PIN falsch eingegeben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c4hnliche Erfahrungen habe ich gemacht, als ich mit dem Befehl <code>key-attr<\/code> die Einstellungen f\u00fcr die Key-Slots auf Parameter \u00e4ndern wollte, welche von der Karte nicht unterst\u00fctzt werden. Auch hier deutete die Fehlermeldung auf eine falsche Admin-PIN hin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Mit 22,00 Euro zzgl. Versandkosten ist die OpenPGP Smart Card V3.4 + MiFare DESFire erschwinglich, sieht schick aus und passt gut ins Portemonnaie. Dar\u00fcber hinaus passt sie selbstverst\u00e4ndlich auch gut in die Smartcard-Leser, die in vielen ThinkPad-Modellen (und ebenfalls in Business-Laptops anderer Hersteller) verbaut sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GnuPG-Dokumentation und -Howto sind zum Thema Smartcard alt und l\u00fcckenhaft. Es bedarf eines gewissen technischen Interesses und Durchhaltewillens, um hier bis ans Ziel zu kommen. Aus meiner Sicht ist dies klar ein Nischenthema f\u00fcr Nerds und Menschen, die zur Nutzung dieser Technologie gezwungen sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich selbst bevorzuge, ein Offline-Backup meiner Schl\u00fcssel sicher aufzubewahren und vorhandene Schl\u00fcssel auf die Smartcard zu verschieben. Denn so kann ich meine GnuPG-Konfiguration wiederherstellen, falls die Smartcard kaputtgeht oder ich zuk\u00fcnftig ein Endger\u00e4t ohne Smartcard-Slot verwende.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Links zu verwandten Beitr\u00e4gen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.my-it-brain.de\/wordpress\/grundlagenwissen-verschluesselungsverfahren\/\" data-type=\"post\" data-id=\"2950\">Grundlagenwissen: Verschl\u00fcsselungsverfahren<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.my-it-brain.de\/wordpress\/der-steinige-weg-zu-verschluesselter-kommunikation\/\" data-type=\"post\" data-id=\"618\">Der steinige Weg zu verschl\u00fcsselter Kommunikation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.my-it-brain.de\/wordpress\/gnupg-web-key-directory-wkd-fuer-my-it-brain\/\" data-type=\"post\" data-id=\"3009\">GnuPG: Web Key Directory (WKD) f\u00fcr My-IT-Brain<\/a><\/li>\n\n\n\n<li>Artikel unter dem Tag <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/tag\/gnupg\/\" data-type=\"post_tag\" data-id=\"210\">GnuPG<\/a><\/li>\n\n\n\n<li>Artikel unter dem Tag <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/tag\/openpgp\/\" data-type=\"post_tag\" data-id=\"211\">OpenPGP<\/a><\/li>\n\n\n\n<li>Mein GnuPG-Schl\u00fcssel auf der Seite <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/zu-meiner-person\/\" data-type=\"page\" data-id=\"1573\">Zu meiner Person<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Mit diesem Beitrag teile ich meine Erfahrungen mit der Inbetriebnahme einer OpenPGP&#8211;Smartcard und des Smartcard-Leser in meinem ThinkPad T14s Gen1. Ihr erfahrt, was alles zu tun war und was ich davon halte. Aber beginnen wir doch ganz am Anfang. Motivation Es war einmal die FrOSCon 2026. Dort sah ich am Merchandise-Stand im Foyer diese schicken<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/eine-openpgp-smartcard-ein-thinkpad-gnupg-fedora-und-ich\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"standard","_metis_text_length":20262,"_post_count":0,"footnotes":""},"categories":[56],"tags":[210,211,430,305,944],"class_list":["post-4436","post","type-post","status-publish","format-standard","hentry","category-hardware","tag-gnupg","tag-openpgp","tag-osbn","tag-planet","tag-smartcard"],"public_identification_id":"932d58a0957d40fe8ca2394e8db28d68","private_identification_id":"7e50c475621a4811bbf3cbd4c07cb8e0","_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/4436","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=4436"}],"version-history":[{"count":8,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/4436\/revisions"}],"predecessor-version":[{"id":4444,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/4436\/revisions\/4444"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=4436"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=4436"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=4436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}