4.2. Creación de un certificado

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

Hay dos formas de crear e instalar un certificado en el servidor. Ambos métodos requieren la creación de un certificado para el servidor, enviárselo a los clientes OpenLDAP y realizar los cambios apropiados a los archivos de configuración de OpenLDAP. Ambos métodos necesitan el uso de comandos OpenSSL que solicitarán información para la creación del certificado.

[Warning]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):

[Note]Nota

OpenLDAP sólo trabaja con llaves no encriptadas, por lo que se ha de emplear el parámetro “-nodes” de OpenSSL para evitar la encriptación 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 el comando del Ejemplo 4.1, “Creación de un certificado autofirmado para el servidor”. Puede ver una muestra en el Apéndice A, Ejemplo de certificado para un servidor.

Ahora sólo falta indicar a OpenLDAP que utilice el certificado anteriormente creado. Para ello se han de añadir las siguientes líneas al archivo de configuración de slapd, /etc/ldap/slapd.conf:

Ejemplo 4.2. Opciones de configuración para slapd.conf que añaden un certificado en el servidor (para más detalles, vea el Apéndice P, Archivo de configuración /etc/ldap/slapd.conf).

TLSCACertificateFile server.pem 
TLSCertificateFile server.pem 
TLSCertificateKeyFile server.pem

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 la creación de un certificado y una llave privada para el servidor.

Sin embargo, si no posee de una entidad certificadora de confianza, OpenSSL realiza el mismo 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]:gsr.pt
    Organizational Unit Name (eg, section) []:gsr.pt
    Common Name (eg, YOUR name) []:gsr.pt
    Email Address []:sergio@gsr.pt
    
    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 con 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]:gsr.pt
    Organizational Unit Name (eg, section) []:gsr.pt
    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 []:.
    
    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: Mar  9 23:25:59 2004 GMT
                Not After : Mar  9 23:25:59 2005 GMT
            Subject:
                countryName               = PT
                stateOrProvinceName       = Braganca
                localityName              = Braganca
                organizationName          = gsr.pt
                organizationalUnitName    = gsr.pt
                commonName                = gsr.pt
                emailAddress              = sergio@gsr.pt
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    6D:5B:86:85:67:82:40:81:1A:00:17:13:6A:55:87:C6:0F:AE:0B:2F
                X509v3 Authority Key Identifier:
                    keyid:FD:76:7B:FA:EB:98:03:6D:8C:D6:AF:2F:65:DD:0A:62:BB:79:66:58
                    DirName:/C=PT/ST=Braganca/L=Braganca/O=gsr.pt/OU=gsr.pt/CN=gsr.pt/\
                                                             emailAddress=sergio@gsr.pt
                    serial:00
    
    Certificate is to be certified until Mar  9 23:25:59 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=gsr.pt, OU=gsr.pt, \
                                               CN=gsr.pt/emailAddress=sergio@gsr.pt
            Validity
                Not Before: Mar  9 23:25:59 2004 GMT
                Not After : Mar  9 23:25:59 2005 GMT
            Subject: C=PT, ST=Braganca, L=Braganca, O=gsr.pt, OU=gsr.pt, \
                                                CN=gsr.pt/emailAddress=sergio@gsr.pt
            Subject Public Key Info:
                Public Key Algorithm: rsaEncryption
                RSA Public Key: (1024 bit)
                    Modulus (1024 bit):
                        00:b7:19:89:78:17:a5:89:74:65:fe:57:23:3b:53:
                        e0:49:81:bb:12:71:6b:28:90:09:73:1f:7f:88:d5:
                        0a:1e:f1:c7:13:7a:e0:48:f7:ff:1a:92:bf:35:31:
                        6d:df:ad:95:09:1d:12:0e:59:8f:b8:b5:ef:43:92:
                        e6:e0:f2:cd:db:85:bc:70:d6:d5:f7:a3:12:f5:52:
                        20:2a:55:40:10:1f:f7:bd:5c:ef:d7:db:33:f9:4e:
                        f5:c7:6f:a5:07:15:c0:74:b2:98:ff:13:d7:6f:19:
                        16:c5:f9:d9:47:b5:91:22:5b:f1:fe:05:ee:5b:af:
                        00:18:93:47:e2:ff:04:7e:1b
                    Exponent: 65537 (0x10001)
            X509v3 extensions:
                X509v3 Basic Constraints:
                    CA:FALSE
                Netscape Comment:
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier:
                    6D:5B:86:85:67:82:40:81:1A:00:17:13:6A:55:87:C6:0F:AE:0B:2F
                X509v3 Authority Key Identifier:
                    keyid:FD:76:7B:FA:EB:98:03:6D:8C:D6:AF:2F:65:DD:0A:62:BB:79:66:58
                    DirName:/C=PT/ST=Braganca/L=Braganca/O=gsr.pt/OU=gsr.pt/\
                                                 CN=gsr.pt/emailAddress=sergio@gsr.pt
                    serial:00
    
        Signature Algorithm: md5WithRSAEncryption
            05:49:b1:11:79:97:b9:0e:23:c1:1f:65:c1:8d:51:0d:b4:06:
            b8:39:a1:74:6f:e1:ce:5b:45:56:b7:6c:09:f1:7c:ec:24:62:
            03:8e:8a:f6:6c:4a:88:20:d9:33:95:fe:22:2a:92:b5:cb:3f:
            6e:97:74:45:4a:68:26:80:62:d3:4b:17:cf:41:96:e8:47:41:
            77:26:67:33:8e:72:f3:87:10:a1:c1:21:89:1c:55:26:ab:d4:
            c6:26:a0:9a:f7:ef:e6:4e:62:27:47:9f:16:0f:a2:0d:45:ae:
            d1:82:0a:2e:c0:ae:d3:05:e7:f2:3a:a2:9f:84:af:d9:4f:21:
            c2:f8:a3:13:db:2b:62:53:4b:7f:03:89:ef:ec:af:7d:6c:04:
            05:f8:9b:c8:67:4c:10:1d:09:15:3a:6b:d2:06:83:88:69:e6:
            eb:f3:fe:03:8a:eb:a6:48:8b:f8:f0:7e:ab:05:31:24:15:86:
            d0:69:84:f3:ec:da:97:58:74:36:3f:47:ba:1a:8b:9a:61:f5:
            9d:16:dc:6e:1c:20:f5:65:f7:21:8d:39:4c:29:5d:4e:ef:b0:
            df:07:d3:e3:95:24:94:67:78:d5:57:bf:26:14:60:44:45:c2:
            74:6a:00:d6:f7:d3:a4:52:fb:69:1c:a7:38:73:7b:35:4d:fe:
            02:43:82:65
    -----BEGIN CERTIFICATE-----
    MIIEEzCCAvugAwIBAgIBATANBgkqhkiG9w0BAQQFADCBhDELMAkGA1UEBhMCUFQx
    ETAPBgNVBAgTCEJyYWdhbmNhMREwDwYDVQQHEwhCcmFnYW5jYTEPMA0GA1UEChMG
    Z3NyLnB0MQ8wDQYDVQQLEwZnc3IucHQxDzANBgNVBAMTBmdzci5wdDEcMBoGCSqG
    SIb3DQEJARYNc2VyZ2lvQGdzci5wdDAeFw0wNDAzMDkyMzI1NTlaFw0wNTAzMDky
    MzI1NTlaMIGEMQswCQYDVQQGEwJQVDERMA8GA1UECBMIQnJhZ2FuY2ExETAPBgNV
    BAcTCEJyYWdhbmNhMQ8wDQYDVQQKEwZnc3IucHQxDzANBgNVBAsTBmdzci5wdDEP
    MA0GA1UEAxMGZ3NyLnB0MRwwGgYJKoZIhvcNAQkBFg1zZXJnaW9AZ3NyLnB0MIGf
    MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3GYl4F6WJdGX+VyM7U+BJgbsScWso
    kAlzH3+I1Qoe8ccTeuBI9/8akr81MW3frZUJHRIOWY+4te9Dkubg8s3bhbxw1tX3
    oxL1UiAqVUAQH/e9XO/X2zP5TvXHb6UHFcB0spj/E9dvGRbF+dlHtZEiW/H+Be5b
    rwAYk0fi/wR+GwIDAQABo4IBEDCCAQwwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0E
    HxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFG1bhoVn
    gkCBGgAXE2pVh8YPrgsvMIGxBgNVHSMEgakwgaaAFP12e/rrmANtjNavL2XdCmK7
    eWZYoYGKpIGHMIGEMQswCQYDVQQGEwJQVDERMA8GA1UECBMIQnJhZ2FuY2ExETAP
    BgNVBAcTCEJyYWdhbmNhMQ8wDQYDVQQKEwZnc3IucHQxDzANBgNVBAsTBmdzci5w
    dDEPMA0GA1UEAxMGZ3NyLnB0MRwwGgYJKoZIhvcNAQkBFg1zZXJnaW9AZ3NyLnB0
    ggEAMA0GCSqGSIb3DQEBBAUAA4IBAQAFSbEReZe5DiPBH2XBjVENtAa4OaF0b+HO
    W0VWt2wJ8XzsJGIDjor2bEqIINkzlf4iKpK1yz9ul3RFSmgmgGLTSxfPQZboR0F3
    JmczjnLzhxChwSGJHFUmq9TGJqCa9+/mTmInR58WD6INRa7RggouwK7TBefyOqKf
    hK/ZTyHC+KMT2ytiU0t/A4nv7K99bAQF+JvIZ0wQHQkVOmvSBoOIaebr8/4Diuum
    SIv48H6rBTEkFYbQaYTz7NqXWHQ2P0e6GouaYfWdFtxuHCD1ZfchjTlMKV1O77Df
    B9PjlSSUZ3jVV78mFGBERcJ0agDW99OkUvtpHKc4c3s1Tf4CQ4Jl
    -----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.

    [Note]Nota

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

    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”

    [Important]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.

4Los mismos comandos, 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/). 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.