Erstellung einer eigenen hierachischen CA

Aus ConfigWiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Vorüberlegung

Mit hierachischen CA's kann man Berechtigungsstufen verwalten, ohne für jede Stufe ein extra Root-CA erzeugen zu müssen.
Im Grunde geht es darum die Struktur von Benutzerrechten und und abzusichernden Diensten abstrakt nachzubilden.


Fehler beim Erstellen des Vorschaubildes: Die Miniaturansicht konnte nicht am vorgesehenen Ort gespeichert werden




In Unserem Fall sollen

  • ein Root-CA
  • eine von der Root-CA signirte OpenVPN-CA
  • ein von der OpenVPN-CA signiertes Server_A-CERT
  • eine Kunde_1 Anfrage mit Key
  • eine Kunde_1-OpenVPN-CA
  • ein Kunde_1-OpenVPN-User_1-CERT

erstellt werden.


Fehler beim Erstellen des Vorschaubildes: Die Miniaturansicht konnte nicht am vorgesehenen Ort gespeichert werden

System

  • debian || ubuntu z.B. (Debian 2.6.26-26lenny1)
  • openssl ist installiert

angegebene System-Pfade beziehen sich auf Debian / Debian-Derivate

Los gehts

Ordnerstruktur anlegen

cd /etc/ssl
mkdir my_ca
cd my_ca
mkdir -p services/openvpn/openvpnserver_1
mkdir -p customers/custom_1/user_1

OpenSSL Konfiguration anpassen

Das anpassen der "openssl.cnf" spart später viel Schreibarbeit.

  • in Section "CA_default" den Pfad "dir" anpassen
  • Standardwerte für "match" Einträge anpassen

/usr/lib/ssl/openssl.cnf (bzw. /etc/ssl/openssl.cnf):

[ CA_default ]
dir		= /etc/ssl/my_ca
...

policy		= policy_match

[ policy_match ]
countryName		= match
stateOrProvinceName	= match
organizationName	= match
...

[ req_distinguished_name ]
countryName_default		= DE
...
stateOrProvinceName_default	= Sachsen
...
0.organizationName_default	= OSSI - Otto's Super Service International

Ergänzungen in openssl.conf:

[ server ]

#  Make a cert with nsCertType set to "server"
basicConstraints=CA:FALSE
nsCertType			= server
nsComment			= "Server Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer:always
extendedKeyUsage=serverAuth
keyUsage = digitalSignature, keyEncipherment

Damit kann ein Zertifikat erzeugt werden, welches vom OpenVPN-Client mit der Option ns-cert-type server validiert werden kann.

notwendige Ergänzungen in der Ordnerstruktur

  • falls wir nicht schon dort sind:
cd /etc/ssl/my_ca
  • Sammelordner für die Zertifikate (.pem files)
mkdir newcerts
  • Index vorhandener Zertifikate
touch index.txt
  • Zähler für den nächsten Zertifikatsnamen
echo 01 > serial

Root-CA erstellen

  • (nur zur Sicherheit)
cd /etc/ssl/my_ca
  • diese CA gilt 10 Jahre
openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout myroot.key -out myroot.crt -days 3650
  • Diffie-Hellmann Parameter erzeugen
openssl dhparam -out dh1024.pem 1024

CA für OpenVPN Dienst erstellen

  • (nur zur Sicherheit)
cd /etc/ssl/my_ca
  • die Extension v3_ca bewirkt, das erstellen einer "unter-CA"
openssl req -new -newkey rsa:1024 -keyout services/openvpn/openvpn.key -out services/openvpn/openvpn.csr
openssl ca -cert myroot.crt  -keyfile myroot.key -in services/openvpn/openvpn.csr -out services/openvpn/openvpn.crt -extensions v3_ca
  • ein komplettes Zertifikat (Suchtiefe) für den Dienst erstellen
cat myroot.crt services/openvpn/openvpn.crt > services/openvpn/openvpn_complete.crt
  • ein Test ... sollte in etwa "openvpn_complete.crt: OK" ergeben. Testen ist wichtig !
openssl verify -CAfile myroot.crt services/openvpn/openvpn_complete.crt

Zertifikat für OpenVPN Server erstellen

  • falls wir nicht schon dort sind:
cd /etc/ssl/my_ca
  • Key und Zertifikatsanfrage:
openssl req -new -newkey rsa:1024 -keyout services/openvpn/openvpnserver_1/openvpnserver_1_openvpn.key -out services/openvpn/openvpnserver_1/openvpnserver_1_openvpn.csr
  • als Server-Zertifikat unterschreiben mit Zertifikat und Key von der OpenVPN-CA, (nicht RootCA):
openssl ca -cert services/openvpn/openvpn.crt  -keyfile services/openvpn/openvpn.key -in services/openvpn/openvpnserver_1/openvpnserver_1_openvpn.csr -out services/openvpn/openvpnserver_1/openvpnserver_1_openvpn.crt -extensions server
  • und wieder testen:
openssl verify -CAfile .services/openvpn/openvpn_complete.crt services/openvpn/openvpnserver_1/openvpnserver_1_openvpn.crt
  • Falls der Server kein passwortgeschütztes Zertifikat unterstützt, kann man dieses beim Erzeugen des Keys (Schritt 1 in diesem Abschnitt) mit der Option -nodes unterdrücken oder nachträglich entfernen:
openssl rsa -in services/openvpn/openvpnserver_1/openvpnserver_1_openvpn.key -out services/openvpn/openvpnserver_1/openvpnserver_1_openvpn-without-passphrase.key

CA für ersten Kunden erstellen

openssl req -new -newkey rsa:1024 -keyout customers/custom_1/custom_1.key -out customers/custom_1/custom_1.csr
openssl ca -cert services/openvpn/openvpn.crt  -keyfile services/openvpn/openvpn.key -in customers/custom_1/custom_1.csr -out customers/custom_1/custom_1_openvpn.crt -extensions v3_ca
  • Test ...
openssl verify -CAfile services/openvpn/openvpn_complete.crt customers/custom_1/custom_1_openvpn.crt
  • Vereinigte CA für Kunden erstellen (Suchtiefe)
cat myroot.crt services/openvpn/openvpn.crt customers/custom_1/custom_1_openvpn.crt > customers/custom_1/custom_1_openvpn_complete.crt

Zertifikat für den ersten User des Kunden "custom_1" erstellen

  • (nur zur Sicherheit)
cd /etc/ssl/my_ca
openssl req -new -newkey rsa:1024 -keyout cutomers/custom_1/user_1/user_1.key -out customers/custom_1/user_1/user_1.csr
openssl ca -cert customers/custom_1/custom_1_openvpn.crt -keyfile customers/custom_1/custom_1.key -in customers/custom_1/user_1/user_1.csr -out customers/custom_1/user_1/user_1.crt
  • Test ...
openssl verify -CAfile customers/custom_1/custom_1_openvpn.crt customers/custom_1/user_1/user.crt

Hinweise

Vereinigte Zertifikate (Suchtiefe)

Damit Dienste (Programme) die entsprechenden Zertifikate prüfen können, müssen sie in der Lage sein den Pfad (Baum) der Signierung nach oben zu folgen.
Diesem Zweck dienen die vereinigten Zertifikate.
Bei der Verwendung von OpenVPN würden die Zertifikate wie folgt verwendet:

  • server.conf
...
ca /etc/ssl/my_ca/services/openvpn/openvpn_complete.crt
cert /etc/ssl/my_ca/services/openvpn/openvpnserver_1/openvpnserver_1_openvpn.crt
key /etc/ssl/my_ca/services/openvpn/openvpnserver_1/openvpnserver_1_openvpn.key
dh /etc/ssl/my_ca/dh1024.pem
...
  • client.conf
...
ca /PATH/custom_1_openvpn_copmplete.crt
cert /PATH/user_1.crt
key /PATH/user_1.key
...

-nodes Schlüssel ohne Kennwort

Zuweilen kann es nötig sein (wenn gleich aus Sicherheitsgründen davon abzuraten ist), passwortlose Schlüssel zu erstellen. Die Flag -nodes hilft.

-nodes
if this option is specified then if a private key is created it will not be encrypted.

Verwendung:

openssl req -new -newkey rsa:1024 -nodes -keyout customers/custom_1/user_1/user_1.key -out customers/custom_1/user_1/user_1.csr
Meine Werkzeuge