openssl¶Hier werden die Kryptographische Grundlagen um praktische Übungen mitopenssl (Schlüsselerzeugung, digitale Signatur, Ver-/Entschlüsselung, Zertifikatsantrag) ergänzt.
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 die openssl Kommandos auslisten lassen.
Mit openssl help kommando erhalte Sie die Beschreibung, wie ein spezielles Kommando benutzt wird, z.B.:
openssl version -d
apt-cache search libssl | grep SSL
openssl version
openssl help genrsa
openssl¶Zwei Bash-Variablen für Dateinamen:
# Privacy Enhanced Email (pem) Format
private_keyfile="private.pem"
public_keyfile="public.pem"
Erzeugung des privaten Schlüssels interaktiv auf der Kommandozeile:
genrsa ist das (Unter-)Kommandoopenssl genrsa -out ${private_keyfile} 2048
Oft ist es sinnvoll den Private-Key mit einem symmetrischen Verschlüsselungsalgorithmus 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 Passphrase festgelegt, die später auch immer interaktiv eingegeben werden muss, wenn der Private-Key verwendet wird. Die Passphrase dient dazu, den privaten Schlüssel zu schützen.
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.
cat ${private_keyfile}
Erzeugen des korrespondierenden öffentlichen Schlüssels. Falls der Private-Key mit AES verschlüsselt wurde, hier die Passphrase abgefragt:
openssl rsa -in ${private_keyfile} -pubout -out ${public_keyfile}
cat ${public_keyfile}
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
Die Nachricht kann mit dem private Key signiert werden. Falls der Private-Key mit AES verschlüsselt wurde, muss hier natürlich wieder die Passphrase interaktiv eingegeben werden:
signature_file="signature"
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
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
Ü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
Verschlüsseln der Nachricht mit dem Public-Key:
Hinweis: openssl rsautl ist in neueren OpenSSL-Versionen als veraltet (deprecated) markiert; der empfohlene Nachfolger ist openssl pkeyutl (z.B. openssl pkeyutl -encrypt -pubin -inkey $public_keyfile -in $filename -out $filename.enc). RSA kann zudem nur Daten verschlüsseln, die kürzer als der Schlüssel sind. In der Praxis wird deshalb hybrid verschlüsselt: RSA verschlüsselt nur einen zufälligen symmetrischen Schlüssel, mit dem die eigentlichen Daten symmetrisch verschlüsselt werden.
openssl rsautl -encrypt -inkey $public_keyfile -pubin -in $filename -out $filename.enc
hexdump -C $filename.enc
openssl rsautl -decrypt -inkey $private_keyfile -in $filename.enc > top_secret.txt
cat top_secret.txt
openssl über einen ungeschützen Kanal (z.B. per Email-Anhänge) durch:openssl. Wieviele Schlüsselpaare benötigen Sie?Hinweis: Schreiben Sie Shellskripte, in denen Sie die openssl-Befehle verwenden, um die Benutzung einfacher zu machen.
Mit Hilfe des openssl-Kommandos req lässt sich eine Datei für einen Zertifikatsantrag
bei einer CA erstellen:
openssl req -new -sha256 -key ${private_keyfile} -out ${csr_file}
Der CSR wird mit dem privaten Schlüssel signiert; der öffentliche Schlüssel wird daraus abgeleitet und in den CSR eingebettet. csr_file ist ein selbst gewählter Dateiname, z.B. csr_file="request.csr".
CSR steht für Certificate Signing Request
mehr hierzu siehe z.B. https://www.keycdn.com/blog/openssl-tutorial
Erzeugen Sie ein Self-Signed Certificate, wie hier beschrieben https://help.ubuntu.com/community/OpenSSL.