> ## Content Index
> Fetch the complete content index at: https://blog.bajonczak.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Eigenes SSL-Zertifikat für die Lokale Entwicklung
- URL: https://blog.bajonczak.com/ssl/
- Published: 2019-12-31T23:00:00.000Z
- Updated: 2022-10-24T11:04:51.000Z
- Author: Sascha Bajonczak
- Tags: Security, Web Development

Datensicherheit ist heute schon ein wichtiges Thema. Daher ist eine SSL-Verschlüsselung in einer Webanwendung nicht mehr wegzudenken. So ist es auch Sinnvoll die lokale Entwicklungsumgebung so einzurichten, das ausschließlich nur noch lokal gearbeitet wird.

## Vorbedingungen

Bevor wird nun mit der Umsetzung starten, ist es notwendig, dass wir noch [openssl (opens new window)](https://www.heise.de/download/product/win32-openssl-47316?ref=blog.bajonczak.com)installieren. Ich habe das Glück das es in der Git-Shell von [Git (opens new window)](https://git-scm.com/download/win?ref=blog.bajonczak.com)dabei ist.

## Root Zertifikat erstellen

Bevor wir eigene Zertifikate erstellen können, ist ein eigenes Root Zertifikat erstellen. Das root Zertifikat ist dazu da, um weitere Zertifikatstypen zu erstellen. Doch bevor wir ein Root-Zertifikat erstellen können, wird ein Schlüssel benötigt. Dazu reicht folgender Befehl

```bash
openssl genrsa -des3 -out rootCA.key 2048

```

Dieser Befehl sagt eigentlich aus das wir ein [RSA (opens new window)](https://de.wikipedia.org/wiki/RSA-Kryptosystem?ref=blog.bajonczak.com)Schlüssel erstellen der eine Stärke von 2048 Bit besitzt und diesen dann in die Datei **rootCA.key** exportiert.

> Achtung! Bei der Ausführung wird jetzt ein Passwort erfragt, dieses Passwort wird immer wieder bei einer Zertifikatsanforderung abgefragt. Daher sollte das Passwort gut gemerkt werden.

Jetzt da ein Schlüssel vorliegt, kann diese Schlüsseldatei verwendet werden, um ein Root-Zertifikat zu erstellen. Dazu reicht folgender Befehl aus:

```bash
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

```

Damit wird ein Request für ein **neues** Zertifikat des Typs [x.509 (opens new window)](https://de.wikipedia.org/wiki/X.509?ref=blog.bajonczak.com)gestellt. Das Zertifikat soll eine **sha256** Verschlüsslung aufweisen und nur **1024** Tage gültig sein. Das ganze soll mit dem Root-Key **rootCA.key** verschlüsselt werden. Das Ergebnis muss in die Datei **rootCA.pem** abgelegt werden.

Hier wird Bei der Ausführung das Passwort für den Root Key abgefragt, welches wir beim erstellen des Schlüssels angegeben haben.

![Passwort Abfrage](https://notes.bajonczak.com/assets/img/rootcert.9dc5ddf7.png)

Wenn das richtige Passwort eingegeben wurde, werden nun ein paar allgemeines Daten abgefragt, die dann im Zertifikat hinterlegt werden.

Da es sich hier um ein lokales Zertifikat für die Entwicklung handelt, können die Eingaben frei gewählt werden.

![Dateneingabe](https://notes.bajonczak.com/assets/img/rc_details.50deea33.png)

Nach Abschluss existieren nun zwei Dateien

- rootCA.key
- rootCA.pem

Die **.key** \-Datei beinhaltet unseren Schlüssel. Die **.pem**\-Datei beinhaltet unser Root Zertifikat.

## Root Zertifikat Vertrauenswürdig machen

Da wir nun unser Zertifikat habenbringt es dem System nichts, wenn es auf der Platte herumliegt. Das System muss wissen, das es vertrauenswürdig ist. Daher ist nun der Schritt das Zertifikat zu vertrauen.

Dazu startet man die Microsoft Management Konsole.

> Dazu drücken wir die Tastenkombination **windowstate+r** und geben mmc ein.

Anschlißend ist das Snap-in "Zertifikate" zu laden.

![Zertifikatsverwaltung](https://notes.bajonczak.com/assets/img/mmc.d1b22b82.png)

Wichtig ist das hier die option **Computerkonto** gewählt, und sich zum Lokalen Computer verbunden wird

Zum Import wird auf den Knoten **Vertrauenswürdige Stammzertifizierungsstellen** mit der rechten Maustaste Geklickt. Dann auf **Alle Aufgaben->Importieren**.

Nun ist es ein leichtes, das Root Zertifikat (**rootCA.pem**) zu importieren. Nach dem Import ist unser Zertifikat auch im Speicher vorhanden

War es das? Nein denn es wurde dem System nur mitgeteilt das es dem Root Zertifikat trauen soll. Jedoch weis der Browser nichts von seinem Glück. Denn es ist jetzt noch ein Domänen Zertifikat mit unserem Root Zertifikat zu erstellen.

## Zertifikatsschlüssel erstellen

Mit dem Root-Zertifikat ist man in der Lage ein Domänen SSL Zertifikat zu erstellen. Dieses Zertifikat wird dann bei den Browsern bekannt gemacht, indem es schlichtweg installiert wird.

Doch bevor ein SSL Zertifikat erstellt wird, bedarf es erst ein Schlüssel der für das Zertifikat zuständig ist. Dazu ist folgender Befehl auszuführen:

```bash
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key

```

Bei der Ausführung werde Informationen abgefragt, welche dann in das Zertifikat hineingelangen. Um diese manuellen Eingaben zu umgehen kann man eine Konfigurationsdastei erstellen. Diese Datei (*localhost.csr.cnf*) hat dann folgenden Inhalt:

```text

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=DE
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@example.com
CN = localhost

```

Dies gibt dann zwei neue Dateien aus

- server.key
- server.csr

Der Schlüssel ist in der Datei **server.key** hinterlegt.

## SSL-Zertifikat erstellen

Man sagt immer das eine Zertifikatsanfordeung stellen muss. Quasi fordert man ein SSL Zertifikat vom Root Zertifikat an. Dazu werden aber noch Angaben zur Verwendung des Zertifikats usw. benötigt. Diese Angaben liegen in einer **v3.ext** Datei vor.

Folgender Inhalt ist dort einzufügen

```text
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost

```

Nun können wir mit dem folgenden Befehl unser SSL Zertifikat erstellen

```bash
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile __v3.ext__

```

Bei der Ausführung wird noch mal ds Passwort für das Root Zertifikat abgefragt. Des Weiteren werden noch diie Informationen aus dem Zertifikatsschlüssel ausgegeben.

# SSL Zertifikat verwenden

Jetzt, da wir ein eigenes Zertifikat besitzen ist es nur noch logisch das wir dieses auch verwenden. Daher wird das Zertifikat eimal installiert. Dazu klicken wir doppelt auf das Zertifikat und wählen **Zertifikat installieren** aus.

![Zertifikat installieren](https://notes.bajonczak.com/assets/img/Install-zert.0d4eb23b.png)

Anschliessend muss das Hostsystem (Beispielsweise der NodeJs oder Reactanwendung) noch mitgeteilt werden, dass es ein eigenes SSL Zertifikat verwenden soll.

## Beispiel Anwendung bei React (webpack dev server)

Die Inhalte der beiden Dateien

- server.key
- server.crt

müssen in die Datei server.pem abgespeichert werden: Dabei reicht es aus, die Inhalte nacheinander hinein zu koppieren. Anschließend ist die Datei im relativen Verzeichnis *node\_modules/webpack-dev-server/ssl/server.pem* zu hinterlegen. Wenn bereits eine Datei existiert ist diese zu überschreiben.

Jetzt kann die Applikation gestartet werden. Ab diesen Zeitpunkt wird das SSL Zertifikat verwendet, welches selbst erstellt wurde und im Browser ist dies als vertrauenswürdig gekennzeichnet.

# Fazit

Ich weis, man kann einfach die bestehenden Zertifikate verwenden und diese im Zertifikaten Store hinterlegen. Das ist einfacher und hat weniger Arbeit. Doch ich habe mir gedacht, dass ich das ganze auch mal etwas verstehen will. Ich konnte dadurch viel lernen und habe nun auch ein eigenes Zertifikat, welches ich dann auch für eine Authentifizierung verwenden könnte. Denn durch das Root Zertifikat ist es mir erlaubt, weitere Zertifikate zu erstellen.

Was denkt ihr? Schreibt doch in die Kommentare, ich bin gespannt auf eure Meinung.