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.
- OpenSSL (Version 1.1.1 oder neuer)
- Java Keytool (Teil des JDK [openjdk 11])
Ordnerstruktur:
|- ca -> Ordner für das CA Zertifikat
|- keys -> Ordner für Zertifikate und den Keystore
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
Das erzeugte Zertifikat kann mit dem Keytool wie folgt angezeigt werden:
.. ca$ keytool -printcert -v -file caroot.cer
- Firefox (73)
- Einstellungen > Datenschutz & Sicherheit > Zertifikate > Zertifikate Anzeigen > Zertifizierungsstelle > importieren
- Chromium (80)
- Einstellungen > Erweitert > Datenschutz und Sicherheit > Zertifikate verwalten > Zertifizierungsstellen > importieren
- Android
- ...
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
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
Das Erzeugte Zertifikat in eine Zertifikat Datei exportieren.
.. keys$ keytool -export -alias smarthome-dev.home -file Deb.cer -keystore DebKeyStore.jks
Das Zertifikat kann über den Befehl mit dem Keytool angezeigt werden.
.. keys$ keytool -printcert -v -file Deb.cer
Zertifikatanfrage erzeugen.
.. keys$ keytool -certreq -alias smarthome-dev.home -keystore DebKeyStore.jks -file Deb.csr
Die Zertifikatanfrage anzeigen.
.. keys$ keytool -printcertreq -v -file Deb.csr
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
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
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
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
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
- https://www.baeldung.com/java-ssl-handshake-failures
- https://support.dnsimple.com/articles/what-is-common-name/
- https://knowledge.digicert.com/generalinformation/INFO1745.html
- https://sites.google.com/site/ddmwsst/create-your-own-certificate-and-ca
- https://security.stackexchange.com/questions/74345/provide-subjectaltname-to-openssl-directly-on-the-command-line
- https://stackoverflow.com/questions/8744607/how-to-add-subject-alernative-name-to-ssl-certs
- https://support.google.com/chrome/a/answer/7391219?hl=de