4.2. Creación de un certificado

Para habilitar las conexiones SSL/TLS hacia el servidor LDAP, se necesita la presencia de un certificado en el servidor. Además, en el establecimiento de una conexión SSL/TLS, el certificado del servidor sólo proporciona una conexión segura y cifrada al servidor. Si se desea autentificar al cliente, se ha de presentar al servidor LDAP el certificado y el par de llaves del cliente.

Existen dos formas de crear e instalar un certificado en el servidor: la creación de un “certificado autofirmado” y la creación de un “certificado emitido por una CA”. Ambos métodos requieren la creación de un certificado para el servidor, enviárselo a los clientes OpenLDAP y realizar los cambios apropiados en los archivos de configuración de OpenLDAP. Ambos métodos necesitan el uso de órdenes OpenSSL que solicitarán información para la creación del certificado.

[Nota]Nota

Para la elaboración de esta documentación se ha elegido la creación de un certificado a partir de una CA (Sección 4.2.2, “Certificado emitido por una CA) y sobre este método se basará el resto de la documentación. De todas formas, se ha incluido en la Sección 4.2.1, “Certificado autofirmado” el otro método existente, a título informativo.

[Aviso]Aviso

Cuando se pregunte por el “Common Name”, ha de teclear el nombre del dominio de su servidor (FQDN), como por ejemplo: miservidor.pt, y no “su nombre” como sugiere OpenSSL. ¡Esta equivocación es la causa del 90% de los errores en el el certificado del servidor!

4.2.1. Certificado autofirmado

La primera forma para la creación del certificado del servidor emplea OpenSSL y genera un certificado autofirmado para el servidor. Para ello, desde la línea de comandos se ha de teclear (la letra en negrita son las opciones que ha de introducir el usuario):

[Nota]Nota

OpenLDAP sólo trabaja con llaves no cifradas, por lo que se ha de emplear el parámetro “-nodes” de OpenSSL para evitar el cifrado de la llave privada.

Ejemplo 4.1. Creación de un certificado autofirmado para el servidor

$ openssl req -newkey rsa:1024 -x509 -nodes -out server.pem -keyout server.pem -days 365
Generating a 1024 bit RSA private key
..........................++++++
...............................++++++
writing new private key to 'server.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]:PT
State or Province Name (full name) [Some-State]:Braganca
Locality Name (eg, city) []:Braganca
Organization Name (eg, company) [Internet Widgits Pty Ltd]:gsr.pt
Organizational Unit Name (eg, section) []:gsr.pt
Common Name (eg, YOUR name) []:gsr.pt
Email Address []:sergio@gsr.pt

Esto creará un archivo server.pem en el directorio donde haya ejecutado la orden del Ejemplo 4.1, “Creación de un certificado autofirmado para el servidor”. Puede ver una muestra de su resultado en el Apéndice O, Ejemplo de certificado para un servidor.

Ahora sólo falta indicar a OpenLDAP que utilice el certificado anteriormente creado. El siguiente ejemplo muestra las opciones de configuración que han de añadirse al archivo /etc/ldap/slapd.conf si se ha seguido el método de creación del certificado autofirmado.

Ejemplo 4.2. Opciones de configuración para slapd.conf que añaden un certificado autofirmado en el servidor.

TLSCACertificateFile server.pem 
TLSCertificateFile server.pem 
TLSCertificateKeyFile server.pem
[Nota]Nota

Puede observarse en el ejemplo anterior, que las tres opciones poseen el mismo valor: “server.pem”. Esto diferirá si se ha obtenido el certificado a partir de una CA, como puede verse en el Ejemplo 4.9, “Líneas de configuración para un servidor SSL/TLS.

4.2.2. Certificado emitido por una CA

Si ya posee una entidad certificadora (CA) de confianza, sáltese esta sección dedicada al proceso de obtención de un certificado firmado por una entidad certificadora y una llave privada para el servidor.

Sin embargo, si no posee de una entidad certificadora de confianza, OpenSSL realiza el proceso rápida y fácilmente. Para ello siga los siguientes pasos:

  1. Creación de un directorio para crear y firmar los certificados, por ejemplo: /var/tmp/mica

    Ejemplo 4.3. Creación de un directorio para crear y firmar los certificados

    $ /bin/mkdir -v /var/tmp/mica
    /bin/mkdir: se ha creado el directorio `/var/tmp/mica'
  2. Sitúese en el directorio /var/tmp/mica y ejecute el script CA.sh de OpenSSL.

    Ejemplo 4.4. Creación de una entidad certificadora

    $ cd /var/tmp/mica
    $ /usr/lib/ssl/misc/CA.sh -newca
    CA certificate filename (or enter to create)
    [Enter]
    Making CA certificate ...
    Generating a 1024 bit RSA private key
    ....................+++
    ...................................+++
    writing new private key to './demoCA/private/./cakey.pem'
    Enter PEM pass phrase: [Clave ca] 1
    Verifying - Enter PEM pass phrase: [Clave ca]
    -----
    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]:PT
    State or Province Name (full name) [Some-State]:Braganca
    Locality Name (eg, city) []:Braganca
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Companhia GSR
    Organizational Unit Name (eg, section) []:Unidade de certificados
    Common Name (eg, YOUR name) []:gsr.pt
    Email Address []:[Enter]
    
    1

    La clave utilizada ha de tener un mínimo de 4 caracteres.

    Esto creará la siguiente estructura de directorios bajo /var/tmp/mica:

    $ /usr/bin/tree
    .
    `-- demoCA
        |-- cacert.pem
        |-- certs
        |-- crl
        |-- index.txt
        |-- newcerts
        |-- private
        |   `-- cakey.pem
        `-- serial
    
    5 directories, 4 files

    Pero los archivos realmente interesantes son demoCA/cacert.pem y demoCA/private/cakey.pem (El certificado de la entidad certificadora y la llave privada, respectivamente).

  3. Creamos la petición para la firma del certificado perteneciente al servidor (CSR):

    Ejemplo 4.5. Creación de la petición para la firma del certificado del servidor

    $ /usr/bin/openssl req -newkey rsa:1024 -nodes -keyout newreq.pem -out newreq.pem
    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]:PT
    State or Province Name (full name) [Some-State]:Braganca
    Locality Name (eg, city) []:Braganca
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:SubGSR
    Organizational Unit Name (eg, section) []:Controle de acesso
    Common Name (eg, YOUR name) []:gsr.pt
    Email Address []:sergio@gsr.pt
    
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:[Clave] 1
    An optional company name []:.[Enter]
    
    1

    La clave utilizada ha de tener un mínimo de 4 caracteres.

    El resultado es el archivo newreq.pem.

  4. Firma del CSR:

    Ejemplo 4.6. Firma del CSR

    $ /usr/lib/ssl/misc/CA.sh -sign
    Using configuration from /usr/lib/ssl/openssl.cnf
    Enter pass phrase for ./demoCA/private/cakey.pem:[Clave ca]
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number: 1 (0x1)
            Validity
                Not Before: Sep 23 16:16:11 2004 GMT
                Not After : Sep 23 16:16:11 2005 GMT
            Subject:
                countryName               = PT
                stateOrProvinceName       = Braganca
                localityName              = Braganca
                organizationName          = SubGSR
                organizationalUnitName    = Controle de acesso
                commonName                = gsr.pt
                emailAddress              = sergio@gsr.pt
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    8C:66:2C:3E:0F:63:2F:53:29:FA:28:EA:7F:59:A4:16:4C:DF:7C:6C
                X509v3 Authority Key Identifier:
                    keyid:F1:34:77:80:A4:34:4B:71:C8:BF:81:6C:DF:0C:98:D3:62:B7:10:BE
                    DirName:/C=PT/ST=Braganca/L=Braganca/O=Companhia GSR/OU=Unidade de\
                                                                 certificados/CN=gsr.pt
                    serial:00
    
    Certificate is to be certified until Sep 23 16:16:11 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=PT, ST=Braganca, L=Braganca, O=Companhia GSR, OU=Unidade de certificados,\
                                                                                       CN=gsr.pt
            Validity
                Not Before: Sep 23 16:16:11 2004 GMT
                Not After : Sep 23 16:16:11 2005 GMT
            Subject: C=PT, ST=Braganca, L=Braganca, O=SubGSR, OU=Controle de acesso, \
                                                            CN=gsr.pt/emailAddress=sergio@gsr.pt
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                RSA Public Key: (1024 bit)
                    Modulus (1024 bit):
                        00:ab:bc:62:aa:75:ad:76:6d:05:e6:be:c2:b7:b7:
                        1f:28:3a:b9:ed:0b:b2:11:6a:9d:27:7b:06:69:89:
                        3a:13:3d:29:85:0d:02:87:b7:ac:cf:46:b0:01:3a:
                        30:c6:2e:25:13:af:6f:35:b6:d0:2c:ae:fb:42:24:
                        77:f3:c7:e1:a6:cb:00:35:ca:03:be:b1:d8:dd:22:
                        de:d6:bc:e2:94:d4:1a:ae:47:83:95:0c:a2:ae:1f:
                        c3:d3:f4:1d:7e:cd:cc:9c:48:28:63:35:5c:af:7b:
                        c9:bf:f8:f7:de:2b:09:61:c6:40:30:76:e3:9f:51:
                        28:d0:61:b2:18:9a:d9:8a:53
                    Exponent: 65537 (0x10001)
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    8C:66:2C:3E:0F:63:2F:53:29:FA:28:EA:7F:59:A4:16:4C:DF:7C:6C
                X509v3 Authority Key Identifier:
                    keyid:F1:34:77:80:A4:34:4B:71:C8:BF:81:6C:DF:0C:98:D3:62:B7:10:BE
                    DirName:/C=PT/ST=Braganca/L=Braganca/O=Companhia GSR/OU=Unidade de \
                                                                        certificados/CN=gsr.pt
                    serial:00
    
        Signature Algorithm: md5WithRSAEncryption
            27:43:54:46:14:dd:f5:2d:64:40:b4:dd:62:b4:79:d6:93:32:
            d4:56:0d:a7:80:60:6a:93:1a:c2:02:e3:f8:33:d9:4d:32:c7:
            0b:34:29:01:72:98:1a:aa:c6:34:78:50:11:0d:92:ab:31:ba:
            9b:3f:27:39:1a:19:8b:a0:2c:d7:ca:56:04:69:c4:ae:cc:e5:
            dc:fa:ce:da:11:a9:25:0c:db:d6:8c:60:b1:86:9a:02:06:c5:
            c4:da:8f:8e:a6:4d:84:06:3d:e1:ce:3e:d9:fa:d4:5b:d5:44:
            36:4f:48:88:d0:ab:ec:03:e5:a7:4f:92:e8:8e:db:aa:89:7e:
            02:e4
    -----BEGIN CERTIFICATE-----
    MIIDkDCCAvmgAwIBAgIBATANBgkqhkiG9w0BAQQFADB+MQswCQYDVQQGEwJQVDER
    MA8GA1UECBMIQnJhZ2FuY2ExETAPBgNVBAcTCEJyYWdhbmNhMRYwFAYDVQQKEw1D
    b21wYW5oaWEgR1NSMSAwHgYDVQQLExdVbmlkYWRlIGRlIGNlcnRpZmljYWRvczEP
    MA0GA1UEAxMGZ3NyLnB0MB4XDTA0MDkyMzE2MTYxMVoXDTA1MDkyMzE2MTYxMVow
    gZAxCzAJBgNVBAYTAlBUMREwDwYDVQQIEwhCcmFnYW5jYTERMA8GA1UEBxMIQnJh
    Z2FuY2ExDzANBgNVBAoTBlN1YkdTUjEbMBkGA1UECxMSQ29udHJvbGUgZGUgYWNl
    c3NvMQ8wDQYDVQQDEwZnc3IucHQxHDAaBgkqhkiG9w0BCQEWDXNlcmdpb0Bnc3Iu
    cHQwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKu8Yqp1rXZtBea+wre3Hyg6
    ue0LshFqnSd7BmmJOhM9KYUNAoe3rM9GsAE6MMYuJROvbzW20Cyu+0Ikd/PH4abL
    ADXKA76x2N0i3ta84pTUGq5Hg5UMoq4fw9P0HX7NzJxIKGM1XK97yb/4994rCWHG
    QDB2459RKNBhshia2YpTAgMBAAGjggEJMIIBBTAJBgNVHRMEAjAAMCwGCWCGSAGG
    +EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQU
    jGYsPg9jL1Mp+ijqf1mkFkzffGwwgaoGA1UdIwSBojCBn4AU8TR3gKQ0S3HIv4Fs
    3wyY02K3EL6hgYOkgYAwfjELMAkGA1UEBhMCUFQxETAPBgNVBAgTCEJyYWdhbmNh
    MREwDwYDVQQHEwhCcmFnYW5jYTEWMBQGA1UEChMNQ29tcGFuaGlhIEdTUjEgMB4G
    A1UECxMXVW5pZGFkZSBkZSBjZXJ0aWZpY2Fkb3MxDzANBgNVBAMTBmdzci5wdIIB
    ADANBgkqhkiG9w0BAQQFAAOBgQAnQ1RGFN31LWRAtN1itHnWkzLUVg2ngGBqkxrC
    AuP4M9lNMscLNCkBcpgaqsY0eFARDZKrMbqbPyc5GhmLoCzXylYEacSuzOXc+s7a
    EaklDNvWjGCxhpoCBsXE2o+Opk2EBj3hzj7Z+tRb1UQ2T0iI0KvsA+WnT5Lojtuq
    iX4C5A==
    -----END CERTIFICATE-----
    Signed certificate is in newcert.pem
    

    Esto crea el archivo newcert.pem (el certificado del servidor firmado por la entidad certificadora) con la clave privada, newreq.pem.

    [Nota]Nota

    Para verificar que el certificado está correctamente firmado se puede utilizar la siguiente orden:

    Ejemplo 4.7. Verificación de la firma creada en un certificado por una CA

    $ /usr/bin/openssl verify -CAfile demoCA/cacert.pem newcert.pem
    newcert.pem: OK
  5. Ahora se puede renombrar y mover los certificados al sitio deseado. En este caso se moverá al directorio /etc/ldap/ssl, quedando la estructura final como sigue:

    Ejemplo 4.8. Estructura de directorios final para los certificados

    # /usr/bin/tree /etc/ldap/ssl
    /etc/ldap/ssl
    |-- cacert.pem
    |-- certs
    |   `-- servidorcert.pem 1
    |-- crl
    |-- index.txt
    |-- newcerts
    |   `-- 01.pem
    |-- private
    |   |-- cakey.pem
    |   `-- servidorkey.pem 2
    `-- serial
    
    4 directories, 7 files
    1

    Este archivo se corresponde con el archivo newcert.pem generado tras el Ejemplo 4.6, “Firma del CSR

    2

    Este archivo se corresponde con el archivo newreq.pem generado tras el Ejemplo 4.6, “Firma del CSR

    [Importante]Importante

    Sería recomendable hacer la llave privada del servidor sólo legible por el usuario con el que se ejecuta slapd, para ello teclee:

    # /bin/chmod -v 400 /etc/ldap/ssl/private/servidorkey.pem
    el modo de `/etc/ldap/ssl/private/servidorkey.pem' cambia a 0400 (r--------)

    Los demás certificados tendría que poderse leer por todo el mundo.

  6. Hacer que el certificado de la entidad certificadora esté disponible para los clientes de LDAP.

    Si los clientes están en la misma máquina, se ha de copiar el archivo cacert.pem a un lugar accesible por los clientes. Si los clientes están en otros equipos, se ha de copiar el archivo cacert.pem a esas máquinas y hacerlo accesible.

Como se ha podido apreciar, este proceso requieres algunos pasos más que la creación un certificado autofirmado, pero los beneficios obtenidos sobrepasan cualquier gasto de tiempo empleado en crear la entidad certificadora.

4.2.3. El certificado de los clientes

Los certificados para los clientes se crean de forma similar a los certificados para el servidor. Si se siguen los pasos detallados en Sección 4.2.2, “Certificado emitido por una CA, los únicos cambios son los siguientes:

1 y 2No se hace nada... no se necesita crear de nuevo la entidad certificadora. El objetivo es utilizar la misma entidad certificadora para firmar el certificado del cliente.

3Se ejecuta todo lo que allí se muestra, lo único que se ha de cambiar es el nombre del servidor por el del cliente cuando se pregunte el “Common Name”. Se da por supuesto que todas las demás respuestas se han de ajustar a los datos del cliente.

4Las mismas órdenes, obteniéndose los mismos archivos para el certificado y la llave privada. ¡Gracias que se renombró el certificado en el 5!.

5Ahora se puede renombrar y mover el certificado y la llave privada del cliente al lugar indicado (por ejemplo, /home/usuario/ssl/[10]). También sería recomendable que cambiase los permisos de la llave privada, para que sólo pueda ser leída por el usuario al que pertenece.

6No se ha de hacer nada en este paso.

Ahora que ya están creados los certificados, sólo queda configurar OpenLDAP.



[10] Tenga en cuenta que el directorio donde almacene el certificado del usuario ha de ser accesible por todo el mundo.