Inhaltsverzeichnis
OpenSSL
Allgemeines
Ich würde mir eher Sorgen darüber machen, dass Ihre SSL-Verschlüsselung nicht sicher sind.
Adi Shamir (das „S“ in RSA) empfahl bereits 2006 die Umstellung auf 2048-Bit-Schlüssel. Selbst das amerikanische Normungsinstitut (NIST) hat seit Januar 2011 2048 Bit als erforderliche Mindeststärke festgelegt!
| openssl | ||
|---|---|---|
| Name | subject | Wert |
| emailAddress | deine.email@adresse.de | |
| STAAT | C | DE |
| LAND | ST | Hessen |
| STADT | L | Frankfurt |
| ORGANISATION | O | Für Einigkeit und Recht und Freiheit |
| ABTEILUNG | OU | Wachsames Auge |
| Common Name | CN | FQDN oder Dein Name |
mögliche Verschlüsselungsalgorithmen
nutzbare Verschlüsselungsalgorithmen anzeigen lassen:
Linux und FreeBSD 14.0:
> openssl enc -list > openssl list -cipher-commands > openssl list -cipher-algorithms
älteres FreeBSD:
> openssl enc -ciphers > openssl list -cipher-commands > openssl list -cipher-algorithms ... aes-256-cbc ... bf-cbc ...
Leider werden die guten Algotithmen (wie Serpent, Twofish oder MARS) von OpenSSL nicht unterstützt. Die besten verfügbaren sind die folgenden (ich bevorzuge den BlowFish, es ist der Vorgänger Twofish, mit genügend Wiederholung → mind. 1 Mio.):
- AES-256-CBC
- BF-CBC (blowfish)
Das sind alles Synonyme für BlowFish:
- blowfish
- bf
- bf-cbc
- BF-CBC
Primzahl generieren
generiert eine Primzahl:
> openssl prime -generate -bits 48
generiert eine sichere Primzahl:
> openssl prime -generate -safe -bits 48
HASH / Quersummer
eine Datei anlegen, die verschlüsselt werden soll:
> echo "Hallo Welt!" > Text.txt
> openssl dgst -sha3-512 Datei.edg > openssl sha3-512 Datei.edg
SSL-Schlüssel generieren
https://wiki.openssl.org/index.php/Command_Line_Utilities
openssl genpkey vs genrsa: Das Dienstprogramm „openssl genpkey“ hat das Dienstprogramm „genrsa“ abgelöst.
> openssl x509 -noout -text -in /etc/mysql/server-cert.pem > openssl x509 -noout -subject -issuer -dates -in /etc/mysql/server-cert.pem
Curve-Schlüssel
Generate an X25519 private key:
> openssl genpkey -algorithm X25519 -out private-key.pem
Generate an ED448 private key:
> openssl genpkey -algorithm ED448 -out private-key.pem
> openssl ecparam -list_curves > openssl ecparam -name sect571r1 -out sect571r1.pem > openssl ecparam -in sect571r1.pem -noout -text EC-Parameters: (570 bit) ASN1 OID: sect571r1 NIST CURVE: B-571
ungeschützten Schlüssel erstellen:
> openssl genpkey -paramfile sect571r1.pem -out private-key.pem
geschützten Schlüssel erstellen:
> openssl genpkey -aes256 -paramfile sect571r1.pem -out private-key.pem Enter PEM pass phrase: Verifying - Enter PEM pass phrase: > openssl pkey -in private-key.pem -text
> openssl pkey -in private-key.pem -out public-key.pem -pubout Enter pass phrase for private-key.pem: > openssl pkey -in public-key.pem -pubin -text
RSA-Schlüssel nach neuer Methode
einen privaten RSA-Schlüssel generieren (neue Methode):
> openssl genpkey -out private-key.pem -algorithm RSA > openssl genpkey -out private-key.pem -algorithm RSA -pkeyopt rsa_keygen_bits:4096 > openssl genpkey -out private-key.pem -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -aes256
nachschauen, wie lang der Schlüssel ist (Textausgabe):
> openssl pkey -in private-key.pem -text
einen privaten RSA-Schlüssel generieren, mit Textausgabe in der PEM-Datei:
> openssl genpkey -out private-key.pem -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -aes256 -text
aus dem privaten RSA-Schlüssel einen öffentlichen RSA-Schlüssel generieren (neue Methode):
> openssl pkey -in private-key.pem -out public-key.pem -pubout > openssl pkey -in public-key.pem -pubin -text
RSA-Schlüssel nach alter Methode
einen privaten RSA-Schlüssel generieren (alte Methode):
> openssl genrsa -out private.pem 4096 > ls *.pem private.pem
aus dem privaten RSA-Schlüssel einen öffentlichen RSA-Schlüssel generieren (alte Methode):
> openssl rsa -in private.pem -out public.pem -outform PEM -pubout > ls *.pem private.pem public.pem
einen privaten RSA-Schlüssel mit dazugehörigem (öffentlichen) Zertifikat erzeugen:
> openssl req -rand /dev/urandom -new -x509 -newkey rsa:4096 -sha3-512 -nodes -keyform PEM -keyout private.pem -outform PEM -out cert.pem -days 7000 -subj /emailAddress=email@adresse.de/C=DE/ST=Hessen/L=Frankfurt/O=Firma/OU=Abteilung/CN=Hostname > ls *.pem private.pem cert.pem
Verschlüsselung funktioniert mit einem öffentlichen RSA-Schlüssel und mit einem Zertifikat.
aus einer PFX-Datei den Schlüssel und das Zertifikat im DER-Format exportieren
Um eine PFX-Datei in eine PEM-Datei zu konvertieren, die sowohl das Zertifikat als auch den privaten Schlüssel enthält, muss der folgende Befehl verwendet werden:
openssl pkcs12 -nodes -in filename.pfx -out filename.pem
Mit diesem Befehl können Sie den privaten Schlüssel aus einer PFX-Datei in eine PEM-Datei extrahieren:
openssl pkcs12 -nocerts -in filename.pfx -out filename.key
Mit diesem Befehl können Sie das Zertifikat aus einer PFX-Datei in eine PEM-Datei extrahieren:
openssl pkcs12 -clcerts -nokeys -in filename.pfx -out filename.crt
Passwort vom extrahierten privaten Schlüssel entfernen:
openssl rsa -in filename.key -out filename_nopw.key
SSL-Test auf eine MySQL-DB:
# openssl s_client -connect 127.0.0.1:3306 -tls1_2 # echo "STATUS;" | mysql --ssl-mode=required -h127.0.0.1 -P3306
MySQL
per Skript
<hidden /root/bin/Creating_MySQL-SSL-Files.sh>
- /root/bin/Creating_MySQL-SSL-Files.sh
#!/bin/bash #------------------------------------------------------------------------------# # Create necessary files: $database, $serial and $new_certs_dir # directory (optional) #------------------------------------------------------------------------------# #cd /root/ || exit 1 if [ x == "x${1}" ] ; then #DER_NAME="openssl" DER_NAME="mysql.server.net" else DER_NAME="${1}" fi ARBEITSVERZEICHNIS=$(pwd)/${DER_NAME} rm -fr ${ARBEITSVERZEICHNIS} mkdir -p ${ARBEITSVERZEICHNIS} # # Konfigurationsdatei erzeugen # #cp /etc/ssl/openssl.cnf ${ARBEITSVERZEICHNIS}/ #replace ./demoCA ${ARBEITSVERZEICHNIS} -- ${ARBEITSVERZEICHNIS}/openssl.cnf # cat <<EOF > ${ARBEITSVERZEICHNIS}/openssl.cnf HOME = . oid_section = new_oids [ new_oids ] tsa_policy1 = 1.2.3.4.1 tsa_policy2 = 1.2.3.4.5.6 tsa_policy3 = 1.2.3.4.5.7 [ ca ] default_ca = CA_default [ CA_default ] dir = ${ARBEITSVERZEICHNIS} certs = \$dir/certs crl_dir = \$dir/crl database = \$dir/index.txt new_certs_dir = \$dir/newcerts certificate = \$dir/ca-cert.pem serial = \$dir/serial crlnumber = \$dir/crlnumber crl = \$dir/crl.pem private_key = \$dir/ca-key.pem x509_extensions = usr_cert name_opt = ca_default cert_opt = ca_default default_days = 3650 default_crl_days = 30 default_md = default preserve = no policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 4096 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca string_mask = utf8only [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = DE countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Hessen localityName = Locality Name (eg, city) localityName_default = Maintal 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Für Einigkeit und Recht und Freiheit organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_default = Wachsames Auge commonName = Common Name (e.g. server FQDN or YOUR name) commonName_max = 64 commonName_default = ${DER_NAME} emailAddress = Email Address emailAddress_max = 64 emailAddress_default = deine.email@adresse.de [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 challengePassword_default = abcd unstructuredName = An optional company name unstructuredName_default = Fernglas [ usr_cert ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical,CA:true [ crl_ext ] authorityKeyIdentifier = keyid:always [ proxy_cert_ext ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer proxyCertInfo = critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo [ tsa ] default_tsa = tsa_config1 [ tsa_config1 ] dir = /root/Creating_MySQL-SSL-Files/openssl serial = \$dir/tsaserial crypto_device = builtin signer_cert = \$dir/tsacert.pem certs = \$dir/cacert.pem signer_key = \$dir/private/tsakey.pem signer_digest = sha256 default_policy = tsa_policy1 other_policies = tsa_policy2, tsa_policy3 digests = sha256, sha384, sha512 accuracy = secs:1, millisecs:500, microsecs:100 clock_precision_digits = 0 ordering = yes tsa_name = yes ess_cert_id_chain = no ess_cert_id_alg = sha512 EOF # -config ${ARBEITSVERZEICHNIS}/openssl.cnf touch ${ARBEITSVERZEICHNIS}/index.txt echo "01" > ${ARBEITSVERZEICHNIS}/serial DAYS="3650" BITS="4096" echo " # # 1. Generation of Certificate Authority(CA) # => Common Name (eg, YOUR name) []:MySQL admin" openssl req -new -x509 -nodes -days ${DAYS} -keyout ${ARBEITSVERZEICHNIS}/ca-key.pem -out ${ARBEITSVERZEICHNIS}/ca.pem -config ${ARBEITSVERZEICHNIS}/openssl.cnf if [ ! -r ${ARBEITSVERZEICHNIS}/ca.pem ] ; then echo "Das erstellen von ${ARBEITSVERZEICHNIS}/ca.pem ist fehlgeschlagen." echo "ABBRUCH" exit 1 fi echo " #------------------------------------------------------------------------------# # 2. Create server request and server key # => Common Name (eg, YOUR name) []:MySQL server" openssl req -newkey rsa:${BITS} -days ${DAYS} -nodes -keyout ${ARBEITSVERZEICHNIS}/server-key.pem -out ${ARBEITSVERZEICHNIS}/server-req.pem -config ${ARBEITSVERZEICHNIS}/openssl.cnf echo " # # 3. Remove the passphrase from the server key #" openssl rsa -in ${ARBEITSVERZEICHNIS}/server-key.pem -out ${ARBEITSVERZEICHNIS}/server-key.pem echo " # # 4. Sign server cert #" openssl x509 -req -in ${ARBEITSVERZEICHNIS}/server-req.pem -days ${DAYS} -CA ${ARBEITSVERZEICHNIS}/ca.pem -CAkey ${ARBEITSVERZEICHNIS}/ca-key.pem -set_serial 01 -out ${ARBEITSVERZEICHNIS}/server-cert.pem echo " #------------------------------------------------------------------------------# # 5. Create client request and client key # => Common Name (eg, YOUR name) []:MySQL user" openssl req -newkey rsa:${BITS} -days ${DAYS} -nodes -keyout ${ARBEITSVERZEICHNIS}/client-key.pem -out ${ARBEITSVERZEICHNIS}/client-req.pem -config ${ARBEITSVERZEICHNIS}/openssl.cnf echo " # # 6. Remove the passphrase from the key #" openssl rsa -in ${ARBEITSVERZEICHNIS}/client-key.pem -out ${ARBEITSVERZEICHNIS}/client-key.pem echo " # # 7. Sign client cert #" openssl x509 -req -in ${ARBEITSVERZEICHNIS}/client-req.pem -days ${DAYS} -CA ${ARBEITSVERZEICHNIS}/ca.pem -CAkey ${ARBEITSVERZEICHNIS}/ca-key.pem -set_serial 01 -out ${ARBEITSVERZEICHNIS}/client-cert.pem echo " # # 8. Create a my.cnf file that you can use to test the certificates #" cat <<EOF > ${ARBEITSVERZEICHNIS}/my.cnf [client] ssl-ca=${ARBEITSVERZEICHNIS}/ca.pem ssl-cert=${ARBEITSVERZEICHNIS}/client-cert.pem ssl-key=${ARBEITSVERZEICHNIS}/client-key.pem [mysqld] ssl_ca=${ARBEITSVERZEICHNIS}/ca.pem ssl_cert=${ARBEITSVERZEICHNIS}/server-cert.pem ssl_key=${ARBEITSVERZEICHNIS}/server-key.pem EOF
</hidden>
> /root/bin/Creating_MySQL-SSL-Files.sh mysql.server.net ... # # 4. Sign server cert # Signature ok subject=C = DE, ST = Hessen, L = Maintal, O = Für Einigkeit und Recht und Freiheit, OU = Wachsames Auge, CN = mysql.server.net, emailAddress = deine.email@adresse.de Getting CA Private Key ... # # 7. Sign client cert # Signature ok subject=C = DE, ST = Hessen, L = Maintal, O = Für Einigkeit und Recht und Freiheit, OU = Wachsames Auge, CN = mysql.server.net, emailAddress = deine.email@adresse.de Getting CA Private Key ... > find * -type f | grep -Fi .pem mysql.server.net/ca-key.pem mysql.server.net/ca.pem mysql.server.net/client-key.pem mysql.server.net/client-req.pem mysql.server.net/client-cert.pem mysql.server.net/server-key.pem mysql.server.net/server-req.pem mysql.server.net/server-cert.pem
von Hand
Create clean environment
rm -rf newcerts mkdir newcerts && cd newcerts
Create CA certificate
openssl req -new -x509 -nodes -days 3650 -keyout ca-key.pem -out ca.pem
Create server certificate, remove passphrase, and sign it
server-cert.pem = public key, server-key.pem = private key
openssl req -newkey rsa:4096 -days 3650 -nodes -keyout server-key.pem -out server-req.pem openssl rsa -in server-key.pem -out server-key.pem openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Create client certificate, remove passphrase, and sign it
client-cert.pem = public key, client-key.pem = private key
openssl req -newkey rsa:4096 -days 3650 -nodes -keyout client-key.pem -out client-req.pem openssl rsa -in client-key.pem -out client-key.pem openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
CLI-Test
META-Daten des Zertifikates anzeigen:
> openssl x509 -text -in /var/lib/mysql/ca.pem > openssl x509 -text -in /var/lib/mysql/server-cert.pem > openssl x509 -text -in /var/lib/mysql/client-cert.pem
ohne Zertifikatsprüfung:
> mysql --tls-version=TLSv1.2 --ssl-mode=REQUIRED
Einweg-Zertifikatsprüfung (One-Way TLS):
> mysql --tls-version=TLSv1.2 --ssl-mode=REQUIRED --ssl-mode=VERIFY_IDENTITY --ssl-ca=/var/lib/mysql/ca.pem
Zweiwege-Zertifikatsprüfung (Two-Way TLS):
> mysql --tls-version=TLSv1.2 --ssl-mode=REQUIRED --ssl-mode=VERIFY_IDENTITY --ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem
