InhaltsverzeichnisHier ist noch nicht alles getestet, bitte nur mit Vorsicht benutzen ProblemBei 'normalen' (as in ohne Master- und Subkey) GPG-Keys hat man den Nachteil dass, wenn man den privaten Schlüssel verliert man zwar den Key widerrufen (revoke) kann damit aber auch alle Signaturen verliert und damit auch seine „Identität“ im web of trust. Mit Subkeys kann zumindest der Schaden für die eigene „Identität“ begrenzt werden. SubkeysDas Konzept ist folgendes: Es wird ein reguläres GPG-Schlüsselpaar generiert welches aus einem Signingkey (die eigentliche Identität im web of trust) besteht. Es werden weitere Subkeys zum verschlüsseln und signieren generiert. Entfernt man den Masterkey erhält man einen Keyring für den alltäglichen Gebrauch. Gehen diese verloren, kann man mit dem Backup des Masterkeys die kompromitierten keys widerrufen und neue Subkeys genierieren, die Identität bleibt dabei immer an den Masterkey gebunden. How To SubkeysBackup anlegenSollten schon GPG-Keys auf dem System existieren ist es eine gute Idee ein Backup anzulegen umask 077; tar -cf $HOME/gnupg-backup.tar -C $HOME .gnupg gpg.confEine Basisinstallation von GnuPG nimmt sehr große Rücksicht auf die Kompatibiliätät mit alten Versionen. Ähnlich wie die „Cipher Lists“ von TLS-Servern kann auch diese Konfiguration gehärtet werden. # gpg.conf auf Basis von # https://github.com/ioerror/duraconf/blob/adb7536149263a02f7017b284e5cca07cc4331c1/configs/gnupg/gpg.conf # # This is an implementation of the Riseup OpenPGP Best Practices # https://help.riseup.net/en/security/message-security/openpgp/best-practices # #----------------------------- # default key #----------------------------- # The default key to sign with. If this option is not used, the default key is # the first key found in the secret keyring #default-key 0xD8692123C4065DEA5E0F3AB5249B39D24F25E3B6 #----------------------------- # behavior #----------------------------- # Disable output of copyright & version information no-greeting # Disable inclusion of the version string in ASCII armored output no-emit-version # Disable comment string in clear text signatures and ASCII armored messages no-comments # Display long key IDs keyid-format 0xlong # List all keys (or the specified ones) along with their fingerprints with-fingerprint # Display the calculated validity of user IDs during key listings list-options show-uid-validity verify-options show-uid-validity # Try to use the GnuPG-Agent. With this option, GnuPG first tries to connect to # the agent before it asks for a passphrase. use-agent # Charset used for output display-charset utf-8 # Charset used to interpret input utf8-strings #----------------------------- # keyserver #----------------------------- # This is the server that --recv-keys, --send-keys, and --search-keys will # communicate with to receive keys from, send keys to, and search for keys on keyserver hkp://pool.sks-keyservers.net # HKP reveals the requested identities during the network transport. # Use HKPS *instead* to protect this information. # To use a HKPS (secure HKP) the correct CA certificate must be downloaded. # wget -O/path/to/hkps.pool.sks-keyservers.net.pem https://sks-keyservers.net/sks-keyservers.netCA.pem # Please read: https://sks-keyservers.net/overview-of-pools.php#pool_hkps #keyserver hkps://hkps.pool.sks-keyservers.net ca-cert-file=/path/to/hkps.pool.sks-keyservers.net.pem # Provide a certificate store to override the system default # Get this from https://sks-keyservers.net/sks-keyservers.netCA.pem # keyserver-options ca-cert-file=/usr/local/etc/ssl/certs/hkps.pool.sks-keyservers.net.pem # Set the proxy to use for HTTP and HKP keyservers - default to the standard # local Tor socks proxy # It is encouraged to use Tor for improved anonymity. Preferrably use either a # dedicated SOCKSPort for GnuPG and/or enable IsolateDestPort and # IsolateDestAddr #keyserver-options http-proxy=socks5-hostname://127.0.0.1:9050 # Don't leak DNS, see https://trac.torproject.org/projects/tor/ticket/2846 #keyserver-options no-try-dns-srv # When using --refresh-keys, if the key in question has a preferred keyserver # URL, then disable use of that preferred keyserver to refresh the key from keyserver-options no-honor-keyserver-url # When searching for a key with --search-keys, include keys that are marked on # the keyserver as revoked keyserver-options include-revoked #----------------------------- # algorithm and ciphers #----------------------------- # list of personal digest preferences. When multiple digests are supported by # all recipients, choose the strongest one personal-cipher-preferences AES256 AES192 AES CAST5 # list of personal digest preferences. When multiple ciphers are supported by # all recipients, choose the strongest one personal-digest-preferences SHA512 SHA384 SHA256 SHA224 # message digest algorithm used when signing a key cert-digest-algo SHA512 # This preference list is used for new keys and becomes the default for # "setpref" in the edit menu default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed Hinweise und Erläuterungen
0a1,3 > # gpg.conf auf Basis von > # https://github.com/ioerror/duraconf/blob/adb7536149263a02f7017b284e5cca07cc4331c1/configs/gnupg/gpg.conf > 20a24,26 > # Disable output of copyright & version information > no-greeting > 40a47,52 > # Charset used for output > display-charset utf-8 > > # Charset used to interpret input > utf8-strings > 48c60,67 < keyserver hkps://hkps.pool.sks-keyservers.net --- > keyserver hkp://pool.sks-keyservers.net > > # HKP reveals the requested identities during the network transport. > # Use HKPS *instead* to protect this information. > # To use a HKPS (secure HKP) the correct CA certificate must be downloaded. > # wget -O/path/to/hkps.pool.sks-keyservers.net.pem https://sks-keyservers.net/sks-keyservers.netCA.pem > # Please read: https://sks-keyservers.net/overview-of-pools.php#pool_hkps > #keyserver hkps://hkps.pool.sks-keyservers.net ca-cert-file=/path/to/hkps.pool.sks-keyservers.net.pem 52c71 < keyserver-options ca-cert-file=/usr/local/etc/ssl/certs/hkps.pool.sks-keyservers.net.pem --- > # keyserver-options ca-cert-file=/usr/local/etc/ssl/certs/hkps.pool.sks-keyservers.net.pem 62c81 < keyserver-options no-try-dns-srv --- > #keyserver-options no-try-dns-srv Masterkey generierengpg --gen-key Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 4 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <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 [...] Enter Credentials Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O Signin Subkey generierenKey id raussuchen: gpg --list-keys $NAME Masterkey editieren: gpg --edit-key $MASTERKEYID gpg> addkey Please select what kind of key you want: (3) DSA (sign only) (4) RSA (sign only) (5) Elgamal (encrypt only) (6) RSA (encrypt only) Your selection? 4 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <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) 2y Encryption Subkey generierenWie beim Signing Subkey nur diesmal als Keytype 6 auswählen Revocation Certificate generierengpg --output $REVOKECERT --gen-revoke $MASTERKEYID Dieses revocation certificate wird nur benutzt um den Masterkey zu widerrufen, falls dieser verloren geht. Subkeys werden mit dem Masterkey widerrufen, nicht mit diesem Zertifikat! Masterkey und Subkey exportierengpg --armor --export-secret-keys $MASTERKEYID > $MASTERKEYID_secret.asc gpg --armor --export-secret-subkeys $MASTERKEYID > $MASTERKEYID_secret_subkeys.asc Diese beiden Dateien und das revocation certificate für den Masterkey müssen auf einen (verschlüsselten) USB Stick o.ä. gespeichert und sicher aufbewahrt werden! Wird kein Livesystem zum generieren der Keys verwendet sollten die Dateien danach zerstört werden shred -vfzu -n 10 $MASTERKEYID_secret.asc $MASTERKEYID_secret_subkeys.asc $REVOKECERT Subkeys exportierengpg --output $SUBFILENAME --export-secret-subkeys $MASTERKEYID Masterkey löschengpg --delete-secret-keys $MASTERKEYID Subkeys wieder importierengpg --import $SUBFILENAME Passwort für den Subkey änderngpg --edit-key $MASTERKEYID gpg> passwd [...] Überprüfen des Schlüsselbundesgpg -K /home/gpg/.gnupg/secring.gpg ---------------------------- sec# 4096R/0xFFFFFFFFFFFFFFFF 2016-05-17 uid Foo Bar <foo@bar.baz> ssb 4096R/0xEEEEEEEEEEEEEEEE 2016-05-17 ssb 4096R/0xDDDDDDDDDDDDDDDD 2016-05-17 gpg -k /home/gpg/.gnupg/pubring.gpg ---------------------------- pub 4096R/0xFFFFFFFFFFFFFFFF 2016-05-17 uid [ultimate] Foo Bar <foo@bar.baz> sub 4096R/0xEEEEEEEEEEEEEEEE 2016-05-17 [expires: 2018-05-17] sub 4096R/0xDDDDDDDDDDDDDDDD 2016-05-17 [expires: 2018-05-17] In diesem Beispiel gibt es einen geheimen 4096-bit langen, RSA-Masterkey (sec#) mit der ID 0xFFFFFFFFFFFFFFFF. Die # zeigt dass der eigenliche Masterkey nicht(!) im Schlüsselbund vorhanden ist und nur Metainformationen angezeigt werden. Wäre der Masterkey vorhanden würde die # fehlen. Die user-id (uid) und die dazugehörige Emailadresse des Masterkeys sind Metainformationen. Der Master key hat zwei geheime sub keys (ssb). Jeder Subkey hat eine eigene ID. How To KeysigningMasterkey importierengpg --no-default-keyring --keyring ./tmp-public-kr.gpg --secret-keyring ./tmp-private-kr.gpg --trustdb-name ./tmp-trustdb.gpg --import ../$MASTERKEYID_secret.asc Key importierengpg --no-default-keyring --keyring ./tmp-public-kr.gpg --secret-keyring ./tmp-private-kr.gpg --trustdb-name ./tmp-trustdb.gpg \ --keyserver x-hkp://$KEYSERVER --recv-keys $FOREIGNKEYID Import überprüfengpg --no-default-keyring --keyring ./tmp-public-kr.gpg --secret-keyring ./tmp-private-kr.gpg --trustdb-name ./tmp-trustdb.gpg \ --list-keys $FOREIGNKEYID Key signierengpg --no-default-keyring --keyring ./tmp-public-kr.gpg --secret-keyring ./tmp-private-kr.gpg --trustdb-name ./tmp-trustdb.gpg --sign-key --ask-cert-level $FOREIGNKEY Key an Keyserver sendengpg --no-default-keyring --keyring ./tmp-public-kr.gpg --secret-keyring ./tmp-private-kr.gpg --trustdb-name ./tmp-trustdb.gpg --keyserver keys.gnupg.net --send-key $FOREIGNKEYID How To Subkey widerrufen (revoke)Masterkey importierengpg --no-default-keyring --keyring /tmp-public-kr.gpg --secret-keyring ./tmp-private-kr.gpg --trustdb-name ./tmp-trustdb.gpg --import path/to/$MASTERKEYID_secret.asc Revokecertificate generierengpg --no-default-keyring --keyring ./tmp-public-kr.gpg --secret-keyring ./tmp-private-kr.gpg --trustdb-name ./tmp-trustdb.gpg --expert --edit-key $MASTERKEYID gpg> list gpg> key 1 gpg> key 2 gpg> revoke Key an Keyserver sendengpg --no-default-keyring --keyring ./tmp-public-kr.gpg --secret-keyring ./tmp-private-kr.gpg --trustdb-name ./tmp-trustdb.gpg --send-key --keyserver $KEYSERVER $MASTERKEYID optional: Raspberry Pi Hardware Zufallszahlengeneratorhttp://pastehtml.com/view/crkxyohmp.rtxt http://lxr.free-electrons.com/source/drivers/char/hw_random/bcm2835-rng.c?v=4.4#L64 sudo tee -a /boot/config.txt <<EOF # Enable HWrng dtparam=random=on EOF sudo apt-get -y install rng-tools sudo shutdown -r now optional: Javacard / OpenPGPCard unter Debian Jessie erstellenJava-Compiler, ant, git, Smartcard-Daemon für GnuPG 2 und Chipkartentreiber installieren # Debian Jessie sudo apt-get -y install git openjdk-8-jdk ant libccid libifd-cyberjack6 scdaemon OpenPGPCard Cardlet auschecken, kompilieren & auf JavaCard installieren git clone https://github.com/jderuiter/javacard-openpgpcard.git cd javacard-openpgpcard ant # Smartcard einlegen / mit USB verbinden ant install cd .. Toolkit für GlobalPlatform installieren um Karte zu „versiegeln“ git clone https://github.com/martinpaljak/GlobalPlatformPro.git cd GlobalPlatformPro ant java -jar gp.jar -lock $(dd bs=16 count=1 status=none if=/dev/urandom | hexdump -ve '/1 "%02X"') # DES3 Key notieren!!! # Karte wieder entsperren mit (0123456789ABCDEF0123456789ABCDEF mit notiertem Key ersetzen): # java -jar gp.jar -key 0123456789ABCDEF0123456789ABCDEF -lock cd .. |