openssl
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| openssl [2023-05-24 13:16:42] – [MySQL: Creating SSL Certificates and Keys Using openssl] manfred | openssl [2025-09-19 11:08:32] (aktuell) – [SSL-Schlüssel generieren] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== OpenSSL ====== | ||
| + | |||
| + | * **[[https:// | ||
| + | * [[:: | ||
| + | * [[:: | ||
| + | * [[:: | ||
| + | * [[:: | ||
| + | * [[:: | ||
| + | * [[:: | ||
| + | |||
| + | |||
| + | ===== 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 '' | ||
| + | |||
| + | ^ openssl | ||
| + | ^ Name ^ subject | ||
| + | ^ EMAIL | emailAddress | ||
| + | ^ STAAT | C | DE | | ||
| + | ^ LAND | ST | Hessen | ||
| + | ^ STADT | L | Frankfurt | ||
| + | ^ ORGANISATION | ||
| + | ^ ABTEILUNG | ||
| + | ^ 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__, | ||
| + | Die besten verfügbaren sind die folgenden (ich bevorzuge den **BlowFish**, | ||
| + | * 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:// | ||
| + | |||
| + | // | ||
| + | |||
| + | > openssl x509 -noout -text -in / | ||
| + | > openssl x509 -noout -subject -issuer -dates -in / | ||
| + | |||
| + | |||
| + | === 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: | ||
| + | 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: | ||
| + | > openssl genpkey -out private-key.pem -algorithm RSA -pkeyopt rsa_keygen_bits: | ||
| + | |||
| + | nachschauen, | ||
| + | > 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: | ||
| + | |||
| + | 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 / | ||
| + | > ls *.pem | ||
| + | private.pem | ||
| + | cert.pem | ||
| + | |||
| + | // | ||
| + | |||
| + | |||
| + | ===== aus einer PFX-Datei den Schlüssel und das Zertifikat im DER-Format exportieren ===== | ||
| + | |||
| + | Um eine PFX-Datei in eine PEM-Datei zu konvertieren, | ||
| + | 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: | ||
| + | # echo " | ||
| + | |||
| + | |||
| + | ===== MySQL ===== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | |||
| + | ==== per Skript ==== | ||
| + | |||
| + | <hidden / | ||
| + | <file bash / | ||
| + | #!/bin/bash | ||
| + | |||
| + | # | ||
| + | # Create necessary files: $database, $serial and $new_certs_dir | ||
| + | # directory (optional) | ||
| + | # | ||
| + | |||
| + | #cd /root/ || exit 1 | ||
| + | |||
| + | if [ x == " | ||
| + | # | ||
| + | DER_NAME=" | ||
| + | else | ||
| + | DER_NAME=" | ||
| + | fi | ||
| + | |||
| + | ARBEITSVERZEICHNIS=$(pwd)/ | ||
| + | rm -fr ${ARBEITSVERZEICHNIS} | ||
| + | mkdir -p ${ARBEITSVERZEICHNIS} | ||
| + | |||
| + | # | ||
| + | # Konfigurationsdatei erzeugen | ||
| + | # | ||
| + | #cp / | ||
| + | #replace ./demoCA ${ARBEITSVERZEICHNIS} -- ${ARBEITSVERZEICHNIS}/ | ||
| + | # | ||
| + | cat <<EOF > ${ARBEITSVERZEICHNIS}/ | ||
| + | HOME = . | ||
| + | oid_section | ||
| + | |||
| + | [ new_oids ] | ||
| + | tsa_policy1 | ||
| + | tsa_policy2 | ||
| + | tsa_policy3 | ||
| + | |||
| + | [ ca ] | ||
| + | default_ca | ||
| + | |||
| + | [ CA_default ] | ||
| + | dir = ${ARBEITSVERZEICHNIS} | ||
| + | certs = \$dir/certs | ||
| + | crl_dir | ||
| + | database | ||
| + | new_certs_dir | ||
| + | certificate | ||
| + | serial | ||
| + | crlnumber | ||
| + | crl = \$dir/ | ||
| + | private_key | ||
| + | x509_extensions | ||
| + | name_opt | ||
| + | cert_opt | ||
| + | default_days | ||
| + | default_crl_days | ||
| + | default_md | ||
| + | preserve | ||
| + | policy | ||
| + | |||
| + | [ policy_match ] | ||
| + | countryName | ||
| + | stateOrProvinceName | ||
| + | organizationName | ||
| + | organizationalUnitName | ||
| + | commonName | ||
| + | emailAddress | ||
| + | |||
| + | [ policy_anything ] | ||
| + | countryName | ||
| + | stateOrProvinceName | ||
| + | localityName | ||
| + | organizationName | ||
| + | organizationalUnitName | ||
| + | commonName | ||
| + | emailAddress | ||
| + | |||
| + | [ req ] | ||
| + | default_bits | ||
| + | default_keyfile | ||
| + | distinguished_name | ||
| + | attributes | ||
| + | x509_extensions | ||
| + | string_mask | ||
| + | |||
| + | [ req_distinguished_name ] | ||
| + | countryName | ||
| + | countryName_default | ||
| + | countryName_min | ||
| + | countryName_max | ||
| + | stateOrProvinceName | ||
| + | stateOrProvinceName_default | ||
| + | localityName | ||
| + | localityName_default | ||
| + | 0.organizationName | ||
| + | 0.organizationName_default | ||
| + | organizationalUnitName | ||
| + | organizationalUnitName_default | ||
| + | commonName | ||
| + | commonName_max | ||
| + | commonName_default | ||
| + | emailAddress | ||
| + | emailAddress_max | ||
| + | emailAddress_default | ||
| + | |||
| + | [ req_attributes ] | ||
| + | challengePassword | ||
| + | challengePassword_min | ||
| + | challengePassword_max | ||
| + | challengePassword_default | ||
| + | unstructuredName | ||
| + | unstructuredName_default | ||
| + | |||
| + | [ usr_cert ] | ||
| + | basicConstraints | ||
| + | nsComment | ||
| + | subjectKeyIdentifier | ||
| + | authorityKeyIdentifier | ||
| + | |||
| + | [ v3_req ] | ||
| + | basicConstraints | ||
| + | keyUsage | ||
| + | |||
| + | [ v3_ca ] | ||
| + | subjectKeyIdentifier | ||
| + | authorityKeyIdentifier | ||
| + | basicConstraints | ||
| + | |||
| + | [ crl_ext ] | ||
| + | authorityKeyIdentifier | ||
| + | |||
| + | [ proxy_cert_ext ] | ||
| + | basicConstraints | ||
| + | nsComment | ||
| + | subjectKeyIdentifier | ||
| + | authorityKeyIdentifier | ||
| + | proxyCertInfo | ||
| + | |||
| + | [ tsa ] | ||
| + | default_tsa | ||
| + | |||
| + | [ tsa_config1 ] | ||
| + | dir = / | ||
| + | serial | ||
| + | crypto_device | ||
| + | signer_cert | ||
| + | certs = \$dir/ | ||
| + | signer_key | ||
| + | signer_digest | ||
| + | default_policy | ||
| + | other_policies | ||
| + | digests | ||
| + | accuracy | ||
| + | clock_precision_digits | ||
| + | ordering | ||
| + | tsa_name | ||
| + | ess_cert_id_chain | ||
| + | ess_cert_id_alg | ||
| + | EOF | ||
| + | # -config ${ARBEITSVERZEICHNIS}/ | ||
| + | |||
| + | touch ${ARBEITSVERZEICHNIS}/ | ||
| + | echo " | ||
| + | |||
| + | DAYS=" | ||
| + | BITS=" | ||
| + | |||
| + | echo " | ||
| + | # | ||
| + | # 1. Generation of Certificate Authority(CA) | ||
| + | # => Common Name (eg, YOUR name) []:MySQL admin" | ||
| + | openssl req -new -x509 -nodes -days ${DAYS} -keyout ${ARBEITSVERZEICHNIS}/ | ||
| + | |||
| + | if [ ! -r ${ARBEITSVERZEICHNIS}/ | ||
| + | echo "Das erstellen von ${ARBEITSVERZEICHNIS}/ | ||
| + | echo " | ||
| + | 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}/ | ||
| + | |||
| + | echo " | ||
| + | # | ||
| + | # 3. Remove the passphrase from the server key | ||
| + | #" | ||
| + | openssl rsa -in ${ARBEITSVERZEICHNIS}/ | ||
| + | |||
| + | echo " | ||
| + | # | ||
| + | # 4. Sign server cert | ||
| + | #" | ||
| + | openssl x509 -req -in ${ARBEITSVERZEICHNIS}/ | ||
| + | |||
| + | 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}/ | ||
| + | |||
| + | echo " | ||
| + | # | ||
| + | # 6. Remove the passphrase from the key | ||
| + | #" | ||
| + | openssl rsa -in ${ARBEITSVERZEICHNIS}/ | ||
| + | |||
| + | echo " | ||
| + | # | ||
| + | # 7. Sign client cert | ||
| + | #" | ||
| + | openssl x509 -req -in ${ARBEITSVERZEICHNIS}/ | ||
| + | |||
| + | echo " | ||
| + | # | ||
| + | # 8. Create a my.cnf file that you can use to test the certificates | ||
| + | #" | ||
| + | cat <<EOF > ${ARBEITSVERZEICHNIS}/ | ||
| + | [client] | ||
| + | ssl-ca=${ARBEITSVERZEICHNIS}/ | ||
| + | ssl-cert=${ARBEITSVERZEICHNIS}/ | ||
| + | ssl-key=${ARBEITSVERZEICHNIS}/ | ||
| + | |||
| + | [mysqld] | ||
| + | ssl_ca=${ARBEITSVERZEICHNIS}/ | ||
| + | ssl_cert=${ARBEITSVERZEICHNIS}/ | ||
| + | ssl_key=${ARBEITSVERZEICHNIS}/ | ||
| + | EOF | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | > / | ||
| + | ... | ||
| + | # | ||
| + | # 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, | ||
| + | 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, | ||
| + | Getting CA Private Key | ||
| + | | ||
| + | ... | ||
| + | > find * -type f | grep -Fi .pem | ||
| + | mysql.server.net/ | ||
| + | mysql.server.net/ | ||
| + | mysql.server.net/ | ||
| + | mysql.server.net/ | ||
| + | mysql.server.net/ | ||
| + | mysql.server.net/ | ||
| + | mysql.server.net/ | ||
| + | mysql.server.net/ | ||
| + | |||
| + | |||
| + | ==== 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, | ||
| + | '' | ||
| + | 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, | ||
| + | '' | ||
| + | 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 / | ||
| + | > openssl x509 -text -in / | ||
| + | > openssl x509 -text -in / | ||
| + | |||
| + | 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=/ | ||
| + | |||
| + | Zweiwege-Zertifikatsprüfung (Two-Way TLS): | ||
| + | > mysql --tls-version=TLSv1.2 --ssl-mode=REQUIRED --ssl-mode=VERIFY_IDENTITY --ssl-ca=/ | ||
| + | |||
