Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
nitrokey:arch:3a [15.12.2024 16:23. ] – [RSA-Schlüssel generieren] django | nitrokey:arch:3a [16.12.2024 20:52. ] (aktuell) – django | ||
---|---|---|---|
Zeile 230: | Zeile 230: | ||
Authentication key: [none] | Authentication key: [none] | ||
General key info..: [none]</ | General key info..: [none]</ | ||
+ | |||
+ | ==== nitropy ==== | ||
+ | FIXME | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | # pacman -S python-pynitrokey | ||
+ | |||
+ | |||
+ | # nitropy --help | ||
+ | < | ||
+ | |||
+ | Options: | ||
+ | -h, --help | ||
+ | |||
+ | Commands: | ||
+ | fido2 Interact with Nitrokey FIDO2 devices, see subcommands. | ||
+ | list List Nitrokey devices (in firmware or bootloader mode) | ||
+ | nethsm | ||
+ | nk3 Interact with Nitrokey 3 devices, see subcommands. | ||
+ | nkpk | ||
+ | pro Interact with Nitrokey Pro devices, see subcommands. | ||
+ | start Interact with Nitrokey Start devices, see subcommands. | ||
+ | storage | ||
+ | version | ||
+ | |||
+ | # nitropy nk3 test | ||
+ | < | ||
+ | THIS COMMAND SHOULD NOT BE RUN AS ROOT! | ||
+ | |||
+ | Please install udev rules and run `nitropy` as regular user (without sudo). | ||
+ | We suggest using: https:// | ||
+ | For more information, | ||
+ | |||
+ | Set ALLOW_ROOT=1 environment variable to disable this warning. | ||
+ | |||
+ | Found 1 NK3 device(s): | ||
+ | - Nitrokey 3 at / | ||
+ | |||
+ | Running tests for Nitrokey 3 at / | ||
+ | |||
+ | [1/ | ||
+ | [2/ | ||
+ | [3/ | ||
+ | Running SE050 test: | | ||
+ | [4/ | ||
+ | Please press the touch button on the device ... | ||
+ | Please press the touch button on the device ... | ||
+ | [5/ | ||
+ | |||
+ | 5 tests, 5 successful, 0 skipped, 0 failed | ||
+ | |||
+ | Summary: 1 device(s) tested, 1 successful, 0 failed</ | ||
+ | |||
+ | Das Protokoll im Verzeichnis **''/ | ||
+ | |||
+ | # ls -al / | ||
+ | < | ||
+ | |||
+ | # cat / | ||
+ | < | ||
+ | 368 INFO pynitrokey.cli OS: uname_result(system=' | ||
+ | 368 INFO pynitrokey.cli Python version: 3.12.7 | ||
+ | 369 INFO pynitrokey.cli Cli arguments: [' | ||
+ | 372 INFO pynitrokey.cli pynitrokey version: 0.6.0 | ||
+ | 373 INFO pynitrokey.cli cryptography version: 43.0.3 | ||
+ | 374 INFO pynitrokey.cli ecdsa version: 0.19.0 | ||
+ | 374 INFO pynitrokey.cli fido2 version: 1.1.3 | ||
+ | 375 INFO pynitrokey.cli pyusb version: 1.2.1 | ||
+ | 376 INFO pynitrokey.cli.trussed.test platform: Linux-6.6.65-1-lts-x86_64-with-glibc2.40 | ||
+ | 376 INFO pynitrokey.cli.trussed.test uname: uname_result(system=' | ||
+ | 512 | ||
+ | 512 | ||
+ | 512 | ||
+ | 520 | ||
+ | 528 | ||
+ | 536 INFO pynitrokey.cli.trussed.tests Device status: Status(init_status=< | ||
+ | 536 | ||
+ | 669 | ||
+ | 1782 DEBUG fido2.server Fido2Server initialized for RP: PublicKeyCredentialRpEntity(name=' | ||
+ | 1782 DEBUG fido2.server Starting new registration, | ||
+ | 1786 DEBUG root print: Please press the touch button on the device ... | ||
+ | 1796 DEBUG fido2.client Register a new credential for RP ID: example.com | ||
+ | 1838 DEBUG fido2.ctap2.base Calling CTAP2 make_credential | ||
+ | 1996 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 2248 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 2496 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 2748 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 2996 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 3248 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 3496 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 3744 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 3996 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 4244 DEBUG fido2.hid Got keepalive status: 02 | ||
+ | 4496 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 4744 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 4996 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 5244 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 5492 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 5744 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 5992 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 6244 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 6492 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 6740 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 6992 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 7240 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 7492 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 7740 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 7992 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 8256 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 8512 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 8796 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 9056 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 9199 DEBUG fido2.server Verifying attestation of type packed | ||
+ | 9200 INFO fido2.server New credential registered: a3005878bd496f7f5e7c10b12264abdc7274b8a2a8a1724eab6a6b2cf29737921dfb1c4793c1b3645547b7287ca5cd6087b3cd0c06e03c9115de4aeba206f2cfc14da879c4cf8c2045165008c9b3aa4591cee5b2cb825ee6c86f4ebe2f6bc8c4769902a550d389e11b235485931334234f15bf64de04d075aa27d394014c680a5adb95a30d02ed6d9e7f02505d85c63ba65a973e074ce94856cbb2a0 | ||
+ | 9201 DEBUG fido2.server Starting new authentication, | ||
+ | 9202 DEBUG root print: Please press the touch button on the device ... | ||
+ | 9206 DEBUG fido2.client Assert a credential for RP ID: example.com | ||
+ | 9237 DEBUG fido2.ctap2.base Calling CTAP2 get_assertion | ||
+ | 9304 DEBUG fido2.hid Got keepalive status: 02 | ||
+ | 9552 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 9804 DEBUG fido2.hid Got keepalive status: 01 | ||
+ | 10052 | ||
+ | 10328 | ||
+ | 10588 | ||
+ | 10755 INFO fido2.server Credential authenticated: | ||
+ | 10755 | ||
+ | 10756 | ||
+ | 10756 | ||
+ | |||
+ | ==== webauthn.io ==== | ||
+ | |||
+ | Was ist WebAuthn? | ||
+ | |||
+ | Willkommen auf webauthn.io! Diese Website wurde von Duo Labs entwickelt, um WebAuthn und Passkeys zu testen. WebAuthn wird von allen gängigen Browsern, einschließlich Chrome, Safari und Firefox, sowie von allen modernen Betriebssystemen, | ||
+ | |||
+ | Eine Einführung in WebAuthn und seine Funktionen finden Sie unter webauthn.guide. Wenn Sie Ihre Website um WebAuthn-Unterstützung erweitern möchten, sind Sie bei passkeys.dev richtig. Der Code für diese Demo ist auf GitHub verfügbar. | ||
+ | |||
+ | https:// | ||
+ | |||
+ | https:// | ||
+ | |||
+ | |||
===== Anwendungsfälle - Software ===== | ===== Anwendungsfälle - Software ===== | ||
+ | Viele Informationen rund um den **Nitrokey 3A Mini** findet man auf der **[[https:// | ||
==== Nitrokey Start und GnuPG ==== | ==== Nitrokey Start und GnuPG ==== | ||
Da es sich bei der Chipkarte des **Nitrokey 3A Mini** um eine standardkompatible OpenPGP-Karte handelt, kann der Kryptostick mit Hilfe von **[[https:// | Da es sich bei der Chipkarte des **Nitrokey 3A Mini** um eine standardkompatible OpenPGP-Karte handelt, kann der Kryptostick mit Hilfe von **[[https:// | ||
Zeile 564: | Zeile 709: | ||
Encryption key....: [none] | Encryption key....: [none] | ||
Authentication key: [none]</ | Authentication key: [none]</ | ||
+ | |||
+ | === ED25519-Schlüssel generieren === | ||
+ | <WRAP center round tip 100%> | ||
+ | Seit nummher einem Jahr - genauer gesagt seit 20223 - empfiehlt unter anderem das **BSI**((**B**undesamt für **S**icherheit in der **I**nformationstechnik)) keine RSA-Schlüssel mit einer Länge von 2048 Bit einzusetzen. Bei langen Nutzungsdauern von z.B. 5 Jahren und mehr ist es bereits jetzt notwendig, längere Schlüssel zu generieren. **3k** oder **4**-Schlüssel haben jedoch den Nachteil dass diese deutlich langsamer sind. Dank der Unterstützung bei der Verschlüsselung mittels beim Nitrokey 3A Mini können wir die deutlich Elliptische-Kurven-Kryptographie (ECC) verwednen! Dieses Verschlüsselungsverfahren gilt bei kleineren ECC-Schlüsseln als genauso sicher wie längere RSA-Schlüssel und ist zudem deutlich schneller! | ||
+ | |||
+ | Im Gegensatz zu RSA gibt es bei der Kryptographie mit elliptischen Kurven viele verschiedene Formen (sogenannte Kurven). <WRAP center round alert 90%> | ||
+ | Nicht unerwähnt soll hier aber auch sein, dass die **[[https:// | ||
+ | </ | ||
+ | | ||
+ | </ | ||
+ | |||
+ | Damit auf einem **Nitrokey 3A Mini** Schlüssel auf Basis elliptischer Kurven generiert werden können, muss auf dem Rechner, an dem der Stick angesteckt und administriert werden soll, GnuPG in Version 2.1.16 oder höher installiert sein. Bei **[[https:// | ||
+ | $ gpg2 --version | grep gpg | ||
+ | |||
+ | gpg (GnuPG) 2.4.7 | ||
+ | |||
+ | Die Version der Karten-Firmware können wir bei Bedarf wie folgt ermiteln: | ||
+ | $ gpg2 --card-status | grep Ver | ||
+ | |||
+ | Version ..........: 3.4 | ||
+ | |||
+ | |||
+ | Nun werden wir uns Schlüsselpaar auf Basis elliptischer Kurven auf dem Nitrokey 3A Mini generieren. Bevor wir die eigentlichen [[https:// | ||
+ | Welcher Typ eingestellt ist können wir mit den Befehl '' | ||
+ | $ gpg2 --card-status | grep Key\ attributes | ||
+ | |||
+ | Key attributes ...: rsa2048 rsa2048 rsa2048 | ||
+ | |||
+ | Zum Ändern der Vorgabewerte benutzen wir die Option '' | ||
+ | $ gpg2 --card-edit | ||
+ | |||
+ | < | ||
+ | Application ID ...: D276000124010304000F6447F2530000 | ||
+ | Application type .: OpenPGP | ||
+ | Version ..........: 3.4 | ||
+ | Manufacturer .....: Nitrokey | ||
+ | Serial number ....: 6447F253 | ||
+ | Name of cardholder: [not set] | ||
+ | Language prefs ...: [not set] | ||
+ | Salutation .......: | ||
+ | URL of public key : [not set] | ||
+ | Login data .......: [not set] | ||
+ | Signature PIN ....: forced | ||
+ | Key attributes ...: rsa2048 rsa2048 rsa2048 | ||
+ | Max. PIN lengths .: 127 127 127 | ||
+ | PIN retry counter : 3 0 3 | ||
+ | Signature counter : 0 | ||
+ | KDF setting ......: off | ||
+ | UIF setting ......: Sign=off Decrypt=off Auth=off | ||
+ | Signature key ....: [none] | ||
+ | Encryption key....: [none] | ||
+ | Authentication key: [none] | ||
+ | General key info..: [none] | ||
+ | |||
+ | gpg/ | ||
+ | |||
+ | Im Admin-Bereich finden wir den Befehl '' | ||
+ | gpg/ | ||
+ | |||
+ | Admin commands are allowed | ||
+ | |||
+ | Hier rufen wir dann den Befehl '' | ||
+ | gpg/ | ||
+ | |||
+ | |||
+ | Im folgenden ändern wir dann für die drei (Unterschlüssel) die Schlüsselart von **ECC** und bei der Frage nach der elliptischer Kurve wählen wir dann die Option **Curve 25519 %%*%%default%%*%%**. | ||
+ | < | ||
+ | Please select what kind of key you want: | ||
+ | (1) RSA | ||
+ | (2) ECC | ||
+ | Your selection? 2 | ||
+ | Please select which elliptic curve you want: | ||
+ | (1) Curve 25519 *default* | ||
+ | (4) NIST P-384 | ||
+ | (6) Brainpool P-256 | ||
+ | Your selection? 1</ | ||
+ | |||
+ | Bei dem erscheinenden Eingabefeld zur PIN-Eingabe geben wir hier und bei den nachfolgenden Änderungen jeweils die Default-Admin-PIN **'' | ||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | Please select what kind of key you want: | ||
+ | (1) RSA | ||
+ | (2) ECC | ||
+ | Your selection? 2 | ||
+ | Please select which elliptic curve you want: | ||
+ | (1) Curve 25519 *default* | ||
+ | (4) NIST P-384 | ||
+ | (6) Brainpool P-256 | ||
+ | Your selection? 1 | ||
+ | The card will now be re-configured to generate a key of type: brainpoolP256r1</ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | Please select what kind of key you want: | ||
+ | (1) RSA | ||
+ | (2) ECC | ||
+ | Your selection? 2 | ||
+ | Please select which elliptic curve you want: | ||
+ | (1) Curve 25519 *default* | ||
+ | (4) NIST P-384 | ||
+ | (6) Brainpool P-256 | ||
+ | Your selection? 1</ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | |||
+ | Zur Erfolgskontrolle können wir den Status wir folgt abfragen: | ||
+ | $ gpg2 --card-status | grep Key | ||
+ | |||
+ | Key attributes ...: ed25519 cv25519 ed25519 | ||
+ | |||
+ | Nun werden wir unser **ED25519**-Schlüsselmaterial erzeugen. Hierzu verwenden wir den Admin-Befehl **'' | ||
+ | < | ||
+ | Make off-card backup of encryption key? (Y/n) </ | ||
+ | <WRAP center round important 60%> | ||
+ | Da wir unseren private-key, | ||
+ | </ | ||
+ | < | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | PIN = ' | ||
+ | You should change them using the command --change-pin | ||
+ | |||
+ | Please specify how long the key should be valid. | ||
+ | 0 = key does not expire | ||
+ | < | ||
+ | <n>w = key expires in n weeks | ||
+ | <n>m = key expires in n months | ||
+ | <n>y = key expires in n years | ||
+ | Key is valid for? (0) 0 | ||
+ | Key does not expire at all | ||
+ | Is this correct? (y/N) y | ||
+ | |||
+ | GnuPG needs to construct a user ID to identify your key. | ||
+ | |||
+ | Real name: Michael Nausch | ||
+ | Email address: michael@nausch.org | ||
+ | Comment: | ||
+ | You selected this USER-ID: | ||
+ | " | ||
+ | |||
+ | Change (N)ame, (C)omment, (E)mail or (O)kay/ | ||
+ | gpg: revocation certificate stored as '/ | ||
+ | public and secret key created and signed. | ||
+ | |||
+ | pub | ||
+ | F5F0CD13074BA693D950F92A0A56C9A3A69FE291 | ||
+ | uid Michael Nausch < | ||
+ | sub | ||
+ | sub | ||
+ | |||
+ | gpg/ | ||
+ | |||
+ | <WRAP center round tip 95%> | ||
+ | Die Erzeugung eines **ED255194k**-Schlüssels dauert wenige Sekunden, also auch hier keinesfalls den Nitrokey 3A Mini abziehen oder die Generierung abbrechen! Während der Erzeugung der Schlüssel leuchtet bzw. blinkt die LED im Stick. | ||
+ | </ | ||
+ | |||
+ | < | ||
+ | public and secret key created and signed. | ||
+ | |||
+ | pub | ||
+ | F5F0CD13074BA693D950F92A0A56C9A3A69FE291 | ||
+ | uid Michael Nausch < | ||
+ | sub | ||
+ | sub | ||
+ | </ | ||
+ | |||
+ | Wir verfügen als nun über unser gewünschte ED25519-Schlüsselmaterial. | ||
+ | $ gpg2 --card-status | ||
+ | < | ||
+ | Application ID ...: D276000124010304000F6447F2530000 | ||
+ | Application type .: OpenPGP | ||
+ | Version ..........: 3.4 | ||
+ | Manufacturer .....: Nitrokey | ||
+ | Serial number ....: 6447F253 | ||
+ | Name of cardholder: [not set] | ||
+ | Language prefs ...: [not set] | ||
+ | Salutation .......: | ||
+ | URL of public key : [not set] | ||
+ | Login data .......: [not set] | ||
+ | Signature PIN ....: forced | ||
+ | Key attributes ...: ed25519 cv25519 ed25519 | ||
+ | Max. PIN lengths .: 127 127 127 | ||
+ | PIN retry counter : 3 0 3 | ||
+ | Signature counter : 4 | ||
+ | KDF setting ......: off | ||
+ | UIF setting ......: Sign=off Decrypt=off Auth=off | ||
+ | Signature key ....: F5F0 CD13 074B A693 D950 F92A 0A56 C9A3 A69F E291 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Encryption key....: DBBD 5355 D9D0 334A A3FA 751F A89D D54D AE0E 394A | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Authentication key: EE7C 3807 4F0A 8F2A 5601 BF91 1E61 4A9A 36D4 DF53 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | General key info..: pub ed25519/ | ||
+ | sec> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253 | ||
+ | |||
+ | </ | ||
+ | |||
+ | === privaten Schlüsselbund === | ||
+ | Fragen wir nun den privaten Schlüsselbund ab, finden wir den gerade angelegten Schlüssel bzw. den zugehörigen Proxy-Eintrag mit dem Verweis auf den Kryptostick. Dazu verwenden wir den Befehl '' | ||
+ | |||
+ | $ gpg2 -K | ||
+ | < | ||
+ | gpg: marginals needed: 3 completes needed: 1 trust model: pgp | ||
+ | gpg: depth: 0 valid: | ||
+ | / | ||
+ | ------------------------------- | ||
+ | sec> | ||
+ | F5F0CD13074BA693D950F92A0A56C9A3A69FE291 | ||
+ | Card serial no. = 000F 6447F253 | ||
+ | uid | ||
+ | ssb> | ||
+ | ssb> | ||
+ | </ | ||
+ | |||
+ | === Öffentlichen Schlüssel ausgeben === | ||
+ | Damit wir später unseren öffentlichen Schlüssel auch weitergeben oder zu einem [[https:// | ||
+ | $ gpg --export --armor michael@nausch.org> | ||
+ | |||
+ | Diese Datei enthält unseren Schlüssel in ASCII-lesbarer Form. | ||
+ | $ cat ~/ | ||
+ | <file key secmail@nausch.org.pubkey> | ||
+ | |||
+ | mQINBGde/ | ||
+ | buQT0QNMnyITnl6g7yD/ | ||
+ | T33EoZhNtNoyGRFA5JZLU9lNT/ | ||
+ | hz73Xnh6Tt6B9r0zi+OVa3zeOIyEcN4GbXdaZ9DfQAcZX4Hd0RXRlVgF13fgWNHj | ||
+ | P8u3ihtIxC// | ||
+ | UD5ZbBXod3nOxKJVOcMHgbGQ1+erHfxV6rIxzSAFLl+TALa/ | ||
+ | q18X9OsXdmrVZwOobFGXQGzXz3rBk2cR9UX9fSdWz/ | ||
+ | TLCCJhgKJSsCaMx3bikc9LWNyJvUYfgN2O7bKPK30vJW6vRurzk8mqh2dn312IgF | ||
+ | wxi6BwMI5YFegJC8Ua88a1gAj8q87N3Sjj1ihoU3kAIxOuFwmrUM2M6O8QZwUkmq | ||
+ | P3nllANnDSesebdObtRHdDqUFtm7XQv8pp+dIJPzNIqd5Lgps20A6y4ao8yaEMIL | ||
+ | B3+ZW9NAm/ | ||
+ | tCNNaWNoYWVsIE5hdXNjaCA8bWljaGFlbEBuYXVzY2gub3JnPokCUQQTAQgAOxYh | ||
+ | BIt6V6lC7rlSVDw0RzgdL0PcnLaeBQJnXvxTAhsDBQsJCAcCAiICBhUKCQgLAgQW | ||
+ | AgMBAh4HAheAAAoJEDgdL0PcnLaeGG8P/ | ||
+ | nkYKcRX0UKXxhABIgd9tXd01aYKcPHyOZfCAhmSXjZXJEQxJBbg/ | ||
+ | vAF1tnYAt6JgvQMOCK5g0/ | ||
+ | pxePFjnXnQ50qUALajmfvPU+/ | ||
+ | w0N4WCS4ABTjLt/ | ||
+ | kWfuCl+jrglp5NALSfu2YThhYVxv4uoUWeJQl70PUlkdt5q1RamNI6+nZ30YofQz | ||
+ | / | ||
+ | +alO4YbSL0Up3KiIBFDF5G4C+FEZPEUXXC/ | ||
+ | xtLMS98HFrQ/ | ||
+ | bjyTPL/ | ||
+ | vpSM9SMFez2jLJ/ | ||
+ | X+rIFT8jSQ/ | ||
+ | IWEnGI6tl1GOSD3a/ | ||
+ | 3PZzkWGMA08OZ9p9enScXk261V4h56F+2p0MvF/ | ||
+ | y9iRpzdY2LXP1fZRUVx82Xpo941SEhxJWY3CtfNQ3jDrkVjCaJpes3pO6MUOBFmF | ||
+ | 47yQwldWD07hueMoS00ARZxlLfyiAxLZEKJGSeAxwzSaYHgLqDvRciAB3DJP4lxN | ||
+ | YIEBazZ/ | ||
+ | Fvy/ | ||
+ | 86ruXsimBPADRhkGB2IF5l5X9VZXmLA7vE7YI8PILSdkaOST8c3pIUu2LILo7QM/ | ||
+ | xDZGCbx5JuuozMH3KWE8btn+Z8bTMG2Nnfdkr7NTlEPaiRCnZU4Ap9oQNpup7STr | ||
+ | C2+WxpZY0V1nzVYtgiUh/ | ||
+ | EOnsIres6qCLHT8ve3OWpS4Ukf1815j7rnTm7e3777SVUe0VtV2edJr5Ko70rXU/ | ||
+ | araAGQARAQABiQI2BBgBCAAgFiEEi3pXqULuuVJUPDRHOB0vQ9yctp4FAmde/ | ||
+ | GyAACgkQOB0vQ9yctp7x5w// | ||
+ | m7cdzdbzQZavajUMzqMZIJ3MUS0LRpSWYXhHufwOFjd0bqX00DIReEcbpVaTgXRk | ||
+ | OYHkMPFHHlXdCSGzkWL4l2mCvHqtTCElf/ | ||
+ | / | ||
+ | lh5IAuROP3aCGKJphhIvOqz+6/ | ||
+ | lwVpH+M7zms0v8xloupboyXwCpO6q55e7+telE68J45P7H+aXTxkhKQh76RWlYYV | ||
+ | VGT5I9e6v9FCZzhAr5h9z914xBc0gMSpsiafhSILuQp07fr7zedR0orAXtrftRIs | ||
+ | MmbLd+alU5a2tpK2BcbTgbOBQYFtaHqCwqs12cwmxEF/ | ||
+ | QX83+J5pOiWMlO7sakE9cfkHYdTyz6FI8rPsP/ | ||
+ | 2Fc2wmWDX0QGepEQrT2Spm4KjkANmRwlZ0HQf39/ | ||
+ | iAaFay4xAjzW0mMNIs9Yab+OH/ | ||
+ | oJK5Ag0EZ178UwEQAJCPSNzBgzi8ihOqpXNGvLoVbtMultmemPZFH72JStHk7/ | ||
+ | L7iQqO/ | ||
+ | ySFERe7XbVkaXjwmPunL1lTSRiR4C4K1e3KHXkqSdTJsp2dyo7ozx/ | ||
+ | / | ||
+ | Ahv6xUBMOwRafs7Vu3Jzvd5RSMDx0CxePL2h1/ | ||
+ | YMA43wFv2XhFmNX9mXtPiamAF89fATibsVBgvYc4qLqG2h1Q6PvKmiVZLerZiA6r | ||
+ | / | ||
+ | f+Ver8V1hw5O00A+b1oEZxtAsHMMt4pQvpOtx4hRXmdc9TiVvXfvzoT4768/ | ||
+ | hUqL9EN/ | ||
+ | JWC0R+XfbaNksLOHmlMPcu+sIde885aptw5yjoKKNEgSNNkV8V0gFLAtwq4SwakB | ||
+ | c9AjiwJHb+IJP0HynEBD+qJxM+1+gOZKQ1/ | ||
+ | AAGJAjYEGAEIACAWIQSLelepQu65UlQ8NEc4HS9D3Jy2ngUCZ178UwIbDAAKCRA4 | ||
+ | HS9D3Jy2ngxqD/ | ||
+ | qZMhrw/ | ||
+ | bfu2bkLSo98uA2VOy1e3YfMTOIR1YQcXOWL/ | ||
+ | IgMDu+eLWPeVYRVMy33ilJsaPFxXtv/ | ||
+ | qcq3Z9kZ0SIJfB5Y+bcmwQJ+B8mviUqhydKZkS+ZOEyAsnANKEfZzcch1EQ4X0Wy | ||
+ | mY3BeI4jZghTlOv+ljaEhiONooZB/ | ||
+ | BK+t7PjxqdYYbImxkGtUlOntVJwP4Gnp+Pq33D+v8ZvpJSeykX4T18mxVn/ | ||
+ | Bf6YqzzndIZatSBqRRssu2TNEF5So/ | ||
+ | 7XYI5iJfO3VbFW6dwUyR3BtxTV1LO5nK5w9irw4quc8lfjtKKWGB5X2RtsNqaXs1 | ||
+ | i7cPA3IXG72H+8XYn0VvPZkJ/ | ||
+ | MrDDgEKbXaibyvfFe52GfHOP6KZf0lStKp76drTkAnJh8gVbF1GT0gNEdpkBDQRn | ||
+ | XwteAQgAjHygzncLObHa1H2M8UxGgg1413gUAXcm+lPV/ | ||
+ | f/ | ||
+ | gPVj+R5Vm6HVKbl8q9/ | ||
+ | 6YJsOAS7O4LddHCe07yYs9pe2W3yocUlRsVjL5VF+BOPdyEj5N13bolEn+ek0fId | ||
+ | d56c7jAmMFkogA1C/ | ||
+ | KhFonSoq4SqzCOcRtFaHKueiU11LOQARAQABtCNNaWNoYWVsIE5hdXNjaCA8bWlj | ||
+ | aGFlbEBuYXVzY2gub3JnPokBUQQTAQgAOxYhBCBNVx6OyTiEY+G1+UzXdh8ntau7 | ||
+ | BQJnXwteAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEEzXdh8ntau7 | ||
+ | NWMH/ | ||
+ | oIuMgPsPZjgBebspCfupa2uWOk9gG0OotrHSTzonhEq+cLiGUQgwEXN4prDGWDBH | ||
+ | tdhxapKc+U71wuxMmf9Ddz3m6eCkhmiSg6WrjIjP8r7peJNoUi6at2cte9hq+Sdw | ||
+ | k6VQRgvn9q3ejgoY7MU5Ee6aOWUhgfQXm6dsXc8XWxETqzssZVlc7YXlIGEtmGK+ | ||
+ | p0l8Uy1XvnbOAcQhCP0cgKcpZ0r6w91smKRZN8ae2brDWSj1mkWQLwkE5q7aouyY | ||
+ | 7Hu1E4f3gMi/ | ||
+ | hEyLkI1lhvh7zNKyYs2dvy2oFxk3WTzgWJD+QtzTinwcFER1KhTIgBLb8l/ | ||
+ | goCjrpo8SaaYtHTvavVQSjRuC8gL0JwVrQuol7g+8oi24dqVV32YfGWmsWEZplr2 | ||
+ | yB6odO36r4kTXaqUNI8K21kkn3/ | ||
+ | pCzvDT5s+N5csK+Lh1PTOcmKusfwZfxJWdq2DQYh3fjtqvulC9BzAfzG3v85hxlj | ||
+ | ehX9ouEbBef7Y4NP7vYnW0Ml4h/ | ||
+ | EQEAAYkBNgQYAQgAIBYhBCBNVx6OyTiEY+G1+UzXdh8ntau7BQJnXwteAhsgAAoJ | ||
+ | EEzXdh8ntau7u98H/ | ||
+ | do1YrOgHN21KhUknJPoX/ | ||
+ | nsrt/ | ||
+ | 6EpFWBjcXC4SdP/ | ||
+ | dBI819vd9p7x6X58e8tF66/ | ||
+ | 4yDb8qj8wQRa/ | ||
+ | TdDWpqnnDyhgMvJzbRcP+1p/ | ||
+ | 7xMgmsYnyScioMS1PLzgkQE35gawOdZkJCL9Rfly89GRFgf+mgjvj62pxvXQlJAh | ||
+ | X4DllbwTIKZGvRS/ | ||
+ | ku8k0xKr9MpRgVgM5eOTOOikEEKzSCFDoOk0fzAKHvbD8BYL4HQKeYWJ0EBrFKu5 | ||
+ | LyNjUCCtpa5i4paFAid+tHvLuo7Jqnua1fPUY5ok2sJPZSmQneR9EkFJtbTTtNFm | ||
+ | vJ1/ | ||
+ | XwteAhsMAAoJEEzXdh8ntau73s8H/ | ||
+ | voaVRHjg2TTWZwgn/ | ||
+ | mGJhMenp1HfnqjZr1zFfHXIRn5htZc57CGu5/ | ||
+ | VmOsV1gRNl/ | ||
+ | c// | ||
+ | 8jC+/ | ||
+ | BgEEAdpHDwEBB0ByShO5eDT8KcqHvQTejiUCX0oZ1+m8cHtG5ZjWGIhqNrQjTWlj | ||
+ | aGFlbCBOYXVzY2ggPG1pY2hhZWxAbmF1c2NoLm9yZz6IkwQTFggAOxYhBPXwzRMH | ||
+ | S6aT2VD5KgpWyaOmn+KRBQJnXw0WAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4H | ||
+ | AheAAAoJEApWyaOmn+KR/ | ||
+ | N34nAQDtpiCAkuH8zQfwddwh2y// | ||
+ | AQQB2kcPAQEHQLz8sjaPGlC16rOK7s8S8gzBmbfnCOsiz4jD77+BuLn4iHgEGBYI | ||
+ | ACAWIQT18M0TB0umk9lQ+SoKVsmjpp/ | ||
+ | AP9wWbWxT/ | ||
+ | rQnmqMWbqGThLWDm8ytRA1r1zgS4OARnXw0WEgorBgEEAZdVAQUBAQdAbGJLxtug | ||
+ | JwOVg8yNKaqyPEhAmeENG36qif8PfcL7mTEDAQgHiHgEGBYIACAWIQT18M0TB0um | ||
+ | k9lQ+SoKVsmjpp/ | ||
+ | gzy032ZQOXQhCs+JUVljsKZ1BWLXCgEA90bC1KYa38m26kIJAULTwZLAvgywM3dT | ||
+ | Vo7asIbAswY= | ||
+ | =6DCk | ||
+ | -----END PGP PUBLIC KEY BLOCK-----</ | ||
+ | |||
+ | === card-edit - Stick personalisieren === | ||
+ | Zunächst wollen wir unseren Stick personalisieren, | ||
+ | \\ | ||
+ | \\ | ||
+ | | **Name of cardholder** | ||
+ | | **Language prefs** | ||
+ | | **Sex** | ||
+ | | **URL of public key** | Angabe einer URL, mit der der public-key mit Hilfe des Befehls fetch unter '' | ||
+ | | **Login data** | ||
+ | |||
+ | Zum Ändern dieser Daten müssen wir nach der Anmeldung an der Karte mit dem Befehl **admin**in den Admin Bereich wechseln. | ||
+ | $ gpg --card-edit | ||
+ | |||
+ | < | ||
+ | Reader ...........: | ||
+ | Application ID ...: D276000124010304000F6447F2530000 | ||
+ | Application type .: OpenPGP | ||
+ | Version ..........: 3.4 | ||
+ | Manufacturer .....: Nitrokey | ||
+ | Serial number ....: 6447F253 | ||
+ | Name of cardholder: [not set] | ||
+ | Language prefs ...: [not set] | ||
+ | Salutation .......: | ||
+ | URL of public key : [not set] | ||
+ | Login data .......: [not set] | ||
+ | Signature PIN ....: forced | ||
+ | Key attributes ...: ed25519 cv25519 ed25519 | ||
+ | Max. PIN lengths .: 127 127 127 | ||
+ | PIN retry counter : 3 0 3 | ||
+ | Signature counter : 4 | ||
+ | KDF setting ......: off | ||
+ | UIF setting ......: Sign=off Decrypt=off Auth=off | ||
+ | Signature key ....: F5F0 CD13 074B A693 D950 F92A 0A56 C9A3 A69F E291 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Encryption key....: DBBD 5355 D9D0 334A A3FA 751F A89D D54D AE0E 394A | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Authentication key: EE7C 3807 4F0A 8F2A 5601 BF91 1E61 4A9A 36D4 DF53 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | General key info..: | ||
+ | pub ed25519/ | ||
+ | sec> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253 | ||
+ | </ | ||
+ | |||
+ | | ||
+ | |||
+ | Admin commands are allowed | ||
+ | |||
+ | Wir ändern zunächst den Namen des Karteninhabers **Name of cardholder**: | ||
+ | | ||
+ | |||
+ | Cardholder' | ||
+ | Cardholder' | ||
+ | |||
+ | Als nächstes definieren wir die Sprache des Kartenbenutzers: | ||
+ | | ||
+ | |||
+ | Language preferences: | ||
+ | |||
+ | Im nächsten Schritt setzen wir das Geschlecht des Karteninhabers: | ||
+ | | ||
+ | |||
+ | Sex ((M)ale, (F)emale or space): m | ||
+ | |||
+ | Nun setzen wir noch den Anmelde-/ | ||
+ | | ||
+ | |||
+ | Login data (account name): django | ||
+ | |||
+ | Zu guter Letzt setzen wir nun die URL, von der der public-key mit Hilfe des Befehls **fetch** unter '' | ||
+ | | ||
+ | |||
+ | URL to retrieve public key: https:// | ||
+ | |||
+ | Somit ergeben sich folgende benutzerindividuellen Daten auf der Karte: | ||
+ | | ||
+ | |||
+ | < | ||
+ | Reader ...........: | ||
+ | Application ID ...: D276000124010304000F6447F2530000 | ||
+ | Application type .: OpenPGP | ||
+ | Version ..........: 3.4 | ||
+ | Manufacturer .....: Nitrokey | ||
+ | Serial number ....: 6447F253 | ||
+ | Name of cardholder: Michael Nausch | ||
+ | Language prefs ...: de | ||
+ | Salutation .......: Mr. | ||
+ | URL of public key : https:// | ||
+ | Login data .......: django | ||
+ | Signature PIN ....: forced | ||
+ | Key attributes ...: ed25519 cv25519 ed25519 | ||
+ | Max. PIN lengths .: 127 127 127 | ||
+ | PIN retry counter : 3 0 3 | ||
+ | Signature counter : 4 | ||
+ | KDF setting ......: off | ||
+ | UIF setting ......: Sign=off Decrypt=off Auth=off | ||
+ | Signature key ....: F5F0 CD13 074B A693 D950 F92A 0A56 C9A3 A69F E291 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Encryption key....: DBBD 5355 D9D0 334A A3FA 751F A89D D54D AE0E 394A | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Authentication key: EE7C 3807 4F0A 8F2A 5601 BF91 1E61 4A9A 36D4 DF53 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | General key info..: | ||
+ | pub ed25519/ | ||
+ | sec> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253 | ||
+ | </ | ||
+ | |||
+ | Nun können wir die Erstinitialisierung abschliessen und den Einstellungsdialog mit dem Befehl **quit** verlassen. | ||
+ | | ||
+ | |||
+ | === change-pin === | ||
+ | <WRAP center round alert 95%> | ||
+ | **WICHTIG**: | ||
+ | Unbedingt vor dem ersten Ändern der PINs ist es notwendig, erst einmal Schlüssel zu generieren bzw. zu importieren! Denn sonst schlägt das Ändern der Benutzer-PIN fehl, bzw. wird die Benutzer-PIN beim Überschreiben von Schlüsseln auf den Default-Wert von **123456** zurückgesetzt. Die Default-PIN für den Admin lautet **12345678**. | ||
+ | |||
+ | Es ist sehr wichtig dass als erstes die **Admin-PIN** und dann erst im Anschluss die **Nutzer-PIN** geändert wird! Denn sonst der **// | ||
+ | </ | ||
+ | |||
+ | Mit Hilfe des Befehls '' | ||
+ | |||
+ | Die Benutzer-PIN (Menüpunkt **1**) wird benötigt für den täglichen Betrieb wie z.B. zum Entsperren des Token, oder zum Signieren und Verschlüsseln. Die Mindestlänge für den User-Pin beträgt 6 Zeichen. | ||
+ | |||
+ | Die Admin-PIN (Menüpunkt **3**) wird für die Karten-/ | ||
+ | |||
+ | <WRAP center round important 95%> | ||
+ | Wird die Benutzer-PIN 3x falsch eingeben, wird die Karte gesperrt und kann dann nur mit der Admin-PIN oder dem Reset-Code zurückgesetzt werden. Wenn Sie den falschen Admin-Pin dreimal eingeben, wird die Karte unbrauchbar und kann dann lediglich mit einem Factory-Reset (Verlußt aller Kartendaten!) zurück gesetzt werden! | ||
+ | |||
+ | Ferner ist darauf zu achten, dass zunächst die Admin-PIN und erst dann die Nutzer-PIN geändert. Ansonsten wird nämlich der // | ||
+ | </ | ||
+ | |||
+ | Die Reset-PIN (Menüpunkt **4**) kann nur zum Zurücksetzen der Benutzer-PIN verwendet werden. Die Mindestlänge für den Reset-Code beträgt 8 Zeichen. Der Reset-Code Fehlerzähler kann wiederum mit der Admin-PIN zurückgesetzt werden. Wird nach zweimaliger Falscheingabe der Benutzer- wie auch der Admin-PIN und dann die richtige PIN eingeben, wird der Fehlerzähler zurückgesetzt. | ||
+ | |||
+ | Worin besteht nun aber der genaue Unterschied zwischen dem Reset-Code und der Admin-PIN? Möchte man in einer Organisation Nitrokey Start an seine Mitarbeiter ausgeben, werden bestimmte Daten, wie z.B. Namen, die Public Key URL oder auch das erzeugte Schlüsselmaterial zentral vorgegeben. Da der Benutzer selbst diese Daten nicht verändern können soll, wird dieser auch nicht Kenntnis von der Admin-PIN haben. Sperrt sich nun der Mitarbeiter aus, weil er die Benutzer-PIN 3x falsch eingegeben hat, kann der Neutzer natürlich nicht die Admin-PIN eingeben, da er diese nicht kennt. Hier kommt nun der Reset-Code ins Spiel. Mit Hilfe dieses Codes kann der Benutzer nun die Benutzer-PIN zurücksetzen. | ||
+ | |||
+ | $ gpg --change-pin | ||
+ | < | ||
+ | |||
+ | 1 - change PIN | ||
+ | 2 - unblock PIN | ||
+ | 3 - change Admin PIN | ||
+ | 4 - set the Reset Code | ||
+ | Q - quit | ||
+ | |||
+ | Ihre Auswahl?</ | ||
+ | |||
+ | Wir ändern also zu erste die **Admin-PIN** durch Auswahl des Menüpunkts **3** aus und erst anschliessend die **Benutzer-PIN** mit **1**. Wir werden dann nach der aktuellen PIN gefragt und müssen die neue PIN 2x eingeben zum Abändern. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | gpg: OpenPGP card no. D276000124010200FFFE432437110000 detected | ||
+ | |||
+ | 1 - change PIN | ||
+ | 2 - unblock PIN | ||
+ | 3 - change Admin PIN | ||
+ | 4 - set the Reset Code | ||
+ | Q - quit | ||
+ | |||
+ | Your selection? 3 | ||
+ | gpg: 3 Admin PIN attempts remaining before card is permanently locked | ||
+ | |||
+ | Please enter the Admin PIN | ||
+ | |||
+ | New Admin PIN | ||
+ | |||
+ | New Admin PIN | ||
+ | PIN changed. | ||
+ | |||
+ | 1 - change PIN | ||
+ | 2 - unblock PIN | ||
+ | 3 - change Admin PIN | ||
+ | 4 - set the Reset Code | ||
+ | Q - quit | ||
+ | |||
+ | Your selection? 1 | ||
+ | |||
+ | Please enter the PIN | ||
+ | |||
+ | New PIN | ||
+ | |||
+ | New PIN | ||
+ | PIN changed. | ||
+ | |||
+ | 1 - change PIN | ||
+ | 2 - unblock PIN | ||
+ | 3 - change Admin PIN | ||
+ | 4 - set the Reset Code | ||
+ | Q - quit | ||
+ | |||
+ | Your selection? 4 | ||
+ | gpg: 3 Admin PIN attempts remaining before card is permanently locked | ||
+ | |||
+ | Please enter the Admin PIN | ||
+ | |||
+ | New Reset Code | ||
+ | |||
+ | New Reset Code | ||
+ | gpg: Reset Code is too short; minimum length is 8 | ||
+ | Error setting the Reset Code: bad passphrase | ||
+ | |||
+ | 1 - change PIN | ||
+ | 2 - unblock PIN | ||
+ | 3 - change Admin PIN | ||
+ | 4 - set the Reset Code | ||
+ | Q - quit | ||
+ | |||
+ | Your selection? q | ||
+ | |||
+ | gpg/ | ||
+ | |||
+ | === Verschlüsseln und entschlüsseln === | ||
+ | Nun werden wir kurz einmal testen, ob wir mit Hilfe der Hardware-Schlüssel-Karte eine Datei ver- und wieder entschlüsseln können. | ||
+ | |||
+ | - Zunächst Wir legen uns erst einmal ein beliebiges Testdokument an. < | ||
+ | │ File: testdatei.txt | ||
+ | ───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 10 │ PRIVACY_POLICY_URL=" | ||
+ | 11 │ LOGO=archlinux-logo | ||
+ | ───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | ||
+ | </ | ||
+ | - Nun verschlüsseln wir dieses Textdokument: | ||
+ | -rw-r--r-- 1 django django 687 Dec 15 18:35 testdatei.txt.pgp</ | ||
+ | |||
+ | hE4DqJ3VTa4OOUoSAQdAFrLZCi4ZoZl0AcBxZSk/ | ||
+ | Uwr1N2CAtxx2obPMMN1arTGakL7xjU34QAKef0mSHaqETgO15UNFvaKSoBIBB0BY | ||
+ | hn4iz/ | ||
+ | 6tL30sxOYnAwviDvuoogE9LAaQEYHYqLVT0+BnzO6xRpKYOm6FafrIjGY4APg5hH | ||
+ | I/ | ||
+ | 8DvdkQ1gDFrK0eL/ | ||
+ | JVQLhJBCQ8GXhFheeozcattp0KZioVW6h12p4/ | ||
+ | kZYzQ89k63jay1g7kU3VF6jlOSHVNz5f5GODG2WNW+2lLlbDm1ISu22iTZ4uWnGh | ||
+ | zGmSxh8NBFxg288gCj0He7HiKuYWEpvn872F8TGms6GCBKvnCPP9UGSehv7H+YQy | ||
+ | VDKog8Fv17h1ieaMudrKE9YH6Dc1zx+rrhiYEg== | ||
+ | =QWj0 | ||
+ | -----END PGP MESSAGE-----</ | ||
+ | - Nun entschlüsseln wir unser Dokument wieder.< | ||
+ | " | ||
+ | gpg: encrypted with cv25519 key, ID A89DD54DAE0E394A, | ||
+ | " | ||
+ | │ File: testdatei-entschlüsselt.txt | ||
+ | ───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 10 │ PRIVACY_POLICY_URL=" | ||
+ | 11 │ LOGO=archlinux-logo | ||
+ | ───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | ||
+ | </ | ||
+ | |||
+ | === Signieren === | ||
+ | Nun werden wir kurz einmal testen, ob wir mit Hilfe der Hardware-Schlüssel-Karte eine Datei signieren und die Signatur auch wieder prüfen können. | ||
+ | |||
+ | - Zunächst Wir legen uns erst einmal ein beliebiges Testdokument an. < | ||
+ | │ File: textdatei.txt | ||
+ | ───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | ||
+ | | ||
+ | ───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | ||
+ | </ | ||
+ | - Nun signieren wir dieses Textdokument: | ||
+ | -rw-r--r-- 1 django django 183 Dec 15 18:42 textdatei.txt.gpg</ | ||
+ | | ||
+ | - Alternativ können wir die Datei auch die Datei " | ||
+ | -rw-r--r-- 1 django django 309 Dec 15 18:47 textdatei.txt.asc | ||
+ | -rw-r--r-- 1 django django 183 Dec 15 18:42 textdatei.txt.gpg</ | ||
+ | │ File: textdatei.txt.asc | ||
+ | ───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | 10 │ =CNnO | ||
+ | 11 │ -----END PGP SIGNATURE----- | ||
+ | ───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────── | ||
+ | </ | ||
+ | - Ein signiertes Dokument an sich ist i.d.R. nur begrenzt nützlich. Andere Benutzer müssen das Originaldokument aus der signierten Version wiederherstellen, | ||
+ | -rw-r--r-- 1 django django | ||
+ | -rw-r--r-- 1 django django 309 Dec 15 18:47 textdatei.txt.asc | ||
+ | -rw-r--r-- 1 django django 183 Dec 15 18:42 textdatei.txt.gpg</ | ||
+ | gpg: using EDDSA key F5F0CD13074BA693D950F92A0A56C9A3A69FE291 | ||
+ | gpg: Good signature from " | ||
+ | gpg: using EDDSA key F5F0CD13074BA693D950F92A0A56C9A3A69FE291 | ||
+ | gpg: BAD signature from " | ||
+ | - Im nun folgendem Beispiel signieren wir unsere Datei und konvertieren sie so, dass wir sie einfach per eMail verschicken können. Hierzu nutzen wir die Option **'' | ||
+ | |||
+ | owGbwMvMwCGWyHdz3dNgU3vGNSZJvCWpFSUpiSWpmXolFSVp8QnSIaWpCl6leQoK | ||
+ | JgoGFlbG5laG5goBvgrOrsEhCkYGRiZcHaUsDGIcDLJiiiw6HCquZ38X3TubyhwA | ||
+ | M5WVCWQKAxenAEzEYwXDPw0/ | ||
+ | FxUZ/ | ||
+ | =UkKj | ||
+ | -----END PGP MESSAGE-----</ | ||
+ | Hash: SHA256 | ||
+ | |||
+ | Tue Jun 4 08:37:17 PM CEST 2024 | ||
+ | -----BEGIN PGP SIGNATURE----- | ||
+ | |||
+ | iHUEARYIAB0WIQQsCCRFzfty3s1lA1BhDtmu5VM1PwUCZl9gfwAKCRBhDtmu5VM1 | ||
+ | P3TcAQDTPio3kyse3A6orXygqr5hP9etL25Lpq6ySzTjIDRcKgEA3qT4h/ | ||
+ | a1EoA/ | ||
+ | =34mx | ||
+ | -----END PGP SIGNATURE-----</ | ||
+ | gpg: using EDDSA key 2C082445CDFB72DECD650350610ED9AEE553353F | ||
+ | gpg: Good signature from " | ||
+ | gpg: WARNING: not a detached signature; file ' | ||
+ | Hash: SHA256 | ||
+ | |||
+ | Tue Jun 4 08:37:17 PM CEST 2099 | ||
+ | -----BEGIN PGP SIGNATURE----- | ||
+ | |||
+ | iHUEARYIAB0WIQQsCCRFzfty3s1lA1BhDtmu5VM1PwUCZl9gfwAKCRBhDtmu5VM1 | ||
+ | P3TcAQDTPio3kyse3A6orXygqr5hP9etL25Lpq6ySzTjIDRcKgEA3qT4h/ | ||
+ | a1EoA/ | ||
+ | =34mx | ||
+ | -----END PGP SIGNATURE-----</ | ||
+ | gpg: using EDDSA key 2C082445CDFB72DECD650350610ED9AEE553353F | ||
+ | gpg: BAD signature from " | ||
+ | |||
+ | ==== Nitrokey Start und Thunderbird ==== | ||
+ | Nachdem wir nun unsere Schlüssel auf dem Kryptografie-Stick erstellt haben, wollen wir diesen nun verwenden um bei Thunderbird unsere elektronische Kommunikation per eMail abzusichern. | ||
+ | <WRAP center round tip 90%> | ||
+ | Thunderbird bringt mittlerweile die PGP-Unterstützung mit, so dass kein addon, wie **'' | ||
+ | |||
+ | Lediglich die Unterstützung externer Smart-Cards wie unseres **Nitrokey Start** müssen wir in Thunderbird aktivieren. | ||
+ | </ | ||
+ | |||
+ | Über das " | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Hier scrollen wir ganz nach unten und wählen den Menüpunkt **[ Konfiguration bearbeiten... ]** aus. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Hier suchen wir nach der Option **'' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Damit wir nun unseren Signature-Key mit unserem Thunderbird-Konto verbinden können benötigen wir natürlich die entsprechende Key-ID. Diese ermitteln wir nun mit folgendem Aufruf: | ||
+ | $ gpg2 --card-status | grep Signature\ key | ||
+ | < | ||
+ | |||
+ | Die vier letzten 4er-Blöcke merken wir uns nun entsprechend: | ||
+ | |||
+ | Über das " | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Hier wählen wir dann den Menüpunkt **[ Schlüssel hinzufügen ] ** aus. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Da wir den zuvor erzeugten PGP-Schlüssel auf unserem Nitrokey verwenden möchten, wählen wir hier letzten den Menüpunkt **[ __E__xternen Schlüssel mittels GnuPG benutzen. (z.B. von einer SmartCard aus) ]**. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ... und klicken anschließen auf die Schaltfläche **[ Fortfahren }**. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Hier geben wir nun unsere zuvor ermittelte Key-ID ein und bestätigen anschliessend unsere Eingabe mit einem Klick auf die Schaltfläche **[ Schlüssel-ID speichern ]**. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ==== Nitrokey Start und Secure Shell ==== | ||
+ | |||
+ | <WRAP center round important 90%> | ||
+ | Ob man in Zeiten von Überwachungsphantasten in Unternehmen und vor allem auch bei einer NSA oder BND, noch **[[http:// | ||
+ | |||
+ | Der Sicherheitsguru Bruce Schneier hat in seinem **[[https:// | ||
+ | |||
+ | <wrap em>//" | ||
+ | |||
+ | **[[https:// | ||
+ | </ | ||
+ | |||
+ | Auf RSA Schlüssel muss man aber nicht mehr zwingend zurückgreifen, | ||
+ | Diesen Schlüssel wollen wir nun auch zur Serveradministration verwenden. | ||
+ | |||
+ | === SSH Client vorbereiten === | ||
+ | Damit wir beim Verbindungsaufbau auf den Authentication Key zugreifen können, müssen wir unseren Client entsprechend vorbereiten. | ||
+ | |||
+ | In der Konfigurationsdatei // | ||
+ | $ vim ~/ | ||
+ | <file bash ~/ | ||
+ | # See backup in '/ | ||
+ | |||
+ | # File re-created by pEp | ||
+ | # See backup in '/ | ||
+ | |||
+ | # Created by pEpEngine | ||
+ | keyserver hkp:// | ||
+ | cert-digest-algo SHA256 | ||
+ | no-emit-version | ||
+ | no-comments | ||
+ | personal-cipher-preferences AES AES256 AES192 CAST5 | ||
+ | personal-digest-preferences SHA256 SHA512 SHA384 SHA224 | ||
+ | ignore-time-conflict | ||
+ | allow-freeform-uid | ||
+ | |||
+ | # Ansible generated, do not edit manual! | ||
+ | # Option use-agent für Authentication Key Nutzung des Nitrokey Start bei SSH | ||
+ | use-agent | ||
+ | </ | ||
+ | |||
+ | |||
+ | Im nächsten Schritt aktivieren wir die Option '' | ||
+ | **// des GPG-Agenten. | ||
+ | $ vim ~/ | ||
+ | <file bash ~/ | ||
+ | # See backup in '/ | ||
+ | |||
+ | # File re-created by pEp | ||
+ | # See backup in '/ | ||
+ | |||
+ | default-cache-ttl 300 | ||
+ | max-cache-ttl 999999 | ||
+ | |||
+ | # Ansible generated, do not edit manual! | ||
+ | # SSH-Support activated for gnupg-agent | ||
+ | enable-ssh-support | ||
+ | </ | ||
+ | |||
+ | Nun werden wir noch die Datei // | ||
+ | $ vim ~/.bashrc | ||
+ | <file bash ~/ | ||
+ | |||
+ | # Source global definitions | ||
+ | if [ -f /etc/bashrc ]; then | ||
+ | . /etc/bashrc | ||
+ | fi | ||
+ | |||
+ | # User specific environment | ||
+ | PATH=" | ||
+ | export PATH | ||
+ | |||
+ | # Uncomment the following line if you don't like systemctl' | ||
+ | # export SYSTEMD_PAGER= | ||
+ | |||
+ | # User specific aliases and functions | ||
+ | |||
+ | # Django : 2024-05-25 | ||
+ | # Definition des SSH_AUTH_SOCK für den Zugriff des SSH-Schlüssels auf dem Nitrokey Start | ||
+ | unset SSH_AGENT_PID | ||
+ | if [ " | ||
+ | export SSH_AUTH_SOCK=" | ||
+ | fi</ | ||
+ | |||
+ | Damit unsere Änderungen aktiv werden, müssen wir nun zum Schluss noch den **pgp-agent** restarten bzw. einen Neustart des Clients erwirken. Wir entscheiden uns der Einfachheit halber von einen Neustart des Agenten mit Hilfe des Befehls '' | ||
+ | $ pkill gpg-agent | ||
+ | |||
+ | Ein Blick in die Prozessliste zeigt, dass der Agent nicht mehr läuft. | ||
+ | $ ps aux | grep gpg-agent | ||
+ | |||
+ | django | ||
+ | |||
+ | Nun stecken wir unseren Nitrokey Start an den USB-Port und fragen den Kartenstatus ab. | ||
+ | $ gpg2 --card-status | ||
+ | < | ||
+ | Application ID ...: D276000124010304000F6447F2530000 | ||
+ | Application type .: OpenPGP | ||
+ | Version ..........: 3.4 | ||
+ | Manufacturer .....: Nitrokey | ||
+ | Serial number ....: 6447F253 | ||
+ | Name of cardholder: Michael Nausch | ||
+ | Language prefs ...: de | ||
+ | Salutation .......: Mr. | ||
+ | URL of public key : https:// | ||
+ | Login data .......: django | ||
+ | Signature PIN ....: forced | ||
+ | Key attributes ...: ed25519 cv25519 ed25519 | ||
+ | Max. PIN lengths .: 127 127 127 | ||
+ | PIN retry counter : 3 0 3 | ||
+ | Signature counter : 10 | ||
+ | KDF setting ......: off | ||
+ | UIF setting ......: Sign=off Decrypt=off Auth=off | ||
+ | Signature key ....: F5F0 CD13 074B A693 D950 F92A 0A56 C9A3 A69F E291 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Encryption key....: DBBD 5355 D9D0 334A A3FA 751F A89D D54D AE0E 394A | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | Authentication key: EE7C 3807 4F0A 8F2A 5601 BF91 1E61 4A9A 36D4 DF53 | ||
+ | created ....: 2024-12-15 17:08:38 | ||
+ | General key info..: pub ed25519/ | ||
+ | sec> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253 | ||
+ | ssb> | ||
+ | card-no: 000F 6447F253</ | ||
+ | |||
+ | Ein erneuter Blick in die Prozessliste zeigt nun den neu gestarteten Agenten. | ||
+ | $ ps aux | grep gpg-agent | ||
+ | |||
+ | django | ||
+ | django | ||
+ | |||
+ | === Public-Key des ED25519 SSH exportieren === | ||
+ | Für den Zugriff auf unser Ziel-System mit Hilfe der SSH benötigen wir noch den öffentlichen Schlüssel unseres Authentication Keys, den wir nun exportieren werden. | ||
+ | Zunächst besorgen wir uns die betreffende Schlüsselkennung des Authentication Keys, genauer gesagt die 4 letzten Zahlenreihen des nachfolgenden Aufrufs. | ||
+ | $ gpg2 --card-status | grep Authentication\ key | ||
+ | |||
+ | Authentication key: EE7C 3807 4F0A 8F2A 5601 BF91 1E61 4A9A 36D4 DF53 | ||
+ | In diesem Konfigurationsbeispiel ist die Schlüssel-ID des Autentication Keys also die Nummer '' | ||
+ | |||
+ | Nun exportieren wir den öffentlichen Schlüssel und schreiben diesen in eine separate Datei. | ||
+ | $ gpg2 --export-ssh-key 1E614A9A36D4DF53 >> ~/ | ||
+ | |||
+ | Der Öffentliche Schlüssel in diesen Konfigurationsbeispiel lautet also: | ||
+ | $ cat ~/ | ||
+ | |||
+ | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILz8sjaPGlC16rOK7s8S8gzBmbfnCOsiz4jD77+BuLn4 openpgp: | ||
+ | |||
+ | Diesen Schlüssel kopieren wir nun auf das entsprechende Zielsystem an Ort und Stelle '' | ||
+ | $ scp ~/ | ||
+ | |||
+ | === SSH-Verbindung aufbauen === | ||
+ | Nun können wir wie gewohnt eine Verbindung zu unserem entfernten System aufbauen, sofern der GPG-Agent am laufen ist. Wir können dazu entweder erst einmal abfragen, ob dieser gestartet wurde, mit Hilfe des folgenden Aufrufs: | ||
+ | $ ps -aux | grep gpg-agent | ||
+ | |||
+ | django | ||
+ | |||
+ | Oder wir fragen einfach den Karten-Status ab, was unweigerlich den Neustart des GPG-Agenten nach sich zieht. | ||
+ | $ gpg2 --card-status | ||
+ | |||
+ | Nun können wir die gewünschte Verbindung zum Zielsystem aufbauen. | ||
+ | $ ssh zielhost.dmz.nausch.org | ||
+ | |||
+ | Da der SSH-Key zur Authentication nicht im Dateisystem liegt, sondern auf der SmartCard des Nitrokey werden wir nun nach der User-PIN gefragt, damit auf den privaten Schlüssel der Karte zugegriffen werden kann. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Der entsperrte Schlüssel der SmartCard des Nitrokey Start wird nun im Speicher gehalten solange wir den USB-Hardwareschlüssel nicht abziehen. | ||
+ | |||
+ | <WRAP center round important 90%> | ||
+ | **WICHTIG: | ||
+ | Da wir den Schlüssel **__nicht__** aus einer Datei geladen hatten, können wir diese auch nicht mit Hilfe von '' | ||
+ | $ pkill gpg-agent | ||
+ | |||
+ | </ | ||
+ | |||
+ | Anschliessend lassen sich Verbindungen zu unseren Remote-Systemen erst wieder aufbauen, wenn der GPG-Agent geladen und die Karte nach Eingabe der PIN entsperrt wurde! | ||
+ |