Skip to content

Instantly share code, notes, and snippets.

@agent4788
Created February 29, 2020 08:11
Show Gist options
  • Save agent4788/fcbdbfc0237003313e58975d58f7f2d3 to your computer and use it in GitHub Desktop.
Save agent4788/fcbdbfc0237003313e58975d58f7f2d3 to your computer and use it in GitHub Desktop.

SSL Zertifikat mit eigenem CA erstellen (Java Keystore)

Eine Anleitung zum erstellen eines Keystore mit einem signierten Zertifikat einer eigenen Certificate Authority (CA). Der erstellte Keystore kann in Java zur SSL Verschlüsselung genutzt werden (zum Beispiel für einen Webserver).

Ist das CA Zertifikat einmal in allen Browsern/Geräten registriert, können beliebig viele Zertifikate damit signiert werden. Sofern alle Randbedingungen erfüllt sind, werden diese Zertifikate von den Browsern und Geräten als Gültig anerkannt.

Vorraussetzungen

  • OpenSSL (Version 1.1.1 oder neuer)
  • Java Keytool (Teil des JDK [openjdk 11])

Vorbereitung

Ordnerstruktur:

|- ca -> Ordner für das CA Zertifikat
|- keys -> Ordner für Zertifikate und den Keystore

Certificate Authority

CA Zertifikat erzeugen

Zuerst muss das CA Zertifikat mittels OpenSSL erzeugt werden.

.. ca$ set RANDFILE=rand
.. ca$ openssl req -new -keyout cakey.pem -out careq.pem [-config config.cfg]
.. ca$ openssl x509 -signkey cakey.pem -req -days 3650 -in careq.pem -out caroot.cer -extensions v3_ca

CA Zertifikat anzeigen

Das erzeugte Zertifikat kann mit dem Keytool wie folgt angezeigt werden:

.. ca$ keytool -printcert -v -file caroot.cer

CA im Browser Registrieren

  • Firefox (73)
    • Einstellungen > Datenschutz & Sicherheit > Zertifikate > Zertifikate Anzeigen > Zertifizierungsstelle > importieren
  • Chromium (80)
    • Einstellungen > Erweitert > Datenschutz und Sicherheit > Zertifikate verwalten > Zertifizierungsstellen > importieren
  • Android
    • ...

Zertifikat erzeugen

Keystore und Schlüsselpaar erzeugen

Mit dem Keytool wird ein Schlüsselpaar innerhalb eines Java Keystore erstellt. Der Alias sollte dem Domain Namen entsprechen. Die Abrfage "Wie lautet ihr Vor- und Nachname?" entspricht dem Common Name (CN) und sollte ebenfalls der Domain entsprechen. Die Restlichen Felder sind eher Informativ und haben für den weiteren Verlauf keine große Bedeutung.

.. keys$ keytool -genkey -alias smarthome-dev.home -keystore DebKeyStore.jks -keyalg RSA -sigalg SHA1withRSA

Schlüssel des Keystore ausgeben

Mit dem Befehl können alle Schlüssel des Keystore Angezeigt werden. Hier sollte jetzt das neu erzeugte Schlüsselpaar erscheinen.

.. keys$ keytool -list -v -keystore DebKeyStore.jks

Zertifikat exportieren

Das Erzeugte Zertifikat in eine Zertifikat Datei exportieren.

.. keys$ keytool -export -alias smarthome-dev.home -file Deb.cer -keystore DebKeyStore.jks

Zertifikat anzeigen

Das Zertifikat kann über den Befehl mit dem Keytool angezeigt werden.

.. keys$ keytool -printcert -v -file Deb.cer

Zertifikat Request erzeugen

Zertifikatanfrage erzeugen.

.. keys$ keytool -certreq -alias smarthome-dev.home -keystore DebKeyStore.jks -file Deb.csr

Zertifikat Request anzeigen

Die Zertifikatanfrage anzeigen.

.. keys$ keytool -printcertreq -v -file Deb.csr

Zertifikat autorisieren

Das Zertifikat mittels des CA Zertifikates signieren. Google Chrome fordert zusätzlich einen EIntrag der Domain unter subjectAlternativeName. Um diesen zu setzen, muss eine Konfigurationsdatei erzeugt werden. Hier ssl.conf genannt.

Die ssl.conf benötigt folgenden Inhalt:

[req]
distinguished_name = req_distinguished_name
req_extensions     = v3_req
x509_extensions    = v3_req

[req_distinguished_name]
commonName       = smarthome-dev.home
emailAddress     = info@smarthome-dev.home
organizationName = SmartHome
localityName     = Muelsen
countryName      = Sachsen

[v3_req]
# The extentions to add to a self-signed cert
#subjectKeyIdentifier = hash
#basicConstraints     = critical,CA:false
subjectAltName       = DNS:smarthome-dev.home,IP:192.168.0.0
#keyUsage             = critical,digitalSignature,keyEncipherment

Im Eintrag subjectAltName können dann eine oder mehrere Domain Namen und/oder IP Adressen aufgeführt werden.

Zusätzlich wird noch eine Seriennummer für das Zertifikat benötigt. Diese wird in der Datei serial.txt als Text hinterlegt, hier 1234.

.. keys$ openssl x509 -extfile ssl.conf -extensions v3_req -CA ../ca/caroot.cer -CAkey ../ca/cakey.pem -CAserial ../ca/serial.txt -req -in Deb.csr -out DebTestCA.cer -days 365

Signiertes Zertifikat anzeigen

Mit dem Keytool kann das Zertifikat angezeigt werden. Hier sollten unter "SubjectAlternativeName" jetzt auch alle IP Adressen und Domains zu finden sein.

.. keys$ keytool -printcert -v -file DebTestCA.cer 

CA in Keystore importieren

Nun muss der öffentliche Schlüssel des CA Zertifikates in den Keystore importiert werden.

.. keys$ keytool -import -alias TestCA -file ../ca/caroot.cer -keystore DebKeyStore.jks

Signiertes Zertifikat importieren

Darauf folgend wird noch das ssignierte Zertifikat unter dem Alias des Domein Names in den Keystore importiert.

.. keys$ keytool -import -alias smarthome-dev.home -file DebTestCA.cer -keystore DebKeyStore.jks

Schlüssel des Keystore anzeigen

Zum Schluss kann man alle Schlüssel des Keystore noch einmal ausgeben lassen. Hier sollten jetzt der öffentliche Schlüssel des CA und der Schlüssel des signierten Zertifikates (inkl. SubjectAlternativeName) zu finden sein.

.. keys$ keytool -list -v -keystore DebKeyStore.jks

Quellen

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment