Wenn Sie im WWW einen Serverdienst aufsetzen wollen, welcher verschlüsselte SSL oder TLS-Verbindungen anbietet.
Um eine mit SSL/TLS abgesicherte Verbindung anzubieten, benötigen Sie jedoch ein Serverzertifikat. Dieses muss von einer Zertifizierungsstelle (Certification Authority oder kurz CA) signiert sein. Ein gültiges Serverzertifikat, welches von einer offiziellen Zertifikations-Stelle signiert ist, ist leider nicht kostenlos. Meist werden jährliche Kosten in Höhe hunderten von Euros fällig.
Unter Linux kann man mit Bordmitteln eine eigene CA aufsetzen und ein selbst Zertifikate erstellen und signieren. Das ist ein Vorgang von wenigen Minuten.
Der einzige Unterschied zu einem von einer anerkannten Stelle signierten Zertifikat ist, dass der Client (Browser, Email-Programm, usw.) eine Warnung ausgeben wird, dass er die CA nicht kennt.
Der Benutzer muss dann einmal bestätigen und kann das Zertifikat trotzdem akzeptieren. Aber auch dies kann man umgehen, indem man kostenlos Mitglied bei CAcert wird, und so kostenlos an Server-Zertifikate kommt.
Für die Verwaltung der Zertifikate und im übrigen auch für die Verschlüsselung der Verbindungen mit SSL und TLS kommt unter Linux fast immer OpenSSL zum Einsatz. Meist ist dieses Packet auf Ihrem Server bereits vorinstalliert. Wenn nicht, müssen Sie das Paket openssl nachinstallieren.
Legen Sie zunächst ein Verzeichnis an, in dem Sie das Zertifikat ablegen wollen.
root@linux# mkdir /root/cacert
root@linux# cd /root/cacert
Die Gültigkeit setzen wir mit 10 Jahren bewusst sehr hoch an. Läuft die CA aus, so werden nämlich auch alle damit signierten Serverzertifikate ungültig.
Die CA enthält einen geheimen Schlüssel, welcher automatisch erzeugt und in der Datei cakey.pem abgelegt wird.
Das CA-Zertifikat wird nach CAcert.pem geschrieben.
Der folgende Befehl erzeugt das einen Schlüssel für das Zertifikat mit einer Länge von 2048 Bit:
root@linux# openssl req -new -x509 -newkey rsa:2048 -keyout cakey.pem -out CAcert.pem -days 3650
Generating a 2048 bit RSA private key
………………………..
………………………..
………………………..
………………………..
…….. ………………..
…………+++…………..
………………………..
………………………..
+++ writing new private key to ‘cakey.pem’
Wer den geheimen Schlüssel der CA kennt, kann damit beliebige Serverzertifikate signieren. Deshalb wird diese Schlüsseldatei nicht im Klartext auf der Festplatte abgelegt, sondern mit einer Passphrase verschlüsselt. Diese Passphrase benötigen Sie immer dann, wenn Sie mit der CA neue Zertifikate ausstellen wollen:
Enter PEM pass phrase: abcdefg
Verifying - Enter PEM pass phrase: abcdefg
Nun werden Sie gebeten, Daten einzugeben, welche die CA identifizieren. Diese werden dem Client angezeigt, wenn er aufgefordert wird, das Zertifikat zu akzeptieren oder abzulehnen. Der Code für Deutschland ist DE. Wenn Sie ein Feld leerlassen möchten, so geben Sie einen Punkt ein. Ansonsten wird der in eckigen Klammern stehende Defaultwert eingetragen:
-—-
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)[AU]: DE
State or Province Name (full name)[Some-State]:.
Locality Name (eg, city) []:Berlin
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Meine AG
Organizational Unit Name (eg, section) []:.
Das Feld Common Name (CN) ist hier der offizielle Name der Zertifizierungsstelle.
Für Ihre eigene CA können Sie einfach Ihren eigenen Namen eintragen:
Common Name (eg, YOUR name)
[]: Adam Hinz Email Address
[]: adam@hinzag.eu
Fertig. Folgende zwei Dateien sind entstanden:
root@linux# ls -lisa
insgesamt 2
drwxr-xr-x 2 root root 112 2006-04-30 12:08 .
drwx—— 12 root root 600 2006-04-30 11:54 ..
-rw-r–r– 1 root root 1212 2006-04-30 12:08 CAcert.pem
-rw-r–r– 1 root root 963 2006-04-30 12:08 cakey.pem
Vorsichtshalber sollten Sie die Rechte so setzen, dass die Schlüsseldatei nur für root lesbar ist:
root@linux# chmod 600 cakey.pem
Sie können nun ausprobieren, ob sie den Schlüssel mit der Passphrase wieder öffnen können:
root@linux# openssl rsa -in cakey.pem -noout -text
Enter pass phrase for cakey.pem: abcdefg
Private-Key: (1024 bit) modulus:
00:d5:a5:37:51:e9:d9:fa:e3:97:e7:46:b2:88:1a:
cf:b7:3a:89:da:a9:63:9f:44:b3:83:cf:0d:70:7d:
68:cd:2d:f9:29:4d:96:3d:d8:6c:5d:9f:79:8a:07:
b5:46:80:47:76:14:ae:2b:8b:3e:35:5c:ab:15:34:
33:d9:63:2e:7f:08:4b:ec:77:db:02:45:f8:c7:86:
68:cd:2d:f9:29:4d:96:3d:d8:6c:5d:9f:79:8a:04:
usw…
Nachdem wir nun eine eigene CA haben, kann diese nun endlich für unseren Server ein Zertifikat herausgeben. Dazu erzeugen wir zunächst einen 2048 Bit langen RSA Schlüssel, der mit AES 128 verschlüsselt auf der Platte abgelegt wird (ja wirklich, auch hier wieder ein verschlüsselter Schlüssel). Die Passphrase muss diesmal nicht sonderlich geheim sein, da wir sie ohnehin im Anschluss wieder entfernen werden. OpenSSL lässt allerdings keine leere Phrase zu:
root@linux# openssl genrsa -out serverkey.pem -aes128 2048 -days 3650
Generating RSA private key, 2048 bit long modulus
….+++
…………………………………+++
e is 65783 (0x10000)
Enter pass phrase for serverkey.pem: abcdefg
Verifying - Enter pass phrase for serverkey.pem: abcdefg
So. Nun entfernen wir die Passphrase wieder. Warum? Der Serverdienst (Apache, Cyrus, etc.) muss schließlich in der Lage sein, den Schlüssel ohne Ihr Zutun zu lesen. Oder wollen Sie bei jedem Booten des Servers ein Passwort eingeben müssen?
root@linux# openssl rsa -in serverkey.pem -out serverkey.pem
Enter pass phrase for serverkey.pem: abcdefg writing RSA key
Der nächste Schritt zum eigenen Zertifikat ist ein CSR. Dies muss dann nur noch von der CA signiert werden. Hier sind wieder Angaben analog zum Erstellen der CA nötig, was oft Verwirrung stiftet. Die allgemeinen Daten kann man ggfl. gleich wie oben eingeben:
root@linux# openssl req -new -key serverkey.pem -out req.pem -nodes
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) [AU]: DE
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:Berlin
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Meine AG
Organizational Unit Name (eg, section) []:.
ACHTUNG, jetzt kommt das Wichtige:
Beim Serverzertifikat ist der Common Name von entscheidender Bedeutung. Hier muss der DNS-Name stehen, unter dem der Client den Server anspricht!
Wird das Zertifikat für eine HTTPS-Verbindung zu lxu.io verwendet, so muss der Common Name eben genau lxu.io heißen.
Anderfalls wird der Browser das Zertifikat nicht akzeptieren, da er davon ausgehen muss, auf dem falschen Server gelandet zu sein.
Common Name (eg, YOUR name) []: lxu.io
Email Address []: adam-email@lxu.io
Weitere Optionen kann man einfach leer lassen:
A challenge password []:
An optional company name []:
Mittlerweile tummeln sich schon vier Dateien in unserem Verzeichnis:
root@linux# ls -lisa
insgesamt 4
drwxr-xr-x 2 root root 168 2009-02-30 12:20 .
drwx—— 12 root root 600 2009-02-30 11:50 ..
-rw-r–r– 1 root root 1212 2009-02-30 12:07 CAcert.pem
-rw——- 1 root root 963 2009-02-30 12:09 cakey.pem
-rw-r–r– 1 root root 1017 2009-02-30 12:19 req.pem
-rw-r–r– 1 root root 1679 2009-02-30 12:11 serverkey.pem
Leider kann man bei OpenSSL nicht alle Daten als Kommandozeilenargumente übergeben.
Einige Einstellungen muss man lästigerweise in der Datei /etc/ssl/openssl.cnf ändern, bevor man signieren kann.
Öffnen Sie diese Datei und passen Sie folgende Zeilen in der Sektion [ CA_default ] an:
mcedit /etc/ssl/openssl.cnf
dir = . # Where everything is kept
new_certs_dir = $dir # default place for new certs
private_key = $dir/cakey.pem # The private key
RANDFILE = $dir/.rand # private random number file
default_days = 3650 # how long to certify for
Das Feld default_days ist auf 365 Tage voreingestellt und gibt die Gültigkeit des Zertifikates an. Abgelaufene Zertifikate sind im Übrigen ein sehr häufiges Problem.
Wenn es soweit ist, kennt sich damit nämlich schon lange keiner mehr aus. Deswegen können Sie wie im Beispiel angegeben die Lebensdauer z.B. auf 10 Jahre heraufsetzen.
Wenn Sie beim Serverzertifikat keinen Bundesstaat angegeben haben, benötigen Sie noch folgende Änderung unter
[ policy_match ]:
stateOrProvinceName = optional
Nun muss man noch einige Dateien anlegen:
root@linux# echo 01 > serial
root@linux# touch index.txt
Kommen wir zum feierlichen Abschluss: Unsere CA signiert nun das Zertifikat:
root@linux# openssl ca -in req.pem -notext -out servercert.pem
Enter pass phrase for ./cakey.pem: abcdefg
…
Certificate is to be certified until Apr 27 10:45:36 2016 GMT (3650 days)
Sign the certificate? [y/n]: y 1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated
Wohin sie die Zertifikate installieren, hängt natürlich vom jeweiligen Serverdienst ab.
Was allen gemeinsam ist: Sie benötigen nur die Dateien CAcert.pem, servercert.pem und serverkey.pem.
Die Datei cakey.pem wird nicht benötigt. Sie sollte am besten auch nicht auf dem Server liegen sondern an einer sicheren Stelle auf einem anderen Rechner.
Mit OpenSSL und CAcert ein X.509-Zertifikat für verschiedene Anwendungen erstellen oder aktualisieren
Dieser Artikel beschäftigt sich mit dem CAcert Zertifikat. Darin möchte ich meine Erfahrungen sammeln und diese euch zur verfügung stellen. CAcert ist eine gemeinschaftsbetriebene, nicht-kommerzielle Zertifizierungsstelle (Certification Authority, Root-CA oder kurz CA), die kostenfrei X.509-Zertifikate für verschiedene Einsatzgebiete ausstellt. Damit soll eine Alternative zu den kommerziellen Root-CAs geboten werden, die zum Teil recht hohe Preise für ihre Server-Zertifikate erheben, und daher eher für kommerzielle Server-Betreiber geeignet sind.
mkdir /etc/ssl-CAcert/
mkdir /etc/ssl-CAcert/apache/
mkdir /etc/ssl-CAcert/lighttpd/
mkdir /etc/ssl-CAcert/mail/
mkdir /etc/ssl-CAcert/proftpd/
mkdir /etc/ssl-CAcert/ldap/
OpenSSL Config erstellen
touch /etc/ssl-CAcert/openssl.conf
mcedit /etc/ssl-CAcert/openssl.conf
RANDFILE = $ENV::HOME/.rnd
[ req ]
default_bits = 1024
default_keyfile = keyfile.pem
distinguished_name = req_distinguished_name
attributes = req_attributes prompt = no
output_password =
[ req_distinguished_name ]
C = DE # Ihr Heimatland
ST = BUNDESLAND # Ihr Bundesland
L = STADT # Ihre Stadt
O = FIRMA # Ihre Firma
OU = ORGANISATION # Ihre Organisation
CN = DOMAIN.TLD # Wichtig - ihre Webseite
emailAddress = ADMIN@DOMAIN.TLD # Ihre e-mail Addresse
[ req_attributes ]
challengePassword = Beliebiges Passwort
openssl genrsa -des3 -out /etc/ssl/certs/apache_server.key 2048
openssl req -new -days 1825 -key /etc/ssl/certs/apache_server.key
-out /etc/ssl/certs/apache_server.csr
-config /etc/ssl-CAcert/openssl.conf
openssl rsa -in /etc/ssl/certs/apache_server.key -out /etc/ssl/certs/apache_private.key.decrypted
cat /etc/ssl/certs/apache_server.csr
-—-BEGIN CERTIFICATE REQUEST—–
.
.
-—-END CERTIFICATE REQUEST—–
Nach ein paar Sekunden wird das CAcert Zertifikat angezeigt:
-—-BEGIN CERTIFICATE——
.
.
-—-END CERTIFICATE—–
Nun eine neue Datei mit den Namen apache_server.crt erstellen und das Zertifikat von CAcert dort hinein kopieren:
mcedit /etc/ssl/certs/apache_server.crt
Nun die Zertifikate und Schlüssel in das /etc/ssl-CAcert/apache Verzeichnis kopieren:
cp /etc/ssl/certs/apache_server.key /etc/ssl-CAcert/apache/
cp /etc/ssl/certs/apache_server.csr /etc/ssl-CAcert/apache/
cp /etc/ssl/certs/apache_server.crt /etc/ssl-CAcert/apache/
cp /etc/ssl/certs/apache_private.key.decrypted /etc/ssl-CAcert/apache/
Einstellungen von Apache-SSL in /etc/apache-ssl/httpd.conf vornehmen:
SSLCertificateFile /etc/ssl-CAcert/apache/apache_server.crt
SSLCertificateKeyFile /etc/ssl-CAcert/apache/apache_private.key.decrypted
Nun noch Apache-SSL neustarten:
/etc/init.d/apache-ssl restart
Folgende Felder ausfüllen und die Dateien hochladen:
Zertifikat
Einstellungen
Zertifikatdateien hochladen
* Pflichtfelder
Als eine gute Alternative zu dem Ressourcen lastigen Apache-SSL Server bietet sich Lighttpd an.
cp /etc/ssl/certs/apache_server.crt /etc/ssl-CAcert/lighttpd/lighttpd.crt
cp /etc/ssl/certs/apache_private.key.decrypted /etc/ssl-CAcert/lighttpd/lighttpd.key.decrypted
Jetzt noch das Class 3 - CAcert Zertifikat herunterladen:
wget –no-check-certificate https://www.CAcert.org/certs/root.crt -O /etc/ssl-CAcert/lighttpd/CAcert.crt
chmod a=r /etc/ssl-CAcert/lighttpd/CAcert.crt
Lighttpd brauch eine PEM Datei. Dazu wird die crt und die key Datei in diese eingefügt:
cat /etc/ssl-CAcert/lighttpd/lighttpd.crt /etc/ssl-CAcert/lighttpd/lighttpd.key.decrypted > /etc/ssl-CAcert/lighttpd/lighttpd.pem
Jetzt noch die 10-ssl.conf von Lighttpd bearbeiten:
mcedit /etc/lighttpd/conf-enabled/10-ssl.conf
ssl.engine = “enable” ssl.use-sslv2 = “disable”
ssl.cipher-list = “ALL:!ADH:!LOW:!SSLv2:!EXP:+HIGH:+MEDIUM”
ssl.pemfile = “/etc/ssl-CAcert/lighttpd/lighttpd.pem”
ssl.ca-file = “/etc/ssl-CAcert/lighttpd/CAcert.crt”
Jetzt kann Lighttpd neu gestartet werden:
/etc/init.d/lighttpd force-reload
Um Postfix mit SSL zu benutzen, können die Zertifikate und Schlüssel, welche eben generiert wurden, verwendet werden.
Dazu werden einfach folgende Dateien nach /etc/ssl-CAcert/mail/ kopiert.
cp /etc/ssl/certs/apache_server.key /etc/ssl-CAcert/mail/mail.key
cp /etc/ssl/certs/apache_server.csr /etc/ssl-CAcert/mail/mail.csr
cp /etc/ssl/certs/apache_server.crt /etc/ssl-CAcert/mail/mail.crt
cp /etc/ssl/certs/apache_private.key.decrypted /etc/ssl-CAcert/mail/mail.key.decrypted
Jetzt wird noch das root Zertifikat von CAcert benötigt:
wget –no-check-certificate https://www.CAcert.org/certs/root.crt -O /etc/ssl-CAcert/mail/CAcert.crt
chmod a=r /etc/ssl-CAcert/mail/CAcert.crt
Nun muss nur noch die main.cf Config Datei von Postfix angepasst werden:
mcedit /etc/postfix/main.cf
smtp_tls_key_file = /etc/ssl-CAcert/mail/mail.key.decrypted
smtp_tls_cert_file = /etc/ssl-CAcert/mail/mail.crt
smtp_tls_CAfile = /etc/ssl-CAcert/mail/CAcert.crt
smtpd_tls_key_file = /etc/ssl-CAcert/mail/mail.key.decrypted
smtpd_tls_cert_file = /etc/ssl-CAcert/mail/mail.crt
smtpd_tls_CAFile = /etc/ssl-CAcert/mail/CAcert.crt
Nachdem abspeichern muss Postfix neu gestartet werden, damit die Ändernungen wirksam werden.
/etc/init.d/postfix restart
Courier POP3-SSL braucht eine PEM Datei, welche aus der .key Datei, sowie der beglaubigten CRT Datei von CAcert besteht.
Um für Courier ein Zertifikat zu erstellen wird nicht unbedingt ein CAcert CRT benötigt.
Aufgrund dessen habe ich auch eine HowTo ohne CAcert gepostet.
Weiter unten steht dann die Anleitung für eine PEM mit CAcert CRT.
Als nächstes wird Courier-POP3 SSL beigebracht. Dazu wird die Datei pop3d.cnf bearbeitet:
mcedit /etc/courier/pop3d.cnf
RANDFILE = /usr/lib/courier/pop3d.rand
[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
[ req_dn ]
C=DE
ST=BUNDESLAND
L=STADT
O=IRGENDWAS-REINSCHREIBEN
OU=IRGENDWAS-REINSCHREIBEN
CN=domain.tld #Wichtig
Falls schonmal ein Zertifikat erstellt worden ist, so lösche es nun:
rm /usr/lib/courier/pop3d.pem
Jetzt ist es Zeit ein Zertifikat zu erstellen:
mkpop3dcert
Courier nun neu starten mit:
/etc/init.d/courier-pop-ssl restart
PEM Datei erstellen:
cat /etc/ssl-CAcert/mail/mail.key.decrypted /etc/ssl-CAcert/mail/mail.crt > /etc/ssl-CAcert/mail/mail.pem
Nun noch in der /etc/courier/pop3dssl den Pfad zur eben erstellten PEM Datei verweisen:
mcedit /etc/courier/pop3d-ssl TLS_CERTFILE=/etc/ssl-CAcert/mail/mail.pem
Courier nun neu starten mit:
/etc/init.d/courier-pop-ssl restart
Courier IMAP-SSL brauch eine PEM Datei, welche aus der key Datei, sowie der beglaubigten CRT Datei von CAcert besteht.
Um für Courier ein Zertifikat zu erstellen wird nicht unbedingt ein CAcert CRT benötigt.
Aufgrund dessen habe ich auch eine HowTo ohne CAcert gepostet.
Weiter unten steht dann die HowTo Anleitung für eine PEM mit CAcert CRT.
Als nächstes wird Courier-IMAP SSL beigebracht. Dazu wird die Datei imapd.cnf bearbeitet:
mcedit /etc/courier/imapd.cnf
RANDFILE = /usr/lib/courier/imapd.rand
[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
[ req_dn ]
C=DE
ST=BUNDESLAND
L=STADT
O=IRGENDWAS-REINSCHREIBEN
OU=IRGENDWAS-REINSCHREIBEN
CN=domain.tld #Wichtig
Falls schonmal ein Zertifikat erstellt worden ist, so lösche es nun:
rm /usr/lib/courier/imapd.pem
Jetzt ist es Zeit ein Zertifikat zu erstellen:
mkimapdcert
Das ganze sieht dann so aus:
mkimapdcert Generating a 1024 bit RSA private key
…………………………….++++++
……………++++++
writing new private key to ‘/usr/lib/courier/imapd.pem’
-—-
1024 semi-random bytes loaded
Generating DH parameters, 512 bit long safe prime, generator 2
This is going to take a long time
………+…………………………..
Jetzt kann courier-imap-ssl neu gestartet werden:
/etc/init.d/courier-imap-ssl restart
PEM Datei erstellen:
cat /etc/ssl-CAcert/mail/mail.key.decrypted /etc/ssl-CAcert/mail/mail.crt > /etc/ssl-CAcert/mail/mail.pem
Als nächstes wird Courier-IMAP SSL mit CAcert CRT beigebracht.
Nun noch in der /etc/courier/imapd-ssl den Pfad zur eben erstellten PEM Datei verweisen:
mcedit /etc/courier/imapd-ssl
TLS_CERTFILE=/etc/ssl-CAcert/mail/mail.pem
TLS_TRUSTCERTS=/etc/ssl-CAcert/mail/mail.crt
TLS_VERIFYPEER=none
Courier nun neu starten mit:
/etc/init.d/courier-imap-ssl restart
Damit die Adressbücher sicher verwaltet werden können, sollte ldap natürlich auch unter SSL betrieben werden.
Dazu sind nur wenige Schritte nötig, da die Zertifikate bereits erstellt wurden.
cp /etc/ssl-CAcert/mail/mail.key.decrypted /etc/ssl-CAcert/ldap/ldap.key.decrypted
cp /etc/ssl-CAcert/mail/mail.crt /etc/ssl-CAcert/ldap/ldap.crt
cp /etc/ssl-CAcert/mail/CAcert.crt /etc/ssl-CAcert/ldap/CAcert.crt
Ohne Cacert kann das Zertifikat folgendermaßen erstellt werden:
(TLSCAcertificateFile wird hierbei nicht benötigt)
openssl req -new -x509 -nodes -out /etc/ssl-CAcert/ldap/slapdcert.pem -keyout /etc/ssl-CAcert/ldap/slapdkey.pem -days 365
Als nächstes Ldap sagen, wo genau die Zertifikate liegen:
mcedit /etc/ldap/slapd.conf
TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCAcertificateFile “/etc/ssl-CAcert/ldap/CAcert.crt”
TLSCertificateFile “/etc/ssl-CAcert/ldap/ldap.crt”
TLSCertificateKeyFile “/etc/ssl-CAcert/ldap/ldap.key.decrypted”
loglevel 256
#TLSVerifyClient demand
#TLSVerifyClient never
Die Datei ldap.conf muss auch angepasst werden:
mcedit /etc/ldap/ldap.conf
URI ldaps://example.org
TLS_REQCERT demand
TLS_CACERTDIR /etc/ssl/certs/
Nun kann slapd neu gestartet werden:
/etc/init.d/slapd restart