1 <?xml version="1.0" encoding="iso-8859-1"?>
2 <!DOCTYPE chapter PUBLIC "-//Samba-Team//DTD DocBook V4.2-Based Variant V1.0//EN" "http://www.samba.org/samba/DTD/samba-doc">
3 <chapter id="ch-ldap-tls">
6 <pubdate>July 8, 2005</pubdate>
8 <title>LDAP and Transport Layer Security</title>
10 <sect1 id="s1-intro-ldap-tls">
11 <title>Introduction</title>
14 <indexterm><primary>Transport Layer Seccurity, TLS</primary><secondary>Introduction</secondary></indexterm>
15 <indexterm><primary>ACL</primary></indexterm>
16 Up until now, we have discussed the straightforward configuration of <trademark>OpenLDAP</trademark>,
17 with some advanced features such as ACLs. This does not however, deal with the fact that the network
18 transmissions are still in plain text. This is where <firstterm>Transport Layer Security (TLS)</firstterm>
23 <indexterm><primary>RFC 2830</primary></indexterm>
24 <trademark>OpenLDAP</trademark> clients and servers are capable of using the Transport Layer Security (TLS)
25 framework to provide integrity and confidentiality protections in accordance with <ulink
26 url="http://rfc.net/rfc2830.html">RFC 2830</ulink>; <emphasis>Lightweight Directory Access Protocol (v3):
27 Extension for Transport Layer Security.</emphasis>
31 <indexterm><primary>X.509 certificates</primary></indexterm>
32 TLS uses X.509 certificates. All servers are required to have valid certificates, whereas client certificates
33 are optional. We will only be discussing server certificates.
37 <indexterm><primary>DN</primary></indexterm>
38 <indexterm><primary>CN</primary></indexterm>
39 <indexterm><primary>FQDN</primary></indexterm>
40 The DN of a server certificate must use the CN attribute to name the server, and the CN must carry the
41 server's fully qualified domain name (FQDN). Additional alias names and wildcards may be present in the
42 <option>subjectAltName</option> certificate extension. More details on server certificate names are in <ulink
43 url="http://rfc.net/rfc2830.html">RFC2830</ulink>.
47 We will discuss this more in the next sections.
52 <sect1 id="s1-config-ldap-tls">
53 <title>Configuring</title>
56 <indexterm><primary>Transport Layer Seccurity, TLS</primary><secondary>Configuring</secondary></indexterm>
57 Now on to the good bit.
60 <sect2 id="s1-config-ldap-tls-certs">
61 <title>Generating the Certificate Authority</title>
64 <indexterm><primary>Certificate Authority</primary><see>CA</see></indexterm>
65 In order to create the relevant certificates, we need to become our own Certificate Authority (CA).
66 <footnote><para>We could however, get our generated server certificate signed by proper CAs, like <ulink
67 url="http://www.thawte.com/">Thawte</ulink> and <ulink url="http://www.verisign.com/">VeriSign</ulink>, which
68 you pay for, or the free ones, via <ulink url="http://www.cacert.org/">CAcert</ulink>
69 </para></footnote> This is necessary, so we can sign the server certificate.
73 <indexterm><primary>OpenSSL</primary></indexterm>
74 We will be using the <ulink url="http://www.openssl.org">OpenSSL</ulink> <footnote><para>The downside to
75 making our own CA, is that the certificate is not automatically recognized by clients, like the commercial
76 ones are.</para></footnote> software for this, which is included with every great <trademark
77 class="registered">Linux</trademark> distribution.
81 TLS is used for many types of servers, but the instructions<footnote><para>For information straight from the
82 horse's mouth, please visit <ulink
83 url="http://www.openssl.org/docs/HOWTO/">http://www.openssl.org/docs/HOWTO/</ulink>; the main OpenSSL
84 site.</para></footnote> presented here, are tailored for &OL;.
88 The <emphasis>Common Name (CN)</emphasis>, in the following example, <emphasis>MUST</emphasis> be
89 the fully qualified domain name (FQDN) of your ldap server.
93 First we need to generate the CA:
96 &rootprompt; mkdir myCA
99 Move into that directory:
105 Now generate the CA:<footnote><para>Your <filename>CA.pl</filename> or <filename>CA.sh</filename> might not be
106 in the same location as mine is, you can find it by using the <command>locate</command> command, i.e.,
107 <command>locate CA.pl</command>. If the command complains about the database being too old, run
108 <command>updatedb</command> as <emphasis>root</emphasis> to update it.</para></footnote>
111 &rootprompt; /usr/share/ssl/misc/CA.pl -newca
112 CA certificate filename (or enter to create)
114 Making CA certificate ...
115 Generating a 1024 bit RSA private key
116 .......................++++++
117 .............................++++++
118 writing new private key to './demoCA/private/cakey.pem'
119 Enter PEM pass phrase:
120 Verifying - Enter PEM pass phrase:
122 You are about to be asked to enter information that will be incorporated
123 into your certificate request.
124 What you are about to enter is what is called a Distinguished Name or a DN.
125 There are quite a few fields but you can leave some blank
126 For some fields there will be a default value,
127 If you enter '.', the field will be left blank.
129 Country Name (2 letter code) [AU]:AU
130 State or Province Name (full name) [Some-State]:NSW
131 Locality Name (eg, city) []:Sydney
132 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Abmas
133 Organizational Unit Name (eg, section) []:IT
134 Common Name (eg, YOUR name) []:ldap.abmas.biz
135 Email Address []:support@abmas.biz
141 There are some things to note here.
147 You <emphasis>MUST</emphasis> remember the password, as we will need
148 it to sign the server certificate..
154 The <emphasis>Common Name (CN)</emphasis>, <emphasis>MUST</emphasis> be the
155 fully qualified domain name (FQDN) of your ldap server.
162 <sect2 id="s1-config-ldap-tls-server">
163 <title>Generating the Server Certificate</title>
166 Now we need to generate the server certificate:
169 &rootprompt; openssl req -new -nodes -keyout newreq.pem -out newreq.pem
170 Generating a 1024 bit RSA private key
172 ........................................................++++++
173 writing new private key to 'newreq.pem'
175 You are about to be asked to enter information that will be incorporated
176 into your certificate request.
177 What you are about to enter is what is called a Distinguished Name or a DN.
178 There are quite a few fields but you can leave some blank
179 For some fields there will be a default value,
180 If you enter '.', the field will be left blank.
182 Country Name (2 letter code) [AU]:AU
183 State or Province Name (full name) [Some-State]:NSW
184 Locality Name (eg, city) []:Sydney
185 Organization Name (eg, company) [Internet Widgits Pty Ltd]:Abmas
186 Organizational Unit Name (eg, section) []:IT
187 Common Name (eg, YOUR name) []:ldap.abmas.biz
188 Email Address []:support@abmas.biz
190 Please enter the following 'extra' attributes
191 to be sent with your certificate request
192 A challenge password []:
193 An optional company name []:
199 Again, there are some things to note here.
205 You should <emphasis>NOT</emphasis> enter a password.
211 The <emphasis>Common Name (CN)</emphasis>, <emphasis>MUST</emphasis> be
212 the fully qualified domain name (FQDN) of your ldap server.
218 Now we sign the certificate with the new CA:
221 &rootprompt; /usr/share/ssl/misc/CA.pl -sign
222 Using configuration from /etc/ssl/openssl.cnf
223 Enter pass phrase for ./demoCA/private/cakey.pem:
224 Check that the request matches the signature
227 Serial Number: 1 (0x1)
229 Not Before: Mar 6 18:22:26 2005 EDT
230 Not After : Mar 6 18:22:26 2006 EDT
233 stateOrProvinceName = NSW
234 localityName = Sydney
235 organizationName = Abmas
236 organizationalUnitName = IT
237 commonName = ldap.abmas.biz
238 emailAddress = support@abmas.biz
240 X509v3 Basic Constraints:
243 OpenSSL Generated Certificate
244 X509v3 Subject Key Identifier:
245 F7:84:87:25:C4:E8:46:6D:0F:47:27:91:F0:16:E0:86:6A:EE:A3:CE
246 X509v3 Authority Key Identifier:
247 keyid:27:44:63:3A:CB:09:DC:B1:FF:32:CC:93:23:A4:F1:B4:D5:F0:7E:CC
248 DirName:/C=AU/ST=NSW/L=Sydney/O=Abmas/OU=IT/
249 CN=ldap.abmas.biz/emailAddress=support@abmas.biz
252 Certificate is to be certified until Mar 6 18:22:26 2006 EDT (365 days)
253 Sign the certificate? [y/n]:y
256 1 out of 1 certificate requests certified, commit? [y/n]y
257 Write out database with 1 new entries
259 Signed certificate is in newcert.pem
265 That completes the server certificate generation.
270 <sect2 id="s1-config-ldap-tls-install">
271 <title>Installing the Certificates</title>
274 Now we need to copy the certificates to the right configuration directories,
275 rename them at the same time (for convenience), change the ownership and
276 finally the permissions:
279 &rootprompt; cp demoCA/cacert.pem /etc/openldap/
280 &rootprompt; cp newcert.pem /etc/openldap/servercrt.pem
281 &rootprompt; cp newreq.pem /etc/openldap/serverkey.pem
282 &rootprompt; chown ldap.ldap /etc/openldap/*.pem
283 &rootprompt; chmod 640 /etc/openldap/cacert.pem;
284 &rootprompt; chmod 600 /etc/openldap/serverkey.pem
290 Now we just need to add these locations to <filename>slapd.conf</filename>,
291 anywhere before the <option>database</option> declaration as shown here:
294 TLSCertificateFile /etc/openldap/servercrt.pem
295 TLSCertificateKeyFile /etc/openldap/serverkey.pem
296 TLSCACertificateFile /etc/openldap/cacert.pem
302 Here is the declaration and <filename>ldap.conf</filename>:
303 <filename>ldap.conf</filename>
306 TLS_CACERT /etc/openldap/cacert.pem
312 That's all there is to it. Now on to <xref linkend="s1-test-ldap-tls"></xref>
319 <sect1 id="s1-test-ldap-tls">
320 <title>Testing</title>
323 <indexterm><primary>Transport Layer Security, TLS</primary><secondary>Testing</secondary></indexterm>
324 This is the easy part. Restart the server:
327 &rootprompt; /etc/init.d/ldap restart
328 Stopping slapd: [ OK ]
329 Checking configuration files for slapd: config file testing succeeded
330 Starting slapd: [ OK ]
333 Then, using <command>ldapsearch</command>, test an anonymous search with the
334 <option>-ZZ</option><footnote><para>See <command>man ldapsearch</command></para></footnote> option:
337 &rootprompt; ldapsearch -x -b "dc=ldap,dc=abmas,dc=biz" \
338 -H 'ldap://ldap.abmas.biz:389' -ZZ
341 Your results should be the same as before you restarted the server, for example:
344 &rootprompt; ldapsearch -x -b "dc=ldap,dc=abmas,dc=biz" \
345 -H 'ldap://ldap.abmas.biz:389' -ZZ
350 # base <> with scope sub
351 # filter: (objectclass=*)
356 dn: dc=ldap,dc=abmas,dc=biz
357 objectClass: dcObject
358 objectClass: organization
362 # Manager, ldap.abmas.biz
363 dn: cn=Manager,dc=ldap,dc=abmas,dc=biz
364 objectClass: organizationalRole
368 dn: sambaDomainName=ABMAS,dc=ldap,dc=abmas,dc=biz
369 sambaDomainName: ABMAS
370 sambaSID: S-1-5-21-238355452-1056757430-1592208922
371 sambaAlgorithmicRidBase: 1000
372 objectClass: sambaDomain
373 sambaNextUserRid: 67109862
374 sambaNextGroupRid: 67109863
377 If you have any problems, please read <xref linkend="s1-int-ldap-tls"></xref>
382 <sect1 id="s1-int-ldap-tls">
383 <title>Troubleshooting</title>
386 <indexterm><primary>Transport Layer Security, TLS</primary><secondary>Troubleshooting</secondary></indexterm>
387 The most common error when configuring TLS, as I have already mentioned numerous times, is that the
388 <emphasis>Common Name (CN)</emphasis> you entered in <xref linkend="s1-config-ldap-tls-server"></xref> is
389 <emphasis>NOT</emphasis> the Fully Qualified Domain Name (FQDN) of your ldap server.
393 Other errors could be that you have a typo somewhere in your <command>ldapsearch</command> command, or that
394 your have the wrong permissions on the <filename>servercrt.pem</filename> and <filename>cacert.pem</filename>
395 files. They should be set with <command>chmod 640</command>, as per <xref
396 linkend="s1-config-ldap-tls-install"></xref>.
400 For anything else, it's best to read through your ldap logfile or join the &OL; mailing list.