
\section{Einrichten der Root-CA}
Die Root-CA wird bei der Installation eines Domänencontroller Master automatisch
eingerichtet. Dafür werden die Parameter \ucsName{ssl\_country},
\ucsName{ssl\_state}, \ucsName{ssl\_locality}, \ucsName{ssl\_organization},
\ucsName{ssl\_organizationalunit} und \ucsName{ssl\_email} im
Installationsprofil benötigt. Bei der interaktiven Installation eines Domänencontroller
Master erscheinen entsprechende Eingabefenster.

Die Werte aus dem Installationsprofil werden während der Installation in \ucsUCR{"=Variablen} übernommen. Bei den
Variablennamen wird dabei der Unterstrich ''\_'' aus den Profilvariablen durch einen
Schrägstrich ''/'' ersetzt. Aus \ucsName{ssl\_email} wird z.B.
\ucsName{ssl/email}.

Der Common Name der UCS"=Root"=CA wird automatisch auf \ucsName{Univention
Corporate Server Root CA} gesetzt und in der \ucsUCR{"=Variable}
\ucsName{ssl/common} gespeichert.

\ucsExclamation\ucsAttention{Wenn diesen Variablen nach der Installation
andere Werte zugewiesen und anschließend neue Zertifikate erzeugt werden,
so ist nicht sichergestellt, dass diese Zertifikate mit dem Root"=Zertifikat
überprüft werden können.}

\section{Zertifikatsverwaltung mit univention-certificate}
Zur Verwaltung der Zertifikate steht unter UCS der Befehl
\ucsCommand{univention-certificate} zur Verfügung, damit können neue
Zertifikate beispielsweise angelegt oder zurückgezogen werden.

\subsection{Anlegen von Zertifikaten}
Standardmäßig werden für alle Rechner einer UCS"=Domäne mit Ausnahme der Thin
Clients und der Windows"=Rechner automatisch Zertifikate erzeugt. Beim Domänencontroller
Master geschieht dies bei der Installation, bei allen anderen Rechnern beim
Domänenbeitritt. Für UCS-Server- und Clientsysteme ist es im Normalfall also
nicht notwendig, Zertifikate mit \ucsCommand{univention-certificate} zu
erzeugen.

Mit dem Befehl

\begin{ucsConsoleInput}
univention-certificate new -name <gewünschter Name des \
Zertifikats> -days <Gültigkeitsdauer in Tagen>
\end{ucsConsoleInput}

kann ein neues Zertifikat erzeugt werden. Als Name wird üblicherweise der FQDN des
zu zertifizierenden Rechners eingesetzt. Wenn keine Gültigkeitsdauer angeben
wird, so wird der Vorgabewert von 730 Tagen verwendet. Der Vorgabewert kann
durch Setzen der \ucsUCR{"=Variable}
\ucsCommand{\ucsBCindex{ssl/default/days}} geändert werden.

Für jedes Zertifikat wird im Verzeichnis \ucsURL{/etc/univention/ssl/} ein
Unterverzeichnis mit dem Namen des Zertifikats angelegt, das folgende Dateien
enthält:

\begin{ucsConsoleInput}
ls -la /etc/univention/ssl/<Unterverzeichnis>/
\end{ucsConsoleInput}
\begin{ucsConfigFile}
total 28
drwxr-x---   2 root   DC Backup Hosts   4096 Apr  1 22:05 .
drwxr-xr-x   9 root   DC Backup Hosts   4096 Apr  1 22:05 ..
-rw-r-x---   1 root   DC Backup Hosts   4422 Apr  1 22:05 cert.pem
-rw-r-x---   1 root   DC Backup Hosts   3297 Apr  1 22:05 openssl.cnf
-rw-r-x---   1 root   DC Backup Hosts    891 Apr  1 22:05 private.key
-rw-r-x---   1 root   DC Backup Hosts    838 Apr  1 22:05 req.pem
\end{ucsConfigFile}

Die Datei \ucsURL{cert.pem} stellt das eigentliche Zertifikat dar. In
\ucsURL{openssl.cnf} ist die Konfiguration von OpenSSL zum Zeitpunkt der
Zertifikat"=Erstellung festgehalten. Die Datei \ucsURL{private.key} enthält den
privaten Schlüssel zu dem Zertifikat. In \ucsURL{req.pem} ist der
ursprüngliche Client"=Request, mit dem das Zertifikat erstellt wurde,
dokumentiert.

Im Verzeichnis \ucsURL{/etc/univention/ssl/ucsCA/certs/} wird eine Kopie des
Zertifikats mit Seriennummer als Dateiname gespeichert und ein Link auf die
Kopie angelegt.

Außerdem wird das Zertifikat in der Datei
\ucsURL{/etc/univention/ssl/ucsCA/index.txt} vermerkt und die Seriennummer in
\ucsURL{/etc/univention/ssl/ucsCA/serial} wird erhöht.


\subsection{Signieren von Zertifikaten}
Die Zertifikate werden beim Anlegen automatisch von der CA signiert.
Die Umwandlung der UCS"=Root"=CA in eine Sub-CA und die Signierung des
Zertifikats durch eine übergeordnete CA wird in
Kapitel~\ref{ssl-zertifikate:zertifizieren_der_ucs-ca} beschrieben.

In Kapitel \ref{ssl-zertifikate:signieren_fremder_requests} wird die
Signierung von Requests, die auf anderen Rechnern erstellt wurden, näher
erläutert.

\subsection{Erneuern des UCS"=Root"=Zertifikats}
Das UCS"=Root"=Zertifikat sowie die Rechner"=Zertifikate können nur auf dem
Domänencontroller Master neu generiert werden.

\begin{enumerate}
\item Zunächst sollte eine Sicherheitskopie von \ucsURL{/etc/univention/ssl}
und seinen Unterverzeichnissen angelegt werden, z.B. mit
\begin{ucsConsoleInput}
cp -a /etc/univention/ssl /etc/univention/ssl_$(date +"%d%m%Y")
\end{ucsConsoleInput}

\item Nach der Neuerzeugung des UCS"=Root"=Zertifikats müssen alle
Rechnerzertifikate der Clients erneuert
und auf die entsprechenden Rechner kopiert werden.
Es ist daher sinnvoll, wie in
Abschnitt~\ref{ssl-zertifikate:auflisten_vorhandener_zertifikate}
beschrieben, sich die Liste aller ausgestellten Zertifikate ausgeben zu
lassen und ggf. auszudrucken.

\item Ein neues Root"=Zertifikat mit einem Gültigkeitszeitraum von 1000 Tagen
wird durch
\begin{ucsConsoleInput}
cd /etc/univention/ssl/ucsCA
openssl x509 -in CAcert.pem -out NewCAcert.pem \
   -passin file:/etc/univention/ssl/password \
   -days 1000 -signkey private/CAkey.pem
\end{ucsConsoleInput}
erzeugt (hier wurde die relative lange Befehlszeile des openssl"=Aufrufs der
Lesbarkeit halber durch Backslash"=Zeichen auf mehrere Zeilen umgebrochen).
Dieses kann dann durch den Befehl
\begin{ucsConsoleInput}
mv NewCAcert.pem CAcert.pem
\end{ucsConsoleInput}
an die Stelle des alten UCS"=Root"=Zertifikats verschoben werden.

\item Neue Rechnerzertifikate können wie folgt erstellt werden
\begin{ucsConsoleInput}
eval $(univention-config-registry shell)
cd /etc/univention/ssl
for i in *.$domainname; do
   univention-certificate renew -name $i -days 1000;
done
\end{ucsConsoleInput}

\item Die neuen Rechnerzertifikate müssen dann auf die jeweiligen Rechnersysteme kopiert
werden (hier am Beispielrechner ucs-slave):
\begin{ucsConsoleInput}
eval $(univention-config-registry shell)
cd /etc/univention/ssl/
scp ucsCA/CAcert.pem root@ucs-slave:/etc/univention/ssl/ucsCA/
rsync -av ucs-slave.$domainname root@ucs-slave:/etc/univention/ssl/
\end{ucsConsoleInput}
Dieser Schritt ist auf Domänencontroller=Backup"=Systemen nicht erforderlich, da dies wie
oben beschrieben automatisch regelmäßig per cron erfolgt.

\item Auf Rechnern, auf denen der Cyrus"=Mailserver läuft, sind zusätzlich die Dateien
\ucsURL{cert.pem} und \ucsURL{private.key} nach \ucsURL{/var/lib/cyrus/} zu kopieren:
\begin{ucsConsoleInput}
cp /etc/univention/ssl/$(hostname -f)/cert.pem /var/lib/cyrus
cp /etc/univention/ssl/$(hostname -f)/private.key /var/lib/cyrus/
\end{ucsConsoleInput}

\item Alle Dienste, die SSL"=Verschlüsselung benutzen, müssen neu gestartet werden.
Alternativ kann auch ein Neustart des Systems durchgeführt werden.
\end{enumerate}

\subsection{Erneuern von Zertifikaten}
\label{ssl-zertifikate:Erneuern-von-Rechnerzertifikaten}
Mit dem Befehl

\begin{ucsConsoleInput}
univention-certificate renew -name <Name des Zertifikats> \
-days <Gültigkeitsdauer in Tagen>
\end{ucsConsoleInput}

kann ein einzelnes Zertifikat erneuert werden. Die Gültigkeitsdauer wird ab dem
aktuellen Datum gerechnet, nicht ab dem bisherigen Ablaufdatum des
Zertifikats. Wenn keine Gültigkeitsdauer angeben wird, so wird der Vorgabewert
von 730 Tagen verwendet. Der Name des Zertifikats ist so anzugeben, wie er in
der Liste der vorhandenen Zertifikate (siehe
Kapitel~\ref{ssl-zertifikate:auflisten_vorhandener_zertifikate}) erscheint. 


\subsection{Zurückrufen von Zertifikaten}
Mit dem Befehl

\begin{ucsConsoleInput}
univention-certificate revoke -name <Name des Zertifikats>
\end{ucsConsoleInput}

wird ein Zertifikat zurückgerufen, d.h. es bleibt gespeichert, ist aber nicht
mehr gültig. Wenn ein neues Zertifikat mit demselben Namen erzeugt wird, wird
das Verzeichnis des alten Zertifikats in \ucsURL{/etc/univention/ssl} allerdings
überschrieben. Nur die Datei \ucsURL{/etc/univention/ssl/ucsCA/certs/<Nummer
des Zertifikats>.pem} bleibt erhalten.


\subsection{Ausgeben von Zertifikat"=Informationen}
Mit dem Befehl

\begin{ucsConsoleInput}
univention-certificate dump -name <Name des Zertifikats>
\end{ucsConsoleInput}

werden die Informationen, die in einem Zertifikat (also in der Datei
\ucsURL{/etc/univention/ssl/<Zertifikat-Unterverzeichnis>/cert.pem})
gespeichert sind, ausgegeben.

\ucsAttention{Die Ausgabe des oben angegebenen Befehls enthält unter anderem
die folgenden Zeilen. Sie geben lediglich die Gültigkeitsdauer an und sagen
nichts darüber aus, ob das Zertifikat tatsächlich gültig ist. Die Gültigkeit
ist, wie in Kapitel~\ref{ssl-zertifikate:überprüfen_des-Zertifikat-status}
beschrieben, zu prüfen.} 

\begin{ucsConfigFile}
Validity
Not Before: <Datum>
Not After: <Datum>
\end{ucsConfigFile}


\subsection{Überprüfen des Zertifikat"=Status}
\label{ssl-zertifikate:überprüfen_des-Zertifikat-status}
Mit dem Befehl

\begin{ucsConsoleInput}
univention-certificate check -name <Name des Zertifikats>
\end{ucsConsoleInput}

wird geprüft, ob das angegebene Zertifikat gültig oder ungültig (also
zurückgerufen oder abgelaufen) ist.


\subsection{Auflisten vorhandener Zertifikate}
\label{ssl-zertifikate:auflisten_vorhandener_zertifikate}
Mit dem Befehl

\begin{ucsConsoleInput}
univention-certificate list
\end{ucsConsoleInput}

wird eine Liste aller vorhandenen, gültigen Zertifikate ausgegeben.


\section{Zertifizieren der UCS-CA durch eine übergeordnete CA}
\label{ssl-zertifikate:zertifizieren_der_ucs-ca}
Die in UCS integrierte CA kann durch eine andere CA zertifiziert werden.
Dadurch wird die UCS-CA, die standardmäßig eine Root-CA ist, in eine Sub-CA
umgewandelt.

Dabei kann folgendermaßen vorgegangen werden:
\begin{enumerate}
\item Zunächst sollte eine Sicherheitskopie von \ucsURL{/etc/univention/ssl} und
seinen Unterverzeichnissen angelegt werden.

\item Nach der Installation des Domänencontroller Master liegt die
  Signierungsanfrage (Request) unter
\ucsURL{/etc/univention/ssl/ucsCA/CAreq.pem}. Diese Anfrage muss mit der
übergeordneten CA unterschrieben werden.  Durch die Signatur wird aus der
Anfrage ein Zertifikat.

\item Falls das UCS"=Zertifikat und das Zertifikat der übergeordneten CA nicht
im PEM"=Format vorliegen, so muss dies umgewandelt werden. Im folgenden
Beispiel wird ein Zertifikat im DER-Format umgewandelt:

\begin{ucsConsoleInput}
openssl x509 -inform der -outform pem -in MpublicCA.der \
-out MPublicCA.pem
\end{ucsConsoleInput}

\item Das UCS"=Zertifikat muss an zwei Stellen gespeichert werden
(\ucsURL{/etc/univention/ssl/ucsCA/CAcert.pem} und eine Kopie in
\ucsURL{/etc/univention/ssl/ucsCA/certs/00.pem}):

\begin{ucsConsoleInput}
cd /etc/univention/ssl
cp <Pfad>/CAcert.pem ucsCA/CAcert.pem
cp ucsCA/CAcert.pem ucsCA/newcerts/00.pem
source /usr/share/univention-ssl/make-certificates.sh
move_cert ucsCA/newcerts/00.pem
\end{ucsConsoleInput}

Der letzte Befehl verschiebt das Zertifikat aus dem Verzeichnis
\ucsURL{/etc/univention/ssl/ucsCA/newcerts/} in das Verzeichnis
\ucsURL{/etc/univention/ssl/ucsCA/certs/} und legt dort einen Link auf das
Zertifikat an.

\item Das Zertifikat kann nun auf dem Webserver abgelegt werden:

\begin{ucsConsoleInput}
cd /etc/univention/ssl
openssl x509 -in ucsCA/CAcert.pem -out \
/var/www/ucs-root-ca.crt
\end{ucsConsoleInput}

\item Das CA"=Zertifikat der übergeordneten CA muss ebenfalls auf dem Domänencontroller Master
gespeichert werden:

\begin{ucsConsoleInput}
mkdir -p /etc/univention/ssl/mca/
cp <Pfad>/MPublicCA.pem /etc/univention/ssl/mca/
\end{ucsConsoleInput}

\item Nun kann die Zertifikatskette erzeugt werden:

\begin{ucsConsoleInput}
cd /etc/univention/ssl
cat mca/MPublicCA.pem >> ucsCA/CAcert.pem
\end{ucsConsoleInput}

\item Der Webserver muss nun so eingerichtet werden, dass dieser die Chain-Datei zusammen mit
seinem Zertifikat an die Clients schickt. Dazu muss die folgende Zeile

\begin{ucsConfigFile}
SSLCertificateChainFile /etc/univention/ssl/CAChain.pem
\end{ucsConfigFile}

in die Datei
\ucsURL{/etc/univention/templates/files/etc/apache2/mods-available/ssl.conf}
eingefügt werden. Die Einstellungen können mit dem Befehl 

\begin{ucsConsoleInput}
univention-config-registry commit \
/etc/apache2/mods-available/ssl.conf
\end{ucsConsoleInput}

übernommen werden, danach muss der Webserver neu gestartet werden:

\begin{ucsConsoleInput}
/etc/init.d/apache2 restart
\end{ucsConsoleInput}

\item Das CA"=Zertifikat der übergeordneten CA muss auf den Clients importiert
werden, damit die Clients entsprechend andere Zertifikate überprüfen können,
die von der UCS-CA unterschrieben wurden.

\item Folgende Browser"=Einstellungen sind auf den Clients vorzunehmen:
\begin{itemize}
\item Im Browser Firefox sind keine speziellen Einstellungen erforderlich.
\item Bei Microsoft Internet Explorer schalten Sie die TLS 1.0"=Unterstützung ein
über \ucsMenuEntry{Extras \ucsRightArrow{} Internetoptionen \ucsRightArrow{}
Erweitert \ucsRightArrow{} Sicherheit}.
\item Der Browser Konqueror unterstützt derzeit keine Zertifikatsketten.
\end{itemize}
\end{enumerate}


\section{Signieren fremder Requests durch die UCS-CA}
\label{ssl-zertifikate:signieren_fremder_requests}
Mit dem folgenden Befehl kann eine Signierungsanfrage (Request), der auf einem
anderen Rechner erstellt wurde, mit der UCS-CA signiert werden:

\begin{ucsConsoleInput}
openssl ca -batch -config /etc/univention/ssl/openssl.cnf \
-in <Request> -out <Zertifikat> -passin pass`cat \
/etc/univention/ssl/password`
\end{ucsConsoleInput}

Dabei ist \emph{<Request>} durch den Dateinamen mit Pfad, unter dem die
eingegangene Anfrage  gespeichert ist (Bsp.
\ucsURL{/etc/univention/ssl/fqdn/req.pem}), zu ersetzen. Die Anfrage sollte im
PEM"=Format vorliegen oder muss ggf. umgewandelt werden. Die Umwandlung könnte
mit folgendem Befehl durchgeführt werden:

\begin{ucsConsoleInput}
openssl x509 -inform der -outform pem -in request.der -out \
req.pem
\end{ucsConsoleInput}

Dabei ist \emph{<Zertifikat>} durch den Dateinamen mit Pfad, unter dem das
fertige Zertifikat gespeichert werden soll (Bsp.
\ucsURL{/etc/univention/ssl/fqdn/cert.pem}), zu ersetzen. Das Verzeichnis
ist vorher anzulegen, falls es nicht existiert.

Standardmäßig wird unter UCS von allen Zertifikaten eine Kopie unter
\ucsURL{/etc/univention/ssl/ucsCA/certs} gespeichert. Dafür ist der Befehl

\begin{ucsConsoleInput}
move_cert /etc/univention/ssl/ucsCA/newcerts/*
\end{ucsConsoleInput}

auszuführen.

% Diese Zeilen bitte am Ende des Dokuments stehenlassen und 
% nicht entfernen - sie helfen bei der Arbeit mit vi und emacs.
% vim:tw=78:ts=8:nocindent:noautoindent
% Local Variables:
% fill-column: 78
% End:
