Im Beispiel wird folgende Bezeichnung verwendet.
Schulname: Musterschule Ort: Musterstadt Bundesland: Musterland Interne Domain: musterschule.de Externer Name: musterschule.extern.de Weiterer Name: musterschule.extern2.de
Die SSL-Kommunikation für gesicherte Web-Verbindungen, aber nicht nur dafür, läuft über Zertifikate, die von einer Zertifizierungsstelle ausgestellt werden, denen der Client-Rechner vertraut. Man kann in der Schule eine eigene Zertifizierungsstelle betreiben, da die verfügbaren Zertifizierungsstellen mit erheblichen Kosten für die Schule verbunden sind.
Hinweis: Die hier durchgeführten Änderungen können eventuell durch Teilprogramme der Musterlösung torpediert werden. Insbesondere wird bei einer Änderung des Servernamen oder des IPFIRE-Namen oder der Domäne bestimmt eine Neuerstellung der Zertifikate durchgeführt.
Eine Zertifizierungsstelle basiert auf einem geheimen Schlüssel und einem mit diesem Schlüssel ausgestellten Zertifikat. Der geheime Schlüssel muss sicher verwahrt werden. Er wird benötigt, um Server-Zertifikate zu signieren.
Die Dateistruktur befindet sich unter /etc/ssl/Musterschule_CA
.
Hier werden alle signierten Zertifikate registriert.
Hier wird eine Seriennummer vergeben. Diese Datei muss mit einer Zeichenkette initialisiert werden, das kann im einfachsten
Fall die 01
sein.
Der Schlüssel und das Zertifikat befinden sich an einem sicheren Ort (Safe der Schulleitung).
Außerdem befindet sich das Zertifikat unter /etc/ssl/certs/Musterschule_CA.crt
zur Nutzung auf dem Server. Es wird außerdem über das Doku-Wiki zum Herunterladen unter Musterschule_CA-Zertifikat bereitgestellt1).
mkdir /etc/ssl/Musterschule_CA
mit den Rechten
chmod 755 /etc/ssl/Musterschule_CA
und der Gruppe ssl-cert
.
chgrp ssl-cert /etc/ssl/Musterschule_CA
Der Schlüssel wird mit einem Passwort gesichert. Das ist wichtig, um eine nicht bestimmungsgemäße Verwendung verhindern zu können. So ist der Schlüssel mehrfach gesichert durch eingeschränkte Zugriffsrechte und ein Passwort. Alle weiteren Befehle werden in diesem Verzeichnis ausgeführt, um die Dateien hier zusammenzuhalten.
openssl genrsa -des3 -out Musterschule_CA.key 1024
mit den Rechten.
Musterschule_CA.key root:ssl-cert r-- --- ---
openssl req -new -key Musterschule_CA.key -x509 -days 3650 -out ../certs/Musterschule_CA.crt
Dieses Zertifikat ist das Stammzertifikat, das alle weiteren Zertifikate als gültig ausweist. Es wird wie oben beschrieben veröffentlicht.
openssl x509 -fingerprint -noout -in ../certs/Musterschule_CA.crt
gibt diesen Fingerabdruck auf der Konsole aus. Dieser Fingerabdruck wird am besten auf einer Doku-Wiki-Seite namens zertifikat für alle angemeldeten Benutzer zum Lesen und den Administrator2) zum Schreiben freigegeben.
Mit dem Schlüssel der Zertifizierungsstelle werden jetzt mehrere Zertifikate erstellt. Diese müssen zwei Alternativnamen enthalten, nämlich server.musterschule.de
und musterschule.extern.de
, weil der Server unter beiden Namen angesprochen werden kann.
Dazu müssen in der Datei /etc/ssl/openssl.cnf
folgende Einträge gemacht werden:
[ ca ] default_ca = Musterschule_CA [ Musterschule_CA ] dir = /etc/ssl/Musterschule_CA certificate = /etc/ssl/certs/Musterschule_CA.pem private key = $dir/private/Musterschule_CA.key RANDFILE = $dir/private/.srl
Dazu müssen in der Datei /etc/ssl/openssl.cnf
folgende Einträge gemacht werden:
[ req ] req_extensions = v3_req [ v3_req ] subjectAltName = DNS:server.musterschule.de, DNS:musterschule.extern2.de, IP:10.16.1.1, DNS:musterschule.extern.de
Dazu müssen in der Datei /etc/ssl/openssl.cnf
folgende Einträge gemacht werden3):
[ usr_cert ] basicConstraints = CA:FALSE nsCertType = server subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always issuerAltName = issuer:copy
[ Musterschule_CA ] copy_extensions = copy
Die Einstellung copy_extensions sollte nur konkret für die Erstellung eines Zertifikats aktiviert und danach wieder auskommentiert werden, da es sich um eine Sicherheitslücke handelt.
Die Erstellung und Signierung des Zertifikats erzeugt die Datei, die schließlich zur Identifikation des Servers verwendet wird.
Die Kurzversion nach entsprechender Konfiguration der CA in der Datei /etc/ssl/openssl.cnf
lautet:
openssl ca -in server.csr -out server.crt
Der Dialog lautet:
Signature ok subject=/C=DE/ST=Musterland/L=Musterstadt/O=Musterschule/OU=Server/\ CN=server.musterschule.de/emailAddress=administrator@musterschule.de Getting CA Private Key Enter pass phrase for /etc/ssl/Musterschule_CA/private/Musterschule_CA.key:
Mit dem Befehl
openssl x509 -in server.crt -noout -text
wird der Inhalt überprüft, insbesondere das Vorhandensein von subjectAltName.
Certificate: Data: Version: 3 (0x2) Serial Number: ... Signature Algorithm: sha1WithRSAEncryption Issuer: C=DE, ST=Musterland, L=Musterstadt, O=Musterschule, OU=Certificate Authority,\ CN=Musterschule_CA/emailAddress=root@musterschule.de Validity Not Before: ... Not After : ... Subject: C=DE, ST=Musterland, O=Musterschule, OU=Server, \ CN=server.musterschule.de/emailAddress=administrator@musterschule.de Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): .... Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Cert Type: SSL Server Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: ... X509v3 Authority Key Identifier: keyid:... DirName:/C=DE/ST=Musterland/L=Musterstadt/O=Musterschule/OU=Certificate \ Authority/CN=Musterschule_CA/emailAddress=root@musterschule.de serial:... X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment X509v3 Subject Alternative Name: DNS:server.musterschule.de, DNS:musterschule.extern.de Signature Algorithm: sha1WithRSAEncryption ...
Zunächst muss jeweils eine Schlüsseldatei erstellt werden: Erstellung des privaten Schlüssels des Servers.
openssl genrsa -des3 -out server.key 1024
mit den Rechten.
server.key root:ssl-cert rw- r-- ---
Dieses Zertifikat wird unter /etc/ssl/private
gespeichert und wird unter anderem für den LDAP-Server verwendet.
Hinweis: Die Server-PEM-Datei muss den server.key ohne Verschlüsselung enthalten. Andernfalls startet der LDAP-Server nicht mehr.
Der Befehl ist:
openssl req -new -key server.key -out server.csr
Der Zertifizierungsdialog ist wie folgt:
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [DE]: State or Province Name (full name) [Musterland]: Locality Name (eg, city) [Musterstadt]: Organization Name (eg, company) [Musterschule]: Organizational Unit Name (eg, section) []:Server Common Name (eg, YOUR name) []:server.musterschule.de Email Address []:administrator@musterschule.de Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Das Zertifikat muss unter /etc/ssl/private
installiert werden.
-rw-r--r-- 1 root ssl-cert 1131 12. Jan 14:50 server.crt -r-------- 1 root ssl-cert 887 12. Jan 14:39 server.key -rw-r----- 1 root ssl-cert 2018 12. Jan 14:50 server.pem
Dieses Zertifikat ist unter /etc/apache2/ssl
gespeichert und identifiziert den Webserver.
Der zunächst generierte Schlüssel darf kein Passwort enthalten, da dieses sonst beim Webserver-Start abgefragt wird. Das erreicht man, indem man bei genrsa die Option -des3 weglässt.
Der Dialog lautet:
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [DE]: State or Province Name (full name) [Musterland]: Locality Name (eg, city) [Musterstadt]: Organization Name (eg, company) [Musterschule]: Organizational Unit Name (eg, section) []:Webserver Common Name (eg, YOUR name) []:server.musterschule.de Email Address []:postmaster@musterschule.de Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Das Zertifikat muss unter /etc/apache2/ssl
installiert werden.
-rw-r--r-- 1 root ssl-cert 1131 12. Jan 14:50 server.crt -r-------- 1 root ssl-cert 887 12. Jan 14:39 server.key -rw-r----- 1 root ssl-cert 2018 12. Jan 14:50 server.pem
In der Datei cups-files.conf wird auf das Zertifikat und den Schlüssel verwiesen. Dort müssen die Zeilen
# server certificate location ServerCertificate /etc/ssl/private/webserver/dynaccess.crt ServerKey /etc/ssl/private/webserver/dynaccess.key
angepasst werden. Momentan wird hier auf
/etc/ssl/private/webserver/...
verwiesen.
Abschließend muss der CUPS-Dämon mit
service cups restart
neu gestartet werden.
Das Zertifikat muss unter /etc/webmin
installiert werden.
Dazu werden Schlüssel und Zertifikat zunächst in einer Datei zusammengefasst:
cat miniserv.key miniserv.crt >miniserv.pem
und diese Datei dann mit den richtigen Rechten gespeichert. Die weiteren Dateien können dann gelöscht werden.
-rw------- 1 root root 1131 12. Jan 14:50 miniserv.pem
Der IPCOP akzeptiert normalerweise nur ein selbst erstelltes Zertifikat. Ein signiertes akzeptiert er nach folgendem Patch:
--- /usr/local/bin/httpscert.bak 2008-11-01 13:03:06.000000000 +0100 +++ /usr/local/bin/httpscert 2012-01-14 12:35:35.000000000 +0100 @@ -28,7 +28,7 @@ ;; read) if [ -f /etc/httpd/server.key -a -f /etc/httpd/server.crt -a -f /etc/httpd/server.csr ]; then - ISSUER=`openssl x509 -in /etc/httpd/server.crt -text -noout | grep Issuer | /usr/bin/cut -f2 -d '='` + ISSUER=`openssl x509 -in /etc/httpd/server.crt -noout -text|grep "Subject:" |cut -d\, -f5|cut -d\/ -f1|cut -d\= -f2` HOSTNAME=`/bin/hostname -f` if [ "$ISSUER" != "$HOSTNAME" ]; then echo "Certificate issuer '$ISSUER' is not the same as the hostname'$HOSTNAME'"
Das IPCOP-Zertifikat liegt unter /etc/httpd/
auf dem IPCOP. Es ist erstaunlicherweise von allen lesbar und es müssen alle drei Dateien, also server.key, server.csr und server.crt zur Verfügung stehen, andernfalls wird das Zertifikat gnadenlos neu erstellt. Dazu dient in rc.sysinit
der Befehl httpdcert new
an Stelle von httpscert read
.
Der Dialog lautet:
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [DE]: State or Province Name (full name) [Musterland]: Locality Name (eg, city) [Musterstadt]: Organization Name (eg, company) [Musterschule]: Organizational Unit Name (eg, section) []:Proxyserver Common Name (eg, YOUR name) []:ipcop.musterschule.de Email Address []:postmaster@musterschule.de Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Mit scp -P 222 server.* ipcop:/etc/httpd
die drei Dateien auf den IPCOP kopieren. Die Rechte lauten erstaunlicherweise:
-rw-r--r-- 1 root root 4225 2012-01-14 12:09 server.crt -rw-r--r-- 1 root root 936 2012-01-14 12:09 server.csr -rw-r--r-- 1 root root 887 2012-01-14 12:09 server.key
Mozilla Firefox benutzt einen eigenen Zertifikatspeicher, der für jeden Benutzer aus den Dateien cert8.db
, key3.db
und secmod.db
besteht. Dieser Speicher kann auf dem Server mit dem Programm certutil
aus dem Debian-Paket libnss3-tools
bearbeitet werden.
Das Zertifikat muss an mehreren Stellen installiert werden, weil die Mozilla-Datenbank an verschiedenen Stellen ist.
/etc/skel/Einstellungen/... /etc/skel/.mozilla/... /home/samba/progs/Voreinstellungen/...
Außerdem befindet sich in jedem User-Verzeichnis eine oder mehrere von diesen Datenbanken. Diese können am besten durch das Skript
/usr/local/bin/home_reinigen.sh
aktualisiert werden. Dazu werden folgende Zeilen eingefügt:
gruppe=`id --name -g $user` ... # Zertifikate verteilen for f in `find .mozilla/firefox/*/cert8.db Einstellungen/firefox/cert8.db`; do DIR=`dirname $f` echo " -> Mozilla-DB in Verzeichnis($DIR)" install -o $user -g $gruppe -m 600 /etc/skel/.mozilla/firefox/standard/cert8.db $DIR/cert8.db install -o $user -g $gruppe -m 600 /etc/skel/.mozilla/firefox/standard/key3.db $DIR/key3.db install -o $user -g $gruppe -m 600 /etc/skel/.mozilla/firefox/standard/secmod.db $DIR/secmod.db if [ -e $DIR/cert_override.txt ]; then rm -f $DIR/cert_override.txt; fi done;
Dazu wechsel man in das Verzeichnis mit der Datenbank und führt folgenden Befehl aus, um das Zertifikat hinzuzufügen:
certutil -d . -A -t "CT,c,c" -n "Musterschule_CA - Musterschule" -i /etc/ssl/certs/Musterschule_CA.pem