====== OpenSSL ====== * **[[https://wiki.openssl.org/index.php/Command_Line_Utilities]]** * [[::EDV:SSL-Schlüssel generieren]] * [[::letsencrypt]] * [[::OpenSSL]] * [[::einzelne Dateien mit openSSL verschlüsseln]] * [[::OpenSSL-Verschlüsselung von Zeichenketten]] * [[::Datenbankverbindungen zu einer MySQL mit SSL-Verschlüsselung]] ===== 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 ^ ^ EMAIL | 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]] //[[https://sslhow.com/create-private-key-with-openssl-genrsa|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 ===== [[https://dev.mysql.com/doc/refman/8.0/en/creating-ssl-files-using-openssl.html]] ==== per Skript ==== #!/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 < ${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 < ${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 > /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