OpenVPN Zertifikate unter Linux erzeugen

In einem älteren Blogpost habe ich die Erzeugung von OpenVPN Zertifikaten unter Windows beschrieben. Klick. Heute geht es darum, die benötigte CA inkl. Zertifikate unter Linux zu erzeugen. Auch unter Linux gibt es dank Easy-RSA bereits vorgefertigte Skripte, die den Job sehr gut erledigen. Die Easy-RSA Skripte können auch auf Github eingesehen und bei Bedarf direkt von dort bezogen werden. https://github.com/OpenVPN/easy-rsa/


Wegen den Abhängigkeiten zu OpenVPN und openssl empfiehlt es sich, alles aus den offiziellen Paketquellen zu installieren. Unter Arch Linux werden OpenVPN und die Easy-RSA Skripte wie folgt installiert.

sudo pacman -S openvpn easy-rsa

Unter Debian basierten Distributionen wird es über folgenden Befehl installiert. Das Paket „Easy-RSA“ ist erst ab Debian 8 „Jessy“ als separate Installation erhältlich. Unter Debian 7 „Wheezy“ ist es noch im OpenVPN Paket enthalten.

sudo apt-get install openvpn easy-rsa

Das OpenVPN Paket wird für die Zertifikatserstellung benötigt, um einen statischen TLS-Auth Key zu erzeugen. Nur damit ist „Perfect Forward Secrecy“ möglich, das die Sicherheit von OpenVPN erhöht. Nach der Installation wird in eine Root Umgebung gewechselt, um ausreichend Rechte zu haben.

su

Die Zertifikate werden unterhalb von „/etc/openvpn“ erzeugt. Daher wird direkt in das Verzeichnis gewechselt.

cd /etc/openvpn

Die originalen Skripte werden nun in das Verzeichnis „./easy-rsa“ kopiert.

cp -R /usr/share/easy-rsa easy-rsa/

In das Verzeichnis „easy-rsa“ wechseln.

cd easy-rsa

In der Datei „vars“ sind alle relevanten Variablen für die Zertifikatserstellung hinterlegt. Damit die Zertifikate für die eigene Umgebung passen, müssen ein paar Werte angepasst werden.

nano vars

Wer seine Zertifikate für die nächsten Jahre bedenkenlos nutzen möchte, kann die Schlüsselgröße auf 4096Bit setzen. Dazu wird der Eintrag „export KEY_SIZE=2048“ in „export KEY_SIZE=4096“ geändert. Zusätzlich müssen noch die Zertifikatsinformationen angepasst werden.

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"
export KEY_OU="MyOrganizationalUnit"

Optional lässt sich noch der Hashwert der Zertifikate von SHA256 auf SHA512 ändern.

nano openssl-1.0.0.cnf

Hierzu muss die Zeile „default_md = sha256 # use public key default MD“ in „default_md = sha512 # use public key default MD“ geändert werden. Bevor die Zertifikate jetzt erstellt werden können, fehlen noch zwei vorbereitende Schritte.
Mit dem Befehl

source ./vars

werden die Umgebungsvariablen exportiert.

./clean-all

löscht alle bereits vorhandenen Zertifikate. Bei allen folgenden Aktionen gilt es zu beachten, dass bei den Abfragen für „challenge password“ und „optional company name“ kein Wert eingetragen wird. Die Abfragen werden einfach mit „Enter“ übersprungen. Als erstes wird eine „Certificate Authority“ (CA) erzeugt, womit alle weiteren Zertifikate signiert werden. Mit der CA ist es auch möglich bestehende Zertifikate zu revoken, sollten diese „verheizt“ sein.

./build-ca

Das Zertifikat für den OpenVPN Server wird als nächstes generiert. Hier werden wieder die Werte abgefragt, die zuvor in der Datei „vars“ hinterlegt wurden. Die Fragen, ob das Zertifikat signiert werden soll, werden mit „y“ bestätigt.

./build-key-server server

Nach dem Server Zertifikat, können die Zertifikate für die Clients erzeugt werden. Auch hier wieder den Anweisungen folgen.

./build-key clientname

Wer sein Client Zertifikat zusätzlich mit einer Passphrase schützen möchte, kann das Zertifikat mit dem „./build-key-pass“ Skript generieren. Dabei wird der private Schlüssel mit der eingegebenen Passphrase verschlüsselt. Ein entsprechend langer und sicherer Schlüssel (> 20 Zeichen) wird empfohlen. Bei jedem Verbindungsaufbau wird die Passphrase dann abgefragt.

./build-key-pass secret_clientname

Um den Schlüsselaustausch zwischen Client und OpenVPN Server abzusichern, wird ein „Diffie Hellmann Key“ benötigt. Da dieser auf 4096Bit groß sein wird, benötigt der Vorgang einige Zeit. Die Pause lässt sich wunderbar für eine Tasse Kaffee nutzen.

./build-dh

Als letztes wird noch der TLS-Auth Key erzeugt, weswegen auch das OpenVPN Paket installiert werden musste.

openvpn --genkey --secret ./keys/tlsauth.key

Die generierten Zertifikate sind jetzt alle einsatzbereit. Es wird dringend empfohlen, alle Schlüssel an einem sicheren verschlüsselten Ort aufzubewahren. Nachdem die Keys an einen sicheren Ort gebracht wurden, können die Zertifikate vom Client optional wieder gelöscht werden.

./clean-all

Weiterführende Links: