Voraussetzungen¶
openssl
¶
"OpenSSL is a robust, commercial-grade, and full-featured toolkit for the Transport Layer Security (TLS) and Secure Sockets Layer (SSL) protocols. It is also a general-purpose cryptography library." - von der openssl-Webseite.
Beschreibung aus der Manpage
DESCRIPTION
OpenSSL is a cryptography toolkit implementing the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) network protocols and related cryptography standards required by them.
The openssl program is a command line tool for using the various cryptography functions of OpenSSL's crypto library from the shell. It can be used for
o Creation and management of private keys, public keys and parameters
o Public key cryptographic operations
o Creation of X.509 certificates, CSRs and CRLs
o Calculation of Message Digests
o Encryption and Decryption with Ciphers
o SSL/TLS Client and Server Tests
o Handling of S/MIME signed or encrypted mail
o Time Stamp requests, generation and verification
Sehen Sie sich die Manpage zu
openssl
an:man openssl
Mit
openssl help
können Sie sich dieopenssl
Kommandos auslisten lassen.Mit
openssl help kommando
erhalte Sie die Beschreibung, wie ein spezielles Kommando benutzt wird, z.B.:
openssl version
OpenSSL 1.1.1 11 Sep 2018
openssl help genrsa
Usage: genrsa [options] Valid options are: -help Display this summary -3 Use 3 for the E value -F4 Use F4 (0x10001) for the E value -f4 Use F4 (0x10001) for the E value -out outfile Output the key to specified file -rand val Load the file(s) into the random number generator -writerand outfile Write random data to the specified file -passout val Output file pass phrase source -* Encrypt the output with any supported cipher -engine val Use engine, possibly a hardware device -primes +int Specify number of primes
Erzeugen eines Private/Public Keypaares mit openssl
¶
Zwei Bash-Variablen für Dateinamen:
# Privacy Enhanced Email (pem) Format
private_keyfile="private.pem"
public_keyfile="public.pem"
Erzeugung des privaten Schlüssles interaktiv auf der Kommandozeile:
genrsa
ist das (Unter-)Kommando
openssl genrsa -out ${private_keyfile} 2048
Generating RSA private key, 2048 bit long modulus (2 primes) ............+++++ ..+++++ e is 65537 (0x010001)
Oft ist es sinnvoll den Private-Key mit einem symmetrischen Verschlüsselungsalgorithus zu schützen. Der Befehl ist dann
openssl genrsa -aes128 -out ${private_keyfile} 2048
aes128
verschlüsselt den Private Key mit einem symmetrischen Verschlüsselungsalgorithmus (AES)
Dabei wird eine Passphase
festgelegt, die später auch immer interaktiv eingegeben werden muss, wenn der Private-Key verwendet wird. Die Passphase dient dazu.
Hinweis: Der private Schlüssel muss gut verwahrt werden und darf auf keinen Fall weitergegeben werden etc. Hier nur zur Demonstration, wie ein private Keyfile aussieht. Diesen verwende ich aber natürlich nicht.
Erzeugen des korrespondierenden öffentlichen Schlüssels. Falls der Private-Key mit AES verschlüsselt wurde, hier die Passphase abgefragt:
openssl rsa -in ${private_keyfile} -pubout -out ${public_keyfile}
writing RSA key
cat ${public_keyfile}
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs4FlI8fG3xU70x/tZ03P sWPGJPxeYIBhp9ykEDC24c/a9fVYzXUkA/M04G4WuT8TIuWrt7laBx48CNpWnXak fbleELyxmG2MkdHbd++h7HioNZyGhnw4WOIyBsf7BmmVVNX956w7OMACSOhdUgqx es5Fd6YW9vwJGrT13p/hzSTL7h9dU9C2jJVaAy0IhAY1LpB5PGIYzsu3QxcNkeXV gX36IS2IqPmsjtHxINHE6ClOCswRPpCiTyVZV74XDu88+eO8x7KLy4txyON8Ndbb 4B1ii27MOY7K7WfqO27Oqsbzx+RJyJ4cUTBtGORMNbb/bszqBZjCZWAhf+5YL+A4 TwIDAQAB -----END PUBLIC KEY-----
Digitale Signatur mit openssl
¶
Recap: Mittels einer Digitalen Signatur lässt sich eine Nachricht unterschreiben mittels des privaten Keys und der Passphrase.
Dann kann mittels des öffentlichen Schlüssels überprüft werden, ob die Signatur gültig ist.
# Nachricht in Datei
filename="my_message.txt"
echo -e "Das ist meine Nachricht: Ja, glaubt mir.\nIch habe immer Recht." > $filename
Unterschreiben (Signieren) einer Nachricht mittels eines privaten Schlüssels¶
Die Nachricht kann mit dem private Key signiert werden. Falls der Private-Key mit AES verschlüsselt wurde, muss hier natürlich wieder die Passphase interaktiv eingegeben werden:
signature_file="signature.sha256"
openssl dgst -sha256 -sign $private_keyfile -out binary.$signature_file.sha256 $filename
Nebenbemerkung: Binärdateien können mittels hexdump
angezeigt werden
hexdump binary.$signature_file.sha256
0000000 5a03 9021 cd89 2260 9cfc d906 d904 8ea7 0000010 a01e 5ff1 ff65 485e f033 2924 b382 f448 0000020 5b78 82ce 65d5 d5f4 039b 3295 6fee 8769 0000030 7c28 b220 7367 cd39 dfd5 c938 c00d 735d 0000040 481e b280 b329 1143 b6cc e13e e554 d397 0000050 2a6e 5799 37fa bfed 4c1c cea2 a166 d712 0000060 ea93 31e5 e86d 06ad f258 7b9c bf3b 9c14 0000070 a04d 4aa4 d90d 518c f7cd 70e6 ac06 58b5 0000080 ef60 4c21 efec b7ce e25a c999 c012 c4ac 0000090 4cd3 8827 a598 db7b 1ea0 8d79 1329 606f 00000a0 d7c2 426c a5c0 f0ef 7bff 0894 9649 da3d 00000b0 7fb3 07c9 8ad5 5a40 04b8 0385 bb72 f2f4 00000c0 1455 8409 7ceb da7e 9666 7ad2 86a8 90ea 00000d0 61a3 84e9 eb80 d8c0 386a 393f 4ee2 c200 00000e0 2271 4fbe 2519 3e2c e5e7 b8d3 92ad 598a 00000f0 1e29 4bfc 47c9 2261 a9e0 f321 33df 5a17 0000100
Die Signatur kann man auch mittels Base64 in eine ASCII-Textdatei umwandeln:
openssl base64 -in binary.$signature_file.sha256 -out $signature_file
cat $signature_file
A1ohkInNYCL8nAbZBNmnjh6g8V9l/15IM/AkKYKzSPR4W86C1WX01ZsDlTLub2mH KHwgsmdzOc3V3zjJDcBdcx5IgLIps0MRzLY+4VTll9NuKplX+jftvxxMos5moRLX k+rlMW3orQZY8px7O78UnE2gpEoN2YxRzffmcAastVhg7yFM7O/Ot1rimckSwKzE 00wniJile9ugHnmNKRNvYMLXbELApe/w/3uUCEmWPdqzf8kH1YpAWrgEhQNyu/Ty VRQJhOt8ftpmltJ6qIbqkKNh6YSA68DYajg/OeJOAMJxIr5PGSUsPufl07itkopZ KR78S8lHYSLgqSHz3zMXWg==
Validieren¶
Überprüfen, ob die Signatur mit der Datei zusammenpasst:
Eventuell muss man die binäre Signatur für openssl
aus der Textdatei erzeugen:
openssl base64 -d -in $signature_file -out binary.$signature_file.sha256
Das eigentliche Verifizieren erfogt mittels:
openssl dgst -sha256 -verify $public_keyfile -signature binary.$signature_file.sha256 $filename
Verified OK
Nachrichten verschlüsseln und entschlüsseln¶
Verschlüsseln der Nachricht mit dem Public-Key:
openssl rsautl -encrypt -inkey $public_keyfile -pubin -in $filename -out $filename.enc
hexdump -C $filename.enc
00000000 2d 08 94 8e 9e e0 b6 36 1a 8d 97 d0 d9 41 3a ad |-......6.....A:.| 00000010 31 bb e0 eb 90 15 17 9c 63 fa ab 7d 45 3c 68 ab |1.......c..}E<h.| 00000020 a5 5b 64 f1 fe 95 79 6e fa be 15 a1 5e 8b b0 58 |.[d...yn....^..X| 00000030 3f e5 b9 24 92 af b0 34 dc 4f d1 ef 0b 00 a7 39 |?..$...4.O.....9| 00000040 b8 51 e1 83 fc 98 68 f9 71 99 57 22 27 91 e6 1e |.Q....h.q.W"'...| 00000050 3c 19 c7 74 09 c5 5b a6 76 56 89 23 ff af 73 16 |<..t..[.vV.#..s.| 00000060 91 50 eb 18 f4 e3 ca 4a f7 6a 49 b6 94 32 82 a6 |.P.....J.jI..2..| 00000070 c2 ad 6c 65 57 78 d3 87 98 31 a2 29 d9 09 9a 67 |..leWx...1.)...g| 00000080 77 43 d4 d7 97 8f 95 79 01 88 63 05 3e 30 16 90 |wC.....y..c.>0..| 00000090 8f b5 56 e3 42 54 2d e1 cc b7 59 f2 3e 58 41 ff |..V.BT-...Y.>XA.| 000000a0 af f2 8b eb 5b 2c 49 0e 7c bc 19 19 1a f5 7b 81 |....[,I.|.....{.| 000000b0 6e 0c 84 cf a2 5a e7 85 fc 33 9b b5 ba 97 00 8e |n....Z...3......| 000000c0 f4 b9 5b ad d7 46 40 79 b7 bd ff db 54 ef 19 d2 |..[..F@y....T...| 000000d0 1c 8f c6 2e 46 de ec 5f 31 7e fb 79 23 65 ee 89 |....F.._1~.y#e..| 000000e0 f3 66 f3 23 ad b4 28 c3 1b 6a be 31 46 ec 97 6f |.f.#..(..j.1F..o| 000000f0 cb 8d fa be a2 38 c5 3a 76 ff c5 7b 9b c2 96 35 |.....8.:v..{...5| 00000100
openssl rsautl -decrypt -inkey $private_keyfile -in $filename.enc > top_secret.txt
cat top_secret.txt
Das ist meine Nachricht: Ja, glaubt mir. Ich habe immer Recht.
Aufgabe (optional)¶
- Suchen Sie sich ein/e Kommiliton(en/in) und spielen Sie eine asymmetrisch verschlüsselte Kommunikation per verschlüsselter Text-Datei mit
openssl
über einen ungeschützen Kanal (z.B. per Email-Anhänge) durch:
- Erzeugen Sie zuerst die Private-Public Keys mit
openssl
. Wieviele Schlüsselpaare benötigen Sie? - Public-Key Austausch: Tauschen Sie die Schlüssel (vertrauenwürdig) aus.
- Welche Schlüssel erhält der Kommunikationspartner?
- Wieso ist der Austausch in der Praxis bei Kommunikationspartnern, die sich z.B. nicht persönlich treffen können, schwierig? Was ist das Problem dabei? Welche Lösungen wurden hierfür entwickelt?
- Schreiben Sie eine verschlüsselte Nachricht und und übermitteln Sie diese an die/den Kommunikationspartner/in. Diese/r soll mit einer verschlüsselten Nachricht antworten(, die der Empfänger natürlich entschlüsseln kann).
- Wie kann dabei gewährleistet werden, dass eine Nachricht wirklich von ihrem Kommunikationspartner stammt. Beachten Sie dabei, dass der Public-Key im Allgemeinen jedem/jeder bekannt ist. Wie müssen Sie Kommunikations-Schema erweitern, dass dies gewährleistet wird. Spielen Sie dies auch dann wieder (wie oben) durch.
Hinweis: Schreiben Sie Shellskripte, in denen Sie die openssl
-Befehle verwenden, um die Benutzung einfacher zu machen.
Datei für Zertifikatsantrag bei CA¶
Mitte Hilfe des openssl-Kommandos req
lässt sich ein eine Datei für einen Zertifikatsantrag
bei einem CA stellen:
openssl req --new -sha256 -key ${public_keyfile} -out ${csr_file}
CSR steht für Certificate Signing Request
mehr hierzu siehe z.B. https://www.keycdn.com/blog/openssl-tutorial