Sitemap | Nicht eingeloggt

Layout: V2_DayTime
V2_DayTime
| V2
V2
| V2 Dark
V2 Dark
| Alle

DE

Tux

Nachteil bei dieser Lösung ist dass immer eine Zertifikatsfehlermeldung erscheint auf der Homepage, wenn man das Zertifikat mit Diensten verwendet, falls das Root Zertifikat nicht installiert wird im Browser, Progamm und/oder Betriebssystem.
Hier kannst Du mein Root-Zertifikat herunterladen (Rechtsklick -> Speichern unter)
Wenn das Root-Zertifikat wie im Artikel beschrieben installiert wird werden alle meine angebotenen Dienste mit Zertifikaten als vertrauenswürdig eingestuft.

SSL Zertifikats Authorität erstellen und nutzen

OpenSSL installieren

sudo apt-get install openssl

Root CA erstellen

Ich habe einen Ordner ssl für die Zertifikate und privaten Schlüssel unter /home/USER erstellt. Darin ist dann der CA-Ordner my_ca mit dem Zertifikat und privaten Schlüssel der CA.

Der private Schllüssel (root-ca-key.pem) sollte nach dem Erstellen ausgelagert werden!
Modern ist es, für diese Zertifikatsstelle einen eigenen Rechner zu verwenden der keinerlei Netzwerkzugriff hat. So muss man die von dieser CA generierten privaten Keys und dazugehörigen Zertifikate mit einem externen Speicher von dieser Maschine wegkopieren.
Der Vorteil ist, dass der root-ca-key.pem nicht von einem Hacker missbraucht werden kann, ausser der Hacker/Dieb hat physikalischen Zugriff zu diesem Rechner.

Der Einfachheit halber wechseln wir jetzt in den my_ca Ordner:

cd /home/USER/ssl/my_ca

Schritt 1: Root CA private Key erstellen:

openssl genrsa -aes256 -out root-ca-key.pem 4096

Hier ist vor allem das Passwort das man hinterlegt wichtig und sollte gut gewählt sein. Das Kennwort wird verwendet um neue Zertifikate zu erstellen!

Schritt 2: Root CA Zertifikat erstellen:

openssl req -x509 -new -nodes -extensions v3_ca -key root-ca-key.pem -days 3652 -out root-ca-pub.pem -sha512

Jetzt müssen die Angaben mit den richtigen Daten ausgefüllt werden. Damit eine Zertifizierung möglichst gut funktioniert, muss man dabei "echte" Daten eintragen.
Wichtig sind vor allem Anderen:
Der "Common Name" ist der im Browser oder Programm/Dienst angezeigte Name.
Die "Organisation" wird z.B. von Firefox auch als Quickinfo angezeigt.

Achtung: Diese Angaben können nachher nicht einfach geändert werden, sondern man muss eine neue Root-CA erstellen, wenn man einen Tippfehler oder falsche Angabe gemacht hat!

Zertifikat mit der erstellten CA erzeugen

In den ssl Ordner wechseln:

cd /home/USER/ssl

Schritt 1: Private Key erstellen

openssl genrsa -out webseitenname-key.pem 4096

Der private Schlüssel sollte, wenn nachher damit ein öffentliches Zertifikat erstellt wird, dass jeder benutzen können sollte (Webserver z.B.) OHNE Kennwort erstellt werden, damit der Endbenutzer nicht jedesmal den (vielleicht nicht bekannten) Key eingeben muss!

Schritt 2: Zertifikatsanfrage für CA erstellen

openssl req -new -key webseitenname-key.pem -out webseitenname.csr -sha512

Sobald die Zertifikatsanfrage "webseitenname.csr" fertiggestellt ist, kann sie von der CA verarbeitet werden.

Schritt 3: CA geprüftes Zertifikat erstellen

openssl x509 -req -in webseitenname.csr -CA my_ca/root-ca-pub.pem -CAkey my_ca/root-ca-key.pem -CAcreateserial -out webseitenname-pub.pem -days 1096 -sha512

Dabei entsteht das öffentliche Zertifikat (Public Key/Certificate) für den Dienst.
Dieses wird zusammen mit dem Private Key des Dienstes für die Verschlüsselung benötigt.

Die CSR Datei kann jetzt gelöscht werden, da sie nicht mehr verwendet wird.

Root CA im Browser oder Betriebssystem hinterlegen

Die Datei root-ca-pub.pem muss auf den Clients als CA Zertifikat installiert/hinterlegt werden. Das geht so:

Firefox/Chrome:

  • Bearbeiten
  • Einstellungen
  • Erweitert
  • Zertifikate anzeigen/Zertifikate verwalten
  • Zertifizierungsstellen
  • Importieren

IE:

  • Internetoptionen öffnen
  • Inhalte
  • Zertifikate
  • Importieren
  • Zertifikat wählen ("Alle anzeigen" auswählen, damit das root-ca-pub.pem gefunden wird)
  • Bis "Fertigstellen" durchklicken.

Windows:

  • certmgr.msc mit Adminrechten starten.
  • Hier "Vertrauenswürdige Stammzertifikate" aufklappen
  • Dann ein Zertifikate markieren -> Rechtsklick -> Alle Aufgaben -> Importieren
  • Hier das root-ca-pub.pem wählen (nach "Alle Dateien" suchen, damit .pem gefunden wird) -> Ok.

Ubuntu:

RootZertifikat root-ca-pub.pem umbenennen in .crt und mit Rootrechten nach "/usr/share/ca-certificates/" kopieren:

sudo cp root-ca-pub.pem /usr/share/ca-certificates/root-ca-pub.crt

Danach

sudo dpkg-reconfigure ca-certificates

...ausführen, eigenes Zertifikat mit Space markieren und mit Enter bestätigen.

Android:

Um ein Root-CA-Certificate in Android verwenden zu können, gibt es zwei Möglichkeiten:

Man kann einerseits die Datei den User-Zertifikaten hinzufügen, mit dem erheblichen Nachteil dass von da an immer eine "Ihr handy wird möglicherweise abgehört" Meldung erscheint.

Oder man importiert das Root-Zertifikat als Systemzertifikat, was ich bevorzuge (keine "komische" Meldungen), aber ein bisschen komplizierter einzurichten ist. Dafür muss das Zertifikat in einen Hashwert umgeschrieben werden und kann dann mit temporären Rootrechten in den Systemspeicher geschrieben werden.
Diese Variante beschreibe ich hier.

Hashwert-Zertifikat aus Root-CA Zertifikat erstellen

Der Name des neuen Zertifikats wird als Hashwert generiert. Diesen speichern wir zunächst in eine Variable ab. .0 ist dabei die Dateiendung:

CERTNAME=`openssl x509 -inform PEM -subject_hash_old -in root-ca-pub.pem | head -1`.0

Nun fügen wir unser vorhandenes Zertifikat an den Inhalt der vorher erstellten Variableb mit dem eben generierten Namen an:

cat root-ca-pub.pem > $CERTNAME

Als letztes werden von Android zusätzliche Daten erwartet, die wir von OpenSSL in das neue Zertifikat einfügen lassen:

openssl x509 -inform PEM -text -in root-ca-pub.pem -out /dev/null >> $CERTNAME

Alles was bleibt ist die Datei auf unser Handy zu kopieren. Das kann man machen wie man möchte.

Zertifikat auf Handy installieren

Zuerst öffnen wir auf dem Handy die Kommandozeile mit Rootrechten. Hier beschrieben: Link (Bis zum Punkt mount -o remount,rw /system)

...Und kopieren die Datei an den richtigen Ort:

cp /pfad/aufdemTelefon/zum/zertifikat.0 /system/etc/security/cacerts/

chmod 644 /system/etc/security/cacerts/zertifikat.0

reboot

Android hat jetzt das Root-CA-Zertifikat unter den Systemzertifikaten gespeichert und behandelt alle von dieser Root CA ausgestellten Zertifikate als vertrauenswürdig. Nachdem das Telefon neu gestartet wurde, hast Du jedoch (gewollt!) keine Rootrechte mehr!

Zertifikate für Dienste hinterlegen

Webserver (Apache):

Datei 000-default_SSL.conf öffnen:

sudo nano /etc/apache2/sites-available/000-default_SSL.conf


So sieht der Standard-SSL-Virtualhost bei mir aus:

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    # SSL aktivieren
        SSLEngine On
    # Eigenes Zertifikat
        SSLCertificateFile /home/USER/ssl/default-pub.pem
        SSLCertificateKeyFile /home/USER/ssl/default-key.pem
    # Root Ca Zertifikat
        SSLCACertificateFile /home/USER/ssl/my_ca/root-ca-pub.pem
        DocumentRoot /var/www/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    
    #Eigene Directory-Rules
    <Directory /var/www/seiten>
        Order Deny,Allow
        Deny from all
        Allow from none
    </Directory>
    <Directory /var/www/shared_root>
        Order Deny,Allow
        Deny from all
        Allow from none
    </Directory>
    <Directory /var/www/mysqldumps>
        Order Deny,Allow
        Deny from all
        Allow from none
    </Directory>
    
    #Standardeintraege
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>

SNI, das heisst mehrere SSL/HTTPS Seiten auf einer IP mit Apache werden nur unterstützt, wenn SNI aktiviert ist.
Ansonsten kann ein Webserver nur eine Seite pro IP per SSL/HTTPS liefern, da normalerweise der Handshake noch bevor der Header übermittelt wird stattfindet.

Port 443 überprüfen und SNI aktivieren:

sudo nano /etc/apache2/ports.conf

Bei mir sieht der SSL Teil der Datei dann so aus:

<IfModule mod_ssl.c>
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to <VirtualHost *:443>
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.

# Hiermit aktiviere ich das oben beschriebene :-)
NameVirtualHost *:443

Listen 443
</IfModule>

SSL und Headers Module starten

sudo a2enmod ssl && sudo a2enmod headers

Seite aktivieren:

sudo a2ensite SSLWebseite

Neustart

sudo service apache2 restart

Port Forwarding

Damit der Web-Server aus dem Internet erreichbar ist muss noch eine Routerregel eingerichtet werden für Port 443 (Standard SSL Web-Port).
Da das je nach Router anders gemacht wird, bitte eine Anleitung googlen.
Trotzdem hier ein Bild wie die Regel auf meinem Router (D-Link Dir-645; Advanced -> Virtual Server) aussieht:

port_21_ftp

Zusatzinfos

Das Zertifikat der CA kann auch an das Webseiten-Zertifikat angehängt werden. Das ist nötig, wenn ein Dienst (z.B. Prosody-Server oder NGINX-Server) nur Public und Private Key Zertifikate akzeptiert, nicht aber ein Root-CA Zertifikat.

Machen kann man das so:

cat root-ca-pub.pem >> webseitenname-pub.pem

Infos zum Dokument
Author: Christoph Iseli / Carlo Kirchmeier
Datum: 16.07.2014
Letzte Änderung: 09.03.2016

4 Kommentare

#1 Von Easelee in Internet am 07.3.2016 um 08:45 Uhr

ProxyPass / ProxyReversePass funktioniert im LAN ohne SSL (intern sind es dann http requests; Wird vom Server dann verschlüsselt übers Internet weitergegeben)

Edited: am 10.3.2016 um 14:56 Uhr

#2 Von Gast in N/A am 11.7.2019 um 12:43 Uhr

openssl req -new -sha256 -key easeleesynology.ddns.net-key.pem -subj "/C=CH/ST=SG/O=Privat/CN=easeleesynology.ddns.net" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:easeleesynology.ddns.net")) -out easelee.ddns.net.csr

#3 Von Gast in N/A am 11.7.2019 um 12:46 Uhr

openssl req -new -sha256 -key easeleesynology.ddns.net-key.pem -subj "/C=CH/ST=SG/O=Privat/CN=easeleesynology.ddns.net" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:easeleesynology.ddns.net")) -out easeleesynology.ddns.net.csr

#4 Von Gast in N/A am 11.7.2019 um 12:46 Uhr

openssl x509 -req -in easeleesynology.ddns.net.csr -CA my_ca/root-ca-pub.pem -CAkey my_ca/root-ca-key.pem -CAcreateserial -out easeleesynology.ddns.net.pem -days 1096 -sha512

Einen neuen Kommentar hinzufügen

Info: Wenn Du eingeloggt bist, musst Du keine Userdaten mehr eingeben.

Ort:
(Optional)

Kommentar:

Impressum
Programmierung: Christoph Iseli | Design: Christoph Iseli
Webseitencode: Darf frei kopiert / verwendet werden (Downloads) | Inhalt: Darf frei verwendet werden, solange ein Link auf diese Seite mitgegeben wird.