Für den Betrieb dieses Dienst wird eine Zertifizierungsstelle (\textit{Certificate Authority}, kurz CA) benötigt, die für Benutzer und den Serverbetreiber SSL-Zertifikate ausstellen kann.
Diese CA wird auf einer virtuellen Maschine installiert, welche vom IT-Team den Hostnamen \texttt{vpnca.inform.hs-hannover.de} zugeteilt bekommen hat, und nur im Netz der Abteilung Informatik erreichbar ist.
In diesem Dokument wird die Einrichtung und der Betrieb der CA beschrieben.
Weiterhin sind Anleitungen für Benutzer und Serveradministratoren des VPN-Dienstes enthalten, in denen die Beantragung von Client- und Server-Zertifikaten bei der CA beschrieben wird.
Die in diesem Dokument beschriebene Konfiguration der CA wurde im Rahmen der Masterarbeit konzipiert.
Entscheidungen, die zu der hier beschriebenen Konfiguration geführt haben können in der Masterarbeit nachvollzogen werden.
Die Kapitel in diesem Dokument sind je nach Zielgruppe unterschiedlich interessant. In der folgenden Liste werden sie zur Vereinfachung der Navigation aufgelistet.
EasyRSA ist eine Sammlung von Skripten, die unter Verwendung von OpenSSL den Funktionsumfang einer Zertifizierungsstelle bieten.
Durch die Kapselung von OpenSSL-Befehlen und die Verwendung einer übersichtlichen Konfigurationsdatei ermöglicht EasyRSA das komfortable und sichere Verwalten einer CA.
Im oben erwähnten Repository sind unterhalb von \texttt{./release-keys/README.md}\footnote{\url{https://github.com/OpenVPN/easy-rsa/tree/v3.0.5/release-keys}} passende GPG-Schlüssel aufgeführt.
Zum Zeitpunkt der Erstellung dieses Dokuments (17.09.2018) ist Version 3.0.5 aktuell - alle in diesem Dokument aufgeführten Befehle beziehen sich auf diese Version.
Ausgestellte Zertifikate sind für fünf Jahre gültig\footnote{Dieser Standardwert wird für Zertifikate für Mitarbeiter und Server angewandt. Für Studenten ist eine maximale Laufzeit von 730 Tage (zwei Jahren) festgelegt.}.
\textbf{Hinweis 1}: Besteht der begründete Wunsch, den privaten Schlüssel der CA \textbf{nicht} mit einem Passwort zu schützen, so kann das Argument \texttt{nopass} an den Befehl \texttt{build-ca} angehängt werden.
Ein Passwortschutz wird ausdrücklich empfohlen sofern keine sonstigen Maßnahmen zum Schutz des privaten Schlüssels der CA vor unbefugtem Zugriff getroffen werden!
Damit Benutzer korrekte Zertifikatsanträge erzeugen können, muss ihnen die Datei \texttt{vars} zur Verfügung gestellt werden.
Um Kompatibilitätsprobleme durch die Verwendung von verschiedenen EasyRSA-Versionen auszuschließen, wird empfohlen für Benutzer ein passendes Paket zusammenzustellen.
Als Basis wird jeweils das \texttt{*.zip}-Release der aktuellen Version von EasyRSA empfohlen, da dieses für Windows-Benutzer notwendige Abhängigkeiten wie \texttt{awk} und \texttt{sed} bereits enthält.
Zunächst wird das aktuelle \texttt{*.zip}-Release von EasyRSA beschafft und authentisiert.
Um öffentliche Dateien wie das Wurzelzertifikat, die CRL und das konfigurierte Easy\-RSA-Paket den VPN-Benutzern zugänglich zu machen, wird ein Webserver auf der CA-Maschine installiert.
Zuerst wird die Webserversoftware über den Debian-Paketmanager installiert und die standardmäßig aktiven \texttt{VirtualHost}-Konfigurationen deaktiviert.
Im nächsten Schritt wird ein öffentliches, nur lesbares Verzeichnis erzeugt, welches später alle öffentlich verfügbaren Daten der CA enthalten soll und vom Webserver ausgeliefert wird.
Nun wird eine neue Konfigurationsdatei mit dem folgenden Inhalt in die neue Datei \texttt{/etc/apache2/sites-available/vpnca.inform.hs-hannover.de.conf} abgelegt.
Es wird davon ausgegangen, dass das Wurzelzertifikat als \texttt{ca.crt}, die CRL als \texttt{crl.pem} und die konfigurierten EasyRSA-Skripte als \texttt{VPN-EasyRSA.zip} abgelegt werden.
Um ein Zertifikat von der CA zu beantragen, wird das bereits vorkonfigurierte EasyRSA-Paket benötigt, welches durch das IT-Team der Abteilung Informatik bereitgestellt wird.
Dafür kann auf das von OpenVPN installierte OpenSSL zurückgegriffen werden\footnote{Mehr dazu unter \\\url{https://github.com/OpenVPN/easy-rsa/blob/v3.0.5/distro/windows/README-Windows.txt}}.
Nun öffnet man ein Terminal, wechselt in das eben entpackte Verzeichnis von EasyRSA und kann den Befehl \texttt{./easyrsa} verwenden, um einen Zertifikatsantrag zu erzeugen.
Für die Beantragung eines \textbf{Clientzertifikats} muss der Platzhalter \texttt{entityName} durch den E-Mailadresse des Benutzers an der Hochschule Hannover ersetzt werden.
Für die Beantragung eines \textbf{Serverzertifikats} muss der Platzhalter \texttt{entityName} durch dessen vollqualifizierten Domainnamen des Servers ersetzt werden.
Dieser kann beispielsweise \texttt{aither.inform.hs-hannover.de} lauten.
Im Rahmen der Erzeugung des Zertifikatsantrags werden zusätzliche Angaben abgefragt.
Im Feld \texttt{Common Name} muss der volle Name des Antragsstellers (Clientzertifikat) oder der vollqualifizierte Domainname des Servers (Serverzertifikat) angegeben werden.
Im Feld \texttt{Email Address} muss die Hochschul-E-Mail-Adresse des Antragsstellers angegeben werden.
Alle weiteren Vorgaben werden unverändert übernommen.
\textbf{Hinweis 1}: Besteht der begründete Wunsch, den erzeugten, privaten Schlüssel \textbf{nicht} mit einem Passwort zu schützen, so kann das Argument \texttt{nopass} an den Befehl \texttt{gen-req} angehängt werden.
Dies kann nützlich sein um den privaten Schlüssel ohne zusätzliche Passworteingabe zu benutzen - zum Beispiel zum Betrieb eines OpenVPN-Servers oder zum automatischen Verbindungsaufbau mit einem OpenVPN-Client.
Sollte der private Schlüssel in die Hände eines Angreifers gelangen, so kann dieser ebenfalls das dazugehörige Zertifikat missbrauchen.
Ein Passwortschutz wird ausdrücklich empfohlen sofern keine sonstigen Maßnahmen zum Schutz des privaten Schlüssels vor unbefugtem Zugriff getroffen werden!
\textbf{Hinweis 2}: Wurde zuvor bereits ein Zertifikatsantrag mit dem selben \texttt{entityName} erzeugt worden sein, so kann dieser inklusive dem dazugehörigen privaten Schlüssel \textbf{überschrieben} werden.
In diesem Schritt wurden nun zwei neue Dateien erzeugt:
\begin{itemize}
\item\texttt{*.key}: Der private Schlüssel. Nur mit ihm kann das später ausgestellte Zertifikat benutzt werden. Diese Datei sollte immer an einem sicheren Ort gespeichert werden, um Missbrauch durch Dritte zu verhindern. Bei Verlust dieser Datei wird das dazugehörige Zertifikat \textbf{unbrauchbar}! Aus diesem Grund wird die Durchführung von Backups empfohlen.
\item\texttt{*.req}: Der Zertifikatsantrag, der zu dem neuen privaten Schlüssel gehört. Zum Ausstellen eines gültigen Zertifikats muss er an die CA übergeben werden. Nachdem ein gültiges Zertifikat aus dem Antrag erzeugt wurde, wird diese Datei nicht länger benötigt.
Für die Beantragung eines \textbf{Clientzertifikats} muss der Platzhalter \texttt{entityName} durch die E-Mail-Adresse des Benutzers an der Hochschule Hannover ersetzt werden, der das Zertifikat beantragt.
Für die Beantragung eines \textbf{Serverzertifikats} muss der Platzhalter \texttt{entityName} durch den vollqualifizierten Domainnamen des Servers ersetzt werden, für den das Zertifikat beantragt wird.
Dieser kann zum Beispiel \texttt{aither.inform.hs-hannover.de} lauten.
\textbf{Hinweis}: Die Gültigkeitsdauer kann nach Ermessen der CA-Betreiber in begründeten Einzelfällen frei gewählt werden, indem die Umgebungsvariable \texttt{EASYRSA\_CERT\_EXPIRE} auf die gewünschte Gültigkeitsdauer in Tagen gesetzt wird.
Bei der Wahl einer erhöhten Gültigkeitsdauer wird empfohlen, eine maximale Gültigkeitsdauer von 1825 Tagen (fünf Jahre) nicht zu überschreiten.
Der OpenVPN-Server verwendet die von der CA ausgestellte \textit{Certificate Revocation List} (CRL) zur Überprüfung der Gültigkeit von Clientzertifikaten.
Eine Automatisierung dieses Vorgangs ist möglich und wurde auf der CA-Maschine entsprechend umgesetzt.
Um die CRL automatisiert zu erneuern und über den Webserver öffentlich zur Verfügung zu stellen, werden als Benutzer \texttt{root} Cronjobs angelegt.
Dazu wird das folgende Kommando verwendet.
\begin{lstlisting}
crontab -e
\end{lstlisting}
In dem nun offenen Editor werden die beiden folgenden Cronjobs eingetragen, welche sich um die Erzeugung der CRL sowie die Platzierung der neuen CRL im durch den Webserver ausgelieferten Verzeichnis kümmern.
Um Chiffren mit \textit{Perfect Forward Secrecy} zu verwenden benötigt der OpenVPN-Server eine Datei mit Diffie-Hellman-Parametern.
Da die Berechnung dieser Parameter sehr lange dauert, ist es nicht sinnvoll sie bei jedem Sitzungsaufbau zwischen OpenVPN-Client und -Server zu berechnen.
Deshalb werden diese Parameter vorab generiert und in einer Datei abgelegt.
Die Berechnung von 4096 Bit-Parametern sollte je nach Hardware höchstens 25 Minuten in Anspruch nehmen\footnote{23 Minuten wurden mit der CPU \enquote{Intel(R) Core(TM) i5 CPU M 450 @ 2.40GHz} gemessen.}.
Anschließen kann die erzeugte Datei in das Konfigurationsverzeichnis des OpenVPN-Servers hinzugefügt werden und über den Parameter \texttt{dh /path/to/dh.pem} in der Serverkonfiguration bekannt gemacht werden.