OpenSSL

Siehe auch

Der Parameter nodes steht für „No DES“ und erstellt Keys ohne Passwörter (Keys sind also nicht encrypted).

Warnung

Das auf RHEL 7 vorhandene Shell-Script /etc/pki/tls/certs/make-dummy-cert erstellt Zertifikate mit X509v3 Basic Constraints: CA:TRUE Extension, also ein CA-Zertifikat. CA-Zertifikate lassen sich in Apache nicht (mehr) als Zertifikat für einen Virtual Host nutzen, der Apache bricht dann je nach Version den Reload mit SSL-Fehlern ab (AH01906: localhost:443:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)).

Diese Art Zertifikate entstehen, wenn folgende Parameter verwendet werden:

openssl req \
    -days 365 \
    -keyout /etc/pki/tls/private/test.key \
    -newkey rsa:2048 \
    -nodes \
    -out /etc/pki/tls/certs/test.pem \
    -x509

(sehr viele Anleitungen im Internet nutzen OpenSSL genau so). Unsere Anleitung unten zeigt, wie man „echte“ self-signed Client-Zertifikate erzeugt.

DH Key erstellen

Wird für diverse Software wie OpenVPN & Co. benötigt. DH-Schlüssel werden zur Secret-Aushandlung über eine unsichere Verbindung verwendet, und können und sollten beispielsweise 1x pro Monat automatisch neu generiert werden.

openssl dhparam -out dh4096.pem 4096

openssl.cnf

Beispiel:

[ CA_default ]
dir             = /etc/pki/CA
certs           = $dir/certs
crl_dir         = $dir/crl
new_certs_dir   = $dir/newcerts
database        = $dir/index.txt
serial          = $dir/serial
crlnumber       = $dir/crlnumber
crl             = $dir/crl.pem
default_crl_days= 30
default_md      = sha256
policy          = policy_any
x509_extensions = usr_cert

[ crl_ext ]
authorityKeyIdentifier=keyid:always

[ req ]
default_bits        = 4096
default_md          = sha256
distinguished_name  = req_distinguished_name
x509_extensions     = v3_ca

[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = US
stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = State
localityName                = Locality Name (eg, city)
localityName_default        = City
organizationName            = Organization Name (eg, company)
organizationName_default    = Organization
organizationalUnitName      = Organizational Unit Name (eg, section)
organizationalUnitName_default = Org Unit
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_default          = Root CA

[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

Self-signed root-Zertifikat (CA Certificate) erstellen

Das hier erstellte CA-Zertifikat gilt 5 Jahre (1825 days).

openssl req \
    -config openssl.cnf \
    -days 1825 \
    -keyout /etc/pki/tls/private/rootCA.key \
    -new \
    -newkey rsa:4096 \
    -nodes \
    -out /etc/pki/tls/certs/rootCA.pem \
    -sha384 \
    -utf8 \
    -x509

chmod 0400 /etc/pki/tls/private/rootCA.key
chown root:root /etc/pki/tls/private/rootCA.key

Self-Signed Zertifikat erstellen

Self-Signed Zertifikat erstellen, und von eigener CA signieren lassen.

Das Zertifikat kommt ohne Passwort daher, sinnvoll z.B. für einen Web- oder DB-Server.

1.) Private Key (RSA 4096 bit) und CSR erstellen:

SERVERNAME='localhost'
SUBJECT="/C=CH/ST=Zurich/O=Linuxfabrik/CN=$SERVERNAME"

openssl req \
    -keyout /etc/pki/tls/private/$SERVERNAME.key \
    -newkey rsa:4096 \
    -nodes \
    -out $SERVERNAME.csr \
    -sha384 \
    -subj "$SUBJECT" \
    -utf8

chmod 0400 /etc/pki/tls/private/$SERVERNAME.key
chown root:root /etc/pki/tls/private/$SERVERNAME.key

2.) Self-Signed-Zertifikat mit 90 Tagen Laufzeit erstellen und von eigener CA signieren lassen:

openssl x509 \
    -CA /etc/pki/tls/certs/rootCA.pem \
    -CAcreateserial \
    -CAkey /etc/pki/tls/private/rootCA.key \
    -days 90 \
    -in $SERVERNAME.csr \
    -out /etc/pki/tls/certs/$SERVERNAME.pem \
    -req \
    -sha384

Zertifikate überprüfen/ansehen

Chain überprüfen:

CAFILE=/path/to/chain.pem

openssl verify $CAFILE

Zertifikat überprüfen:

CERT=/path/to/mycert.pem

openssl x509 \
    -in $CERT \
    -noout \
    -text

Private Key überprüfen:

PRIVKEY=/path/to/priv.key

openssl rsa \
     -check \
    -in $PRIVKEY

CSR überprüfen:

CERT=/path/to/mycert.pem

openssl req \
    -in $CERT \
    -nameopt sep_multiline \
    -noout \
    -verify

Zertifikate umwandeln

PEM-Zertifikat mit Key in ein PKCS#12 (.pfx) ohne Passwort umwandeln:

openssl pkcs12 \
    -certfile /etc/pki/tls/certs/rootCA.pem \
    -export \
    -in /etc/pki/tls/certs/$SERVERNAME.pem \
    -inkey /etc/pki/tls/private/$SERVERNAME.key \
    -out /etc/pki/tls/private/$SERVERNAME.pfx \
    -passin pass: \
    -passout pass:

PKCS#12 (.pfx) in PEM-Format exportieren:

openssl pkcs12 \
    -in /etc/pki/tls/private/$SERVERNAME.pfx \
    -info \
    -nodes

# if you get errors like "Error outputting keys and certificates, envelope default library context, Algorithm (RC2-40-CBC : 0), Properties ()"
openssl pkcs12 \
    -in /etc/pki/tls/private/$SERVERNAME.pfx \
    -info \
    -legacy \
    -nodes

CRL ausstellen

openssl ca \
    -gencrl \
    -out crl.pem \
    -utf8

Built on 2024-07-16