Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Navigation

Mein Blog magenbrot.net



Mail-, Web-, Domainhosting und vieles mehr durch OVTEC Völker IT.

linux:kryptographie:ssl:openssl-zertifikate

OpenSSL-Zertifikate

Bitte gebt niemals eure .key Dateien an andere weiter oder speichert Sie lesbar im Netz. Die .key Datei sollte sicher aufbewahrt sein. Verliert Ihr Sie, gibt es keine Chance das dazugehörige Zertifikat weiter zu verwenden.

CSR erzeugen/anzeigen (Certificate Signing Request)

Wenn Ihr ein offizielles Zertifikat beantragen wollt, dann ist normalerweise nur diese Datei zertifikatsname.csr nötig. Diese wird auf der Webseite Eurer CA (z.B. Thawte, Geotrust, Startssl) hochgeladen und damit dann das endgültige Zertifikat erzeugt, das ihr dann zusammen mit den Zwischenzertifikaten (intermediate-certificate) herunterladen könnt.

  • mit diesen Kommandos könnt ihr einen Key und das dazu gehörende CSR erstellen
# 4096 Bit RSA-Key erzeugen
openssl genrsa -out <zertifikatsname.key> 4096

# den CSR dazu erzeugen
openssl req -new -sha256 -key <zertifikatsname.key> -out <zertifikatsname.csr>

#jetzt sind ein paar Fragen zu beantworten (gibt man nur einen . ein so bleibt das Feld leer):
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Bayern
Locality Name (eg, city) []:Fuerth
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Deine Firma
Organizational Unit Name (eg, section) []:.

Common Name (eg, YOUR name) []:www.meinedomain.de
Email Address []:webmaster@meinedomain.de

Please enter the following 'extra' attributes to be sent with your certificate request
A challenge password []:
An optional company name []:

# (optional) den Key mit einer Passphrase versehen. Diese Passphrase wird dann z.B. beim Starten von Apache abgefragt. Also Achtung: Ein automatischer Start des Apachen ist dann nur noch mit weiteren Tricks möglich.

openssl rsa -des3 -in <zertifikatsname.key> -out <zertifikatsname.key.sec>
  • einen CSR (Zertifikatsrequest) anzeigen
openssl req -noout -text -in <request.csr>

Anzeigen / Prüfen / Testen

  • Zertifikat komplett anzeigen
openssl x509 -noout -text -in <zertifikatsname.crt>
  • den Herausgeber des Zertifikats anzeigen
openssl x509 -noout -issuer -in <zertifikatsname.crt>
  • Für wen wurde das Zertifikat ausgestellt?
openssl x509 -noout -subject -in <zertifikatsname.crt>
  • Für welchen Zeitraum ist das Zertifikat gültig?
openssl x509 -noout -dates -in <zertifikatsname.crt>
  • das obige kombiniert anzeigen
openssl x509 -noout -issuer -subject -dates -in <zertifikatsname.crt>
  • den hash anzeigen
openssl x509 -noout -hash -in <zertifikatsname.crt>
  • den MD5-Fingerprint anzeigen
openssl x509 -noout -fingerprint -in <zertifikatsname.crt>
  • ein SSL-Zertifikat prüfen
openssl verify -CApath /etc/pki/tls/certs -verbose <zertifikatsname.crt>
  • einen SSL-Port auf Zertifikate abfragen (Beispiel LDAP)
echo QUIT | openssl s_client -CApath /etc/pki/tls/certs -connect localhost:636 -showcerts
  • ein HTTPS-Serverzertifikat runterladen
echo QUIT | openssl s_client -connect www.magenbrot.net:443 | sed -ne '/BEGIN CERT/,/END CERT/p' > zertifikat.crt
  • ein HTTPS-Serverzertifikat runterladen und in lesbar ausgeben
echo QUIT | openssl s_client -connect www.magenbrot.net:443 | openssl x509 -noout -text
  • Gültigkeit eines HTTPS-Serverzertifikats anzeigen
echo QUIT | openssl s_client -connect www.magenbrot.net:443 2>/dev/null | openssl x509 -noout -dates
  • bei Webservern mit SNI muss der gewünschte Host im Header mitgeschickt werden, da sonst das SSL-Zertifikat des Default-Vhosts ausgeliefert wird
echo QUIT | openssl s_client -tls1_2 -servername ovtec.it -connect ovtec.it:443 | openssl x509 -noout -text
  • das Gleiche für Mailservices mit STARTTLS (SMTP, IMAP, POP3)
# herunterladen und in Datei speichern:
echo QUIT | openssl s_client -starttls smtp -crlf -connect mailgw.ovtec.it:25 | sed -ne '/BEGIN CERT/,/END CERT/p' > zertifikat.crt
echo QUIT | openssl s_client -starttls pop3 -crlf -connect mail.ovtec.de:110 | sed -ne '/BEGIN CERT/,/END CERT/p' > zertifikat.crt
echo QUIT | openssl s_client -starttls imap -crlf -connect mail.ovtec.de:143 | sed -ne '/BEGIN CERT/,/END CERT/p' > zertifikat.crt

# in lesbar ausgeben:
echo QUIT | openssl s_client -starttls smtp -crlf -connect mailgw.ovtec.it:25 | openssl x509 -noout -text
echo QUIT | openssl s_client -starttls pop3 -crlf -connect mail.ovtec.de:110 | openssl x509 -noout -text
echo QUIT | openssl s_client -starttls imap -crlf -connect mail.ovtec.de:143 | openssl x509 -noout -text

Passphrase entfernen/ändern

  • Passphrase für ein Keyfile entfernen
openssl rsa -in <zertifikatsname.key> -out <neueskeyfile.key>
  • Passphrase für ein Keyfile ändern
openssl rsa -des3 -in <zertifikatsname.key> -out <neueskeyfile.key>

selbstsignierte (selfsigned) Zertifikate erstellen

Diese Zertifikate können für interne Zwecke eingesetzt werden oder für den Zeitraum bis man von der Trusted CA sein richtiges Zertifikat bekommt. Mit wenigen Schritten ist ein solches Zertifikat erstellt, diese Beispiel erzeugt ein für 60 Tage gültiges Zertifikat:

openssl genrsa -out <zertifikatsname.key> 4096
[...]
openssl req -new -sha256 -key <zertifikatsname.key> -out <zertifikatsname.csr> #(siehe oben)
[...]
openssl x509 -req -sha256 -days 60 -in <zertifikatsname.csr> -signkey <zertifikatsname.key> -out <zertifikatsname.crt>
[...]

oder als komfortabler Einzeiler:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -sha256 -nodes -subj "/C=DE/ST=Bayern/L=Nuernberg/O=Firma/CN=app.mytest.de"

prüfen ob ein Zertifikat zu einem Key passt

Der private Teil eines Schlüssels enthält verschiedene Zahlen. Zwei dieser Zahlen bilden den „Publiy Key“ (diese Zahlen sind dann auch im Zertifikat erhalten), der Rest gehört zum „Private Key“. Um zu prüfen, ob der public key zum private key passt, können diese beiden Zahlen ausgelesen und verglichen werden.

# Zertifikate
$ openssl x509 -noout -modulus -in server.crt | openssl md5
# Private Schlüssel
$ openssl rsa -noout -modulus -in server.key | openssl md5
# Zertifikatsanforderung
$ openssl req -noout -modulus -in server.csr | openssl md5

oder als einfach zu verwendendes Script:

#!/bin/bash
#
# check if certificate, signing request and key match
#
# $Id: check-certificate.sh 524 2016-01-15 11:30:11Z magenbrot $
# zlFamous added intermediate and key size check
#
 
if [ "x$1" = "x" ]; then
  echo "Usage: $0 <filename without .key, .crt, .csr or .intermediates>"
  exit 1
fi
 
if [ -e $1.key ]; then
  output="$1.key: `openssl rsa -noout -modulus -in $1.key | openssl md5 | cut -d" " -f2`"
  key_size=`openssl rsa -noout -text -in $1.key | grep "Private-Key" | cut -d" " -f2 | cut -d"(" -f2`
  if [ $key_size -lt 4096 ]; then
    output="$output \e[39m(key size: \e[33m$key_size\e[39m bit)"
  else
    output="$output \e[39m(key size: \e[32m$key_size\e[39m bit)"
  fi
  echo -e $output
else
  echo "$1.key: file not found"
fi
 
if [ -e $1.csr ]; then
  echo -n "$1.csr: "
  openssl req -noout -modulus -in $1.csr | openssl md5 | cut -d" " -f2
else
  echo "$1.csr: file not found"
fi
 
if [ -e $1.crt ]; then
  echo -n "$1.crt: "
  openssl x509 -noout -modulus -in $1.crt | openssl md5 | cut -d" " -f2
else
  echo "$1.crt: file not found"
fi
 
if [ -e $1.intermediates ]; then
  echo -n "$1.intermediates: "
  subject=`openssl x509 -noout -subject_hash -in $1.intermediates`
  issuer=`openssl x509 -noout -issuer_hash -in $1.crt`
  if [ "$subject" != "" -o "$issuer" != "" ]; then
    if [ "$subject" == "$issuer" ]; then
      signature=`openssl x509 -noout -text -in $1.intermediates | grep "Signature Algorithm:" | cut -d" " -f7 | head -n1`
      echo -e "\e[32missuer matches subject \e[39m- signature hash: \e[32m$signature\e[39m"
    else
      echo -e "\e[31missuer doesn't match subject"
    fi
  fi
else
  echo "$1.intermediates: file not found"
fi

Zertifikate konvertieren

  • PEM nach DER
openssl x509 -outform der -in certificate.pem -out certificate.der
  • PEM nach P7B
openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer
  • PEM nach PKCS12 (P12)
openssl pkcs12 -export -out certificate.p12 -inkey userkey.pem -in usercert.pem 
  • PEM nach PFX
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
  • DER nach PEM
openssl x509 -inform der -in certificate.cer -out certificate.pem
  • P7B / PKCS7 nach PEM
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
  • P7B / PKCS7 nach PFX
openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer
  • PFX / PKCS12 nach PEM
# es wird nach dem Import-Passwort gefragt, wenn eines gesetzt wurde:
openssl pkcs12 -in certificate.pfx -out certificate.pem -nodes

# beim Fehler "Mac verify error: invalid password?" bitte mit der nächsten Methode probieren
  • PFX / PKCS12 nach PEM (wenn er das Passwort nicht frisst):
openssl pkcs12 -in certificate.pfx -out certificate.pem  -nodes -password pass:<PASSWORT>

PEM-Datei Reihenfolge

Seit Apache 2.4.8 ist SSLCertificateChainFile als deprecated markiert. Das heißt, dass nun Zertifikat und Zwischenzertifikat in einer gemeinsamen Datei gespeichert werden müssen und über die Direktive SSLCertificateFile geladen werden.

Dabei ist die Reihenfolge wichtig. Eine solche Datei wird folgendermaßen erstellt:

und Zwischenzertifikat
cat meine-domain.de.crt ssl-ca-intermediate.crt > meine-domain.de-bundle.crt

Ganz selten wird auch das Root der SSL-CA benötigt, das hängt dann einfach ganz am Ende dran:

Zwischenzertifikat und Root-Zertifikat
cat meine-domain.de.crt ssl-ca-intermediate.crt ssl-ca-root.crt > meine-domain.de-bundle.crt

Um solche Dateien einfach zu erkennen, füge ich ein -bundle in den Dateinamen ein.

PEM inklusive private Key

Es kann auch noch der SSL-Key eingefügt werden. Dieser kommt dann an erster oder letzter Stelle. Die Zertifikate übrigen in der üblichen Reihenfolge (Zertifikat, Intermediate und gegebenenfalls noch das Root-Zertifikat). Apache unterstützt das zwar, es wird allerdings aktuell nicht empfohlen.

Zertifikat, Zwischenzertifikat und Root-Zertifikat
cat meine-domain.de.key meine-domain.de.crt ssl-ca-intermediate.crt (ssl-ca-root.crt) > meine-domain.de-bundle.crt

Diskussion

Geben Sie Ihren Kommentar ein. Wiki-Syntax ist zugelassen:
V C V B P
 
linux/kryptographie/ssl/openssl-zertifikate.txt · Zuletzt geändert: 13.06.2018 12:54 von wiki@magenbrot.net