\chapter{Vorwort}
Dieses Dokument wurde im Rahmen der Masterarbeit \enquote{Konzeption und Umsetzung eines IPv6-VPN für die Abteilung Informatik} erzeugt.
Im Rahmen der Masterarbeit wird beschrieben, wie ein IP6-VPN-Dienst auf Basis von OpenVPN konzipiert und eingerichtet wird.

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 ausstellt.
In diesem Dokument wird beschrieben, wie die Zertifizierungsstelle aufgebaut und konfiguriert wird.
Weiterhin sind Anleitungen für die Benutzer und die Serveradministratoren des VPN-Dienst enthalten, mit deren Hilfe Zertifikate bei der Zertifizierungsstelle beantragt werden können.
Für die Zertifizierungsstelle ist eine Anleitung enthalten, anhand derer Zertifikate für eingereichte Zertifikatsanträge ausgestellt werden können.

\todo{Improve this section}

\chapter{Einrichtung der CA}



\section{Beschaffen von EasyRSA3}
Aktuelle Releases sind unter \url{https://github.com/OpenVPN/easy-rsa/releases} zu finden.
GPG-Schlüssel zur Authentisierung der Releases sind im easy-rsa Repository unterhalb von \texttt{./release-keys/README.md} aufgeführt.
\url{https://github.com/OpenVPN/easy-rsa/tree/master/release-keys}

\begin{lstlisting}
# Aktuelles Release v3.0.4 beschaffen und den dazu passenden GPG-Key
gpg --recv-keys 6F4056821152F03B6B24F2FCF8489F839D7367F3
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz.sig
gpg --verify EasyRSA-3.0.4.tgz.sig EasyRSA-3.0.4.tgz
tar xzf EasyRSA-3.0.4.tgz
cd EasyRSA-3.0.4
\end{lstlisting}



\section{Konfiguration der CA}

\begin{lstlisting}
# Vorgeschlagene Einstellungen, die in der vars-Datei getätigt werden sollten.
set_var EASYRSA_DN	"org"

set_var EASYRSA_REQ_COUNTRY	"DE"
set_var EASYRSA_REQ_PROVINCE	"Niedersachsen"
set_var EASYRSA_REQ_CITY	"Hannover"
set_var EASYRSA_REQ_ORG	"Hochschule Hannover"
set_var EASYRSA_REQ_EMAIL	"F4-I-IT-Team@hs-hannover.de"
set_var EASYRSA_REQ_OU		"Abteilung Informatik"

set_var EASYRSA_KEY_SIZE	4096
set_var EASYRSA_ALGO		rsa

set_var EASYRSA_CA_EXPIRE	3650
set_var EASYRSA_CERT_EXPIRE	180
set_var EASYRSA_CRL_DAYS	180
\end{lstlisting}

\begin{lstlisting}
cp vars.example vars
vim vars
# Konfiguration der CA anpassen:
\end{lstlisting}


\section{Initialisierung der CA}


\begin{lstlisting}
# Verzeichnisstruktur erzeugen (löscht bereits existierende Struktur!)
./easyrsa init-pki

# CA-Zertifikat erzeugen, Passwort für privaten Schlüssel wird verlangt
./easyrsa build-ca
\end{lstlisting}


\section{Bereitstellung der Konfiguration für Benutzer}
Die Datei \texttt{vars} wird benötigt.
Zusätzlich wäre es für einige Benutzer ggf. hilfreich, die Windows- und Unix-Version konfiguriert zum Download anzubieten.

Daher muss durch die CA mindestens diese Datei bereitgestellt werden.
In dem Zug kann man auch gleich ein vorkonfiguriertes Paket mit EasyRSA bereitstellen.


\chapter{Beantragen von Clientzertifikaten}
Dinge, die der Benutzer auf seinem Gerät tun muss, um einen Zertifikatsantrag zu erzeugen.

Voraussetzung: Auf dem Computer ist openssl installiert.
Gegebenenfalls muss der Pfad zu openssl in der \texttt{vars}-Datei von EasyRSA hinterlegt werden.
Unter Windows kann auf das durch OpenVPN installierte OpenSSL zurückgegriffen werden\footnote{Mehr dazu unter \url{https://github.com/OpenVPN/easy-rsa/blob/v3.0.4/distro/windows/README-Windows.txt}}:
\begin{lstlisting}
set_var EASYRSA_OPENSSL	"C:/Program Files/OpenVPN/bin/openssl.exe"
\end{lstlisting}


\chapter{Beantragen von Serverzertifikaten}
Dinge, die der Benutzer auf seinem Gerät tun muss, um einen Zertifikatsantrag zu erzeugen.


\chapter{Ausstellen von Zertifikaten}
Ein Benutzer kommt mit einem Antrag bei der CA an. Welche Schritte werden durchlaufen, damit ein gültiges Client/Server-Zertifikat ausgestellt wird?



\begin{lstlisting}
# Request importieren (erfordert einen eindeutigen Namen - hier "timmeja")
./easyrsa import-req /tmp/EasyRSA-3.0.4/pki/reqs/jpt-client.req timmeja

# Achtung! Falls bereits ein gültiges Zertifikat existiert, ist es notwendig dieses vorher zurückzurufen.
# Sonst kann kein neues Zertifikat mit gleicher CN ausgestellt werden.
# (optional)
./easyrsa revoke timmeja

# Request signieren mit Client-Rolle (erfordert Passwort für privaten Schlüssel der CA)
./easyrsa sign-req client timmeja

# Zertifikat inspizieren und an Antragsteller übergeben
openssl x509 -in pki/issued/timmeja.crt -noout -text

# (optional?)
./easyrsa update-db

# CRL erzeugen und an OpenVPN-Server übergeben
./easyrsa gen-crl
\end{lstlisting}

\textbf{Achtung:} Wenn die CRL ausgelaufen ist, muss sie neu generiert werden. Das kann den VPN-Server im Betrieb blockieren.
Daher ist eine hohe Gültigkeitsdauer mit on-demand-replacement eine Option.
Ansonsten empfiehlt es sich, diesen Kram zu automatisieren. Regelmäßig eine neue CRL durch CA bereitstellen, von dieser beziehen und den VPN-Server ggf. neustarten.
In der Serverkonfiguration: \texttt{verify-crl /path/to/crl.pem}



Die Gültigkeitsdauer kann in begründeten Einzelfällen (z.B. für Serverzertifikate) auf 730 Tage (etwa 2 Jahre) gesetzt werden.
\begin{lstlisting}
EASYRSA_CERT_EXPIRE=730 ./easyrsa sign-req server aither.inform.hs-hannover.de
\end{lstlisting}
