Skip to main content

OpenSSL Zertifikate

Bitte niemals die .key Dateien an andere Personen weitergeben oder im Netz speichern. Die .key Datei sollte sicher aufbewahrt sein. Wenn sie weg ist gibt es keine Chance das dazugehörige Zertifikat weiter zu verwenden. 

https://www.dfn-cert.de/informationen/themen/verschluesselung_und_pki/openssl-kurzreferenz.html

Keystore-Explorer

Keystore-Explorer um alle folgende Befehle mit einem Programm auszuführen

https://keystore-explorer.org/downloads.html

 Selbstsignierte Zertifikate verwenden

cp selbstsigniertes.crt /etc/ca-certificates
cp selbstsigniertes.crt /usr/local/share/ca-certificates

update-ca-certificates

bei Docker muss der Daemon und der Dienst neu gestartet werden

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 

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'

Gültigkeit eines HTTPS-Serverzertifikats anzeigen

echo QUIT | openssl s_client -connect www.magenbrot.net:443 2>/dev/null | sed -ne '/BEGIN CERT/,/END CERT/p' | openssl x509 -noout -text | grep -A2 Validity

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>

CSR erzeugen (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

4086 Bit RSA-Key erzeugen (2048 ist aktuell auch noch OK)

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 []:\\

bei Common Name kann neben der Domaine auch eine Wildcard-Domaine verwendet werden. Dazu muss ein Sternchen davor stehen z.B. "*.foo.com".

(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>

CSR per Sript (nicht getestet)
  #!/bin/bash
  for host in logtools.foo.de logtools-test.foo.de; do openssl req -utf8 -batch -nodes -sha256 -newkey rsa:2048 -keyout ${host}.key -out ${host}.csr -subj "/C=DE/ST=Sachsen/L=Dresden/O=Kundenberatung SE/OU=IT Infrastruktur/CN=$host"
done

In der for Schleife ist es nur notwendig die gewünschten Hosts einzutragen.

==== CSR anzeigen (Certificate Signing Request) ====

  openssl req -noout -text -in <request.csr>

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> 2048
  [...]
  openssl req -new -key <zertifikatsname.key> -out <zertifikatsname.csr> #(siehe oben)
  [...]
  openssl x509 -req -days 60 -in <zertifikatsname.csr> -signkey <zertifikatsname.key> -out <zertifikatsname.crt>
[...]

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.

  $ openssl x509 -noout -modulus -in server.crt | openssl md5
  $ openssl rsa -noout -modulus -in server.key | openssl md5

oder als einfach zu verwendendes Script:

  #!/bin/sh
   if [ "x$1" == "x" ]; then echo "Usage: $0 <filename without .key or .crt>"; exit 1; fi
  (openssl x509 -noout -modulus -in $1.crt | openssl md5 ; openssl rsa -noout -modulus -in $1.key | openssl md5) | uniq
 
  echo
  echo "if there's more than one hash output, your key does not match the certificate"

Das funktioniert z.B. auch, um festzustellen, welches CSR zu einem Key gehört:

  $ openssl req -noout -modulus -in server.csr | openssl md5

==== Zertifikatformate ====

cer oder crt ist egal

[[https://www.antary.de/2017/03/11/zertifikate-ein-ueberblick-der-verschiedenen-formate/|Überblick und Beschreibung der Formate]]

Digitale Zertifikate sind in der elektronischen Kommunikation weit verbreitet. Sie werden bei den TLS-Versionen (Transport Layer Security, Vorgängerbezeichnung SSL (Secure Sockets Layer)) diverser Übertragungsprotokolle verwendet und gewährleisten damit eine sichere Datenübertragung im Internet. Beispielsweise kommen X.509-Zertifikate zum Signieren und bzw. oder zum Verschlüsseln von Dokumenten sowie E-Mails zum Einsatz und werden auch beim Aufruf von Webseiten mit dem HTTPS-Protokoll verwendet.

X.509 ist ein Standard der ITU-T für eine Public-Key-Infrastruktur (PKI) zum Erstellen digitaler Zertifikate. X.509-Zertifikate werden umgangssprachlich häufig auch als SSL-Zertifikate bezeichnet. Nachfolgend ein kurzer Überblick über die vielen unterschiedlichen Datei- bzw. Container-Formate für X.509-Zertifikate.

=== PEM ===

Das PEM-Format ist sehr beliebt und wird auch häufig von Zertifizierungsstellen verwendet. Der Name PEM (Privacy Enhanced Mail) stammt von einer gescheiterten Methode für sichere E-Mails, welche in den RFCs 1421 bis 1424 definiert ist. Das Container-Format hat jedoch überlebt und wir immer noch gerne verwendet. Es ist Base64 kodiert und kann neben dem reinen Zertifikat auch Intermediate-Zertifikate, Root-CAs und private Schlüssel beinhalten. Apache-Server (/etc/ssl/certs) und Open-Source-Software setzen oft auf das PEM-Format.

Die Dateierweiterung .pem kommt meist zum Einsatz, wenn sowohl Zertifikate und der Privatschlüssel in einer Datei gespeichert werden. Darüber hinaus hat das PEM-Format auch noch folgende Dateiendungen: .cert, .cer, .crt oder .key.

=== CERT, CER oder CRT ===

.cert, .cer und .crt sind Dateien im PEM-Format (oder selten im DER-Format), welche lediglich eine andere Dateiendung besitzen. Diese Endungen kommen oft zum Einsatz, wenn zur Installation einzelne Dateien für jedes Zertifikat verlangt werden.

=== KEY ===

Die .key-Datei liegt ebenfalls im PEM-Format vor und beinhaltet nur den privaten Schlüssel eines Zertifikats. Sie kann von Hand aus einer .pem-Datei erzeugt werden. Dieses Dateiformat wird häufig in Verbindung mit Apache verwendet, wobei es meist unter “/etc/ssl/private” zu finden ist. Die richtigen Dateirechte spielen in diesen Fall eine wichtige Rolle, da die Datei ansonsten oft nicht richtig geladen werden kann.

=== DER ===

DER steht für Distinguished Encoding Rules. Bei einer .der-Datei handelt es sich um die binäre Form der Base64-kodierten .pem-Datei. Neben .der können entsprechende Zertifikate auch mit der Endung .cer existieren, vor allem unter Windows. Neben Windows kommen Zertifikate im DER-Format auch unter Java zum Einsatz. Dieses Format unterstützt die Speicherung eines einzelnen Zertifikats. Private Schlüssel oder der Zertifizierungspfad können mit diesem Format nicht gespeichert werden.

=== PFX oder P12 ===

Der PKCS#12-Standard ist in RFC 7292 beschrieben. Das binäre Format kann neben dem Zertifikat auch alle Zertifikate des Zertifizierungspfads und zudem den privaten Schlüssel enthalten. Alles in einer Datei. Darüber hinaus ist es möglich die  Datei passwortgeschützt zu speichern. Als Dateiendungen kommen .pfx oder .p12 zum Einsatz. Dieses Format wird oft zum Import und Export von Zertifikaten und privaten Schlüsseln unter Windows verwendet.

=== P7B oder P7C ===

Beide Dateiformate sind Bestandteil des PKCS#7-Standards, welcher seinerseits die Basis für S/MIME bildet und in RFC 5652 definiert ist. P7B und P7C werden in der Regel mit Base64 kodiert und können neben einem Zertifikat auch alle Zertifikate des Zertifizierungspfads enthalten. Im Gegensatz zu PEM existiert eine Definition, wie die Zertifikate des Zertifizierungspfads eingebunden werden müssen. Private Schlüssel sind nicht möglich. .p7b- und .p7c-Dateien sind unter Windows und in Apache Tomcat üblich.

=== CSR ===

Ein Certificate Signing Request (CSR, deutsch Zertifikatsignierungsanforderung) ist ein standardisiertes Format (PKCS#10, definiert in RFC 2986) zum Anfordern eines digitalen Zertifikats. Der CSR enthält den öffentlichen Schlüssel und weiteren Angaben über den Antragsteller des Zertifikats. Die Zertifizierungsanfrage kann anschließend von einer Zertifizierungsstelle (CA) signiert werden und man erhält ein digitales Zertifikat zurück.

=== CRL ===

Mit Hilfe einer Certificate Revocation List (deutsch Zertifikatsperrliste) können Zertifikate vor dem Ende des eigentlichen Ablaufdatums gesperrt werden. In der Regel ist dies der Fall, wenn der private Schlüssel nicht mehr sicher oder der Zertifikatsinhalt falsch ist.

==== Zertifikate konvertieren ====

PEM nach DER

  openssl x509 -outform der -in certificate.pem -out certificate.der

PEM nach P7B

  openssl crl2pkcs7 -nocrl -certfile certificate.crt -out certificate.p7b -certfile CACert.crt

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.crt -out certificate.pem

P7B nach PEM

  openssl pkcs7 -print_certs -in certificate.p7b -out certificate.crt

P7B nach PFX

  openssl pkcs7 -print_certs -in certificate.p7b -out certificate.crt
  openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer

PFX nach PEM

  openssl pkcs12 -in certificate.pfx -out certificate.crt -nodes


PFX nach KEY

  openssl pkcs12 -in certificate.pfx -nocerts -out certificate.key


==== CSR mit SAN ====

Um ein SSL-Server-Zertifikat auf einem Server unter mehreren Host-Namen einsetzen zu können, muss das Zertifikat alle diese Host-Namen als sogenannte alternative Namen (SubjectAlternativeName, SAN) enthalten.

Links:

https://www.thomas-krenn.com/de/wiki/Openssl_Multi-Domain_CSR_erstellen\\
https://blog.pki.dfn.de/tag/subjectalternativename/

  vim /etc/ssl/req.conf

  [req]
  distinguished_name = req_distinguished_name
  req_extensions = v3_req
  prompt = no
  [req_distinguished_name]
  C = DE
  ST = Bundesland
  L = Stadt
  O = Firma
  OU = Abteilung
  CN = zertfikat (foo.com)
  emailAddress = domain-c@foo.com
  [v3_req]
  keyUsage = keyEncipherment, dataEncipherment
  extendedKeyUsage = serverAuth
  subjectAltName = @alt_names
  [alt_names]
  DNS.1 = api.foo.de
  DNS.2 = *.api.foo.de
  DNS.3 = *.bums.api.foo.de

  openssl req -new -out foo.com_csr -key foo.com.key -config req.conf