SSL
Erstellen der Zertifikate für sichere Verbindungen
Um eine verschlüsselte Verbindung zu erlauben müssen zuerst die nötigen Zertifikate (slapd_cert.pem) und Schlüssel (slapd_key.pem) erstellt werden.
Wird zusätzlich eine Certificate Authority benötigt so empfiehlt sich der Einsatz eines kleinen Tools, das im Paket openssl bereits enthalten ist. Mit dessen Hilfe lassen sich einfach Zertifikate und CAs erstellen und auch signieren.
Für den üblichen Einsatz müssen daran jedoch noch ein paar kleine Änderungen vorgenommen werden: Die ausgelieferte Version des Skriptes CA.sh verschlüsselt nämlich die erzeugten Dateien. Das bedeutet aber auch, dass bei jedem Zugriff auf diese Dateien ein Passwort eingegeben werden muss. Besonders ungünstig wirkt sich das beim Neustart des LDAP Servers aus - denn der wartet in diesem Fall auf die Eingabe des Passworts bevor er seinen Dienst aufnehmen kann. Um solche Probleme zu vermeiden füft man einfach die Option -nodes (Anmerkung: steht für noDES, also keine Verschlüsselung und hat mit Nodes nichts zu tun) an zwei Stellen im Skript ein:
...
-newcert)
# create a certificate
$REQ -new -nodes -x509 -keyout newreq.pem -out newreq.pem $DAYS
RET=$?
echo "Certificate (and private key) is in newreq.pem"
;;
-newreq)
# create a certificate request
$REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS
RET=$?
echo "Request (and private key) is in newreq.pem"
;;
...
linux ~# /usr/share/ssl/misc/CA.sh -newreq Generating a 1024 bit RSA private key .........................++++++ ............++++++ writing new private key to 'newreq.pem' ----- 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]:Germany Locality Name (eg, city) []:Erlangen Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linux Experts Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:mydomain.de Email Address []:root@mydomain.de Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Request (and private key) is in newreq.pem
Hinter diesem Aufruf verbirgt sich eigentlich folgendes openssl Kommando:
linux ~# openssl req -new -nodes -keyout newreq.pem -out newreq.pem -days 365
Erzeugen einer Certificate Authority (CA):
linux ~# /usr/share/ssl/misc/CA.sh -newca CA certificate filename (or enter to create) Making CA certificate ... Generating a 1024 bit RSA private key ..............++++++ ...++++++ writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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]:Germany Locality Name (eg, city) []:Erlangen Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linux Experts Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:mydomain.de Email Address []:root@mydomain.de
Auch in diesem Fall vereinfacht des Skript die Handhabung nur, openssl ist verrichtet nach wie vor die eigentlich Arbeit:
linux ~# openssl req -new -x509 -keyout demoCA/private/cakey.pem -out demoCA/cacert.pem -days 365
Während das Shell-Kommando den bnötigten Verzeichnisbaum automatisch erstellt,
demoCA/ demoCA/crl/ demoCA/certs/ demoCA/index.txt demoCA/serial demoCA/newcerts/ demoCA/cacert.pem demoCA/private/ demoCA/private/cakey.pem
muss man diesen bei der Verwendung von openssl vorher selbst anlegen:
linux ~# mkdir demoCA linux ~# mkdir demoCA/crl linux ~# mkdir demoCA/certs linux ~# mkdir demoCA/newcerts linux ~# mkdir demoCA/private linux ~# echo 01 > demoCA/serial linux ~# touch demoCA/index.txt
Um die erzeugten Schlüssel von der CA signieren zu lassen, gibt man einfach folgendes ein:
linux ~# /usr/share/ssl/misc/CA.sh -sign
Using configuration from /etc/ssl/openssl.cnf
7596:error:0E06D06C:configuration file routines:NCONF_get_string:no value:conf_lib.c:329:group=CA_default name=unique_subject
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Dec 28 13:15:08 2004 GMT
-nodes Not After : Dec 28 13:15:08 2005 GMT
Subject:
countryName = DE
stateOrProvinceName = Germany
localityName = Erlangen
organizationName = Linux Experts
commonName = mydomain.de
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
E8:4E:30:B9:50:B3:F9:42:B5:78:BE:B9:73:0C:2F:7F:33:4D:59:D1
X509v3 Authority Key Identifier:
keyid:18:F9:51:EF:F4:12:39:AE:C9:7E:E5:AB:00:1A:16:4F:CF:1D:C9:34
DirName:/C=DE/ST=Germany/L=Erlangen/O=Linux Experts/CN=mydomain.de
serial:00
Certificate is to be certified until Dec 28 13:15:08 2005 GMT (365 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
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=DE, ST=Germany, L=Erlangen, O=Linux Experts, CN=mydomain.de
Validity
Not Before: Dec 28 13:15:08 2004 GMT
Not After : Dec 28 13:15:08 2005 GMT
Subject: C=DE, ST=Germany, L=Erlangen, O=Linux Experts, CN=mydomain.de
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:bd:f1:c8:71:89:f7:e8:a6:dd:a3:e5:b3:87:0e:
ca:9b:de:fb:14:ac:ee:83:3f:d3:cf:67:b7:a9:56:
6b:e2:60:7b:c7:32:cb:4b:59:97:6a:d7:8d:32:e5:
55:b2:28:4f:a2:8f:91:fa:2c:50:3a:95:a1:30:eb:
dd:23:d6:03:2f:43:62:8d:cb:20:55:34:a4:bb:74:
da:a2:14:5d:fd:8f:d1:23:96:20:69:2d:6d:7c:d9:
a3:20:f6:76:1b:ec:38:34:b1:e9:8f:96:eb:aa:2e:
c8:c3:bb:21:e8:f9:73:e9:52:18:7d:d8:8d:e1:93:
b6:a2:f2:5a:b2:44:97:d0:b1
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
E8:4E:30:B9:50:B3:F9:42:B5:78:BE:B9:73:0C:2F:7F:33:4D:59:D1
X509v3 Authority Key Identifier:
keyid:18:F9:51:EF:F4:12:39:AE:C9:7E:E5:AB:00:1A:16:4F:CF:1D:C9:34
DirName:/C=DE/ST=Germany/L=Erlangen/O=Linux Experts/CN=mydomain.de
serial:00
Signature Algorithm: md5WithRSAEncryption
2f:65:5c:e6:c3:5c:28:f8:ae:7b:29:c6:37:1a:7b:39:9e:3d:
70:24:81:f0:36:56:b4:f8:e0:db:9f:5f:e8:da:ae:70:40:92:
8b:58:6f:47:31:2a:fc:78:39:20:32:fd:f1:64:51:32:44:92:
16:11:25:c5:de:74:25:53:c8:07:0d:6d:dc:63:7f:90:d5:14:
15:09:46:77:84:f3:c9:17:61:80:c6:c9:b7:c0:07:ea:f7:78:
3c:99:bf:db:42:67:95:33:fc:9c:7a:34:1f:ee:42:a6:5b:fc:
68:24:4d:67:a4:17:99:ad:8f:75:e3:22:b1:37:ae:3b:df:19:
7f:fc
-----BEGIN CERTIFICATE-----
MIIDPTCCAqagAwIBAgIBATANBgkqhkiG9w0BAQQFADBqMQswCQYDVQQGEwJERTEQ
MA4GA1UECBMHQmF2YXJpYTERMA8GA1UEBxMIRXJsYW5nZW4xFjAUBgNVBAoTDUxp
bnV4IEV4cGVydHMxHjAcBgNVBAMTFWVudGVycHJpc2UuZ2FsYXh5LmNvbTAeFw0w
NDEyMjgxMzE1MDhaFw0wNTEyMjgxMzE1MDhaMGoxCzAJBgNVBAYTAkRFMRAwDgYD
VQQIEwdCYXZhcmlhMREwDwYDVQQHEwhFcmxhbmdlbjEWMBQGA1UEChMNTGludXgg
RXhwZXJ0czEeMBwGA1UEAxMVZW50ZXJwcmlzZS5nYWxheHkuY29tMIGfMA0GCSqG
SIb3DQEBAQUAA4GNADCBiQKBgQC98chxiffopt2j5bOHDsqb3vsUrO6DP9PPZ7ep
VmviYHvHMstLWZdq140y5VWyKE+ij5H6LFA6laEw690j1gMvQ2KNyyBVNKS7dNqi
FF39j9EjliBpLW182aMg9nYb7Dg0semPluuqLsjDuyHo+XPpUhh92I3hk7ai8lqy
RJfQsQIDAQABo4HyMIHvMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5T
U0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBToTjC5ULP5QrV4vrlz
DC9/M01Z0TCBlAYDVR0jBIGMMIGJgBQY+VHv9BI5rsl+5asAGhZPzx3JNKFupGww
ajELMAkGA1UEBhMCREUxEDAOBgNVBAgTB0JhdmFyaWExETAPBgNVBAcTCEVybGFu
Z2VuMRYwFAYDVQQKEw1MaW51eCBFeHBlcnRzMR4wHAYDVQQDExVlbnRlcnByaXNl
LmdhbGF4eS5jb22CAQAwDQYJKoZIhvcNAQEEBQADgYEAL2Vc5sNcKPiueynGNxp7
OZ49cCSB8DZWtPjg259f6NqucECSi1hvRzEq/Hg5IDL98WRRMkSSFhElxd50JVPI
Bw1t3GN/kNUUFQlGd4TzyRdhgMbJt8AH6vd4PJm/20JnlTP8nHo0H+5Cplv8aCRN
Z6QXma2PdeMisTeuO98Zf/w=
-----END CERTIFICATE-----
Signed certificate is in newcert.pem
Wie nicht anders zu erwarten verbirgt sich auch dahinter nichts anderes als ein Aufruf von openssl:
linux ~# openssl ca -policy policy_anything -out newcert.pem -infiles newreq.pem
Hinweise
Bei allen Optionen sollte man darauf achten, dass der Common Name dem Namen der realen DNS Domain der Server entspricht. Sonst kann es zu sehr eigenartigem Verhalten beim verschlüsselten Verbindungsaufbau kommen
Wer sich die lästige und fehleranfällige Tipparbeit ersparen möchte, der kann die entsprechenden Werte auch als Grundeinstellung in die Datei /etc/ssl/openssl.cnf eintragen. Während der Ausführung der openssl-Kommandos braucht man dann die Defaults nur noch mit Return zu bestätigen.
... countryName_default = DE 0.organizationName_default = Linux Experts localityName_default = Erlangen stateOrProvinceName_default = Germany organizationalUnitName_default = commonName_default = mydomain.de ...
Einrichten des OpenLDAP Servers für sichere Verbindungen
Anschließend sollten die erzeugten Dateien noch passend benannt und an ihren Bestimmungsort kopiert werden:
linux ~# cp demoCA/cacert.pem /etc/ssl/certs/cacert.pem linux ~# cp newkey.pem /etc/openldap/slapd_key.pem linux ~# cp newcert.pem /etc/openldap/slapd_cert.pem
Danach können die Einstellungen für SSL Verbindungen des OpenLDAP Servers in der Datei /etc/openldap/slapd.conf eingetragen werden:
....
suffix "dc=mydomain,dc=de"
rootdn "cn=Manager,dc=mydomain,dc=de"
rootpw {SSHA}a3okzqzds1RUD9V5qkqoeIVqSTtN9Un2
...
#Specify ciphers
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+SSLv3
#TLS keyfile locations
TLSCACertificateFile /etc/ssl/certs/cacert.pem
TLSCertificateFile /etc/openldap/slapd_cert.pem
TLSCertificateKeyFile /etc/openldap/slapd_key.pem
...
Um das Passwort des LDAP Managers nicht unverschlüsselt ablegen zu müssen kann mit Hilfe des folgendes Kommandos einen Hash erzeugen:
linux ~# slappasswd
New password:
Re-enter new password:
{SSHA}a3okzqzds1RUD9V5qkqoeIVqSTtN9Un2
Zusätzlich sollte man den Zugriff auf den LDAP Server auch noch auf eine bestimmte Rechnergruppe einschränken, beispielsweise über den Portwrapper (/etc/hosts.allow):
... slapd : 192.168.0.0/255.255.255.0 127.0.0.1 ...
Jetzt kann der LDAP Server gestartet werden.
Einrichten eines OpenLDAP Clients für sichere Verbindungen
Bei OpenLDAP Clients werden die Einstellungen entweder in /etc/openldap/ldap.conf, ldaprc im aktuellen Verzeichnis, oder .ldaprc im Home des Benutzers abgelegt. Um LDAP Verbindungen nur zu authorisierten LDAP Servern zuzulassen, kann man auf eine Überprüfung des (vom Server erhaltenen) SSL Zertifikates bestehen. Dazu ist es aber notwendig, das Zertifikat der zugehörigen CA zu besitzen:
TLS_REQCERT demand TLS_CACERTDIR /etc/ssl/certs/ # alternativ auch nur ein spezielles Zertifikat #TLS_CACERT /etc/ssl/certs/cacert.pem




