Benutzer-Werkzeuge

Webseiten-Werkzeuge


openssl

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
openssl [2023-05-24 13:09:35] – angelegt manfredopenssl [2025-09-19 11:08:32] (aktuell) – [SSL-Schlüssel generieren] manfred
Zeile 1: Zeile 1:
 +====== 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 ====
 +
 +<hidden /root/bin/Creating_MySQL-SSL-Files.sh>
 +<file bash /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
 +</file>
 +</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
 +