SSL Certificates

  So called SSL/TLS certificates are cryptographic public key certificates and are composed
  of a public and a private key. The certificates are used to authenticate the endpoints and
  encrypt the data. They are used for example on a web server (https) or mail server (imaps).

Procedure

    * We need a certificate authority to sign our certificate. This step is usually provided
      by a vendor like Thawte, Verisign, etc., however we can also create our own.
    * Create a certificate signing request. This request is like an unsigned certificate (the
      public part) and already contains all necessary information. The certificate request is
      normally sent to the authority vendor for signing. This step also creates the private
      key on the local machine.
    * Sign the certificate with the certificate authority.
    * If necessary join the certificate and the key in a single file to be used by the
      application (web server, mail server etc.).

Configure OpenSSL

  We use /usr/local/certs as directory for this example check or edit /etc/ssl/openssl.cnf
  accordingly to your settings so you know where the files will be created. Here are the
  relevant part of openssl.cnf:
[ CA_default ]
dir             = /usr/local/certs/CA       # Where everything is kept
certs           = $dir/certs                # Where the issued certs are kept
crl_dir         = $dir/crl                  # Where the issued crl are kept
database        = $dir/index.txt            # database index file.

  Make sure the directories exist or create them
# mkdir -p /usr/local/certs/CA
# cd /usr/local/certs/CA
# mkdir certs crl newcerts private
# echo "01" > serial                        # Only if serial does not exist
# touch index.txt

  If you intend to get a signed certificate from a vendor, you only need a certificate
  signing request (CSR). This CSR will then be signed by the vendor for a limited time (e.g.
  1 year).

Create a certificate authority

  If you do not have a certificate authority from a vendor, you'll have to create your own.
  This step is not necessary if one intend to use a vendor to sign the request. To make a
  certificate authority (CA):
# openssl req -new -x509 -days 730 -config /etc/ssl/openssl.cnf \
-keyout CA/private/cakey.pem -out CA/cacert.pem

Create a certificate signing request

  To make a new certificate (for mail server or web server for example), first create a
  request certificate with its private key. If your application do not support encrypted
  private key (for example UW-IMAP does not), then disable encryption with -nodes.
# openssl req -new -keyout newkey.pem -out newreq.pem \
-config /etc/ssl/openssl.cnf
# openssl req -nodes -new -keyout newkey.pem -out newreq.pem \
-config /etc/ssl/openssl.cnf                # No encryption for the key

  Keep this created CSR (newreq.pem) as it can be signed again at the next renewal, the
  signature onlt will limit the validity of the certificate. This process also created the
  private key newkey.pem.

Sign the certificate

  The certificate request has to be signed by the CA to be valid, this step is usually done
  by the vendor. Note: replace "servername" with the name of your server in the next
  commands.
# cat newreq.pem newkey.pem > new.pem
# openssl ca -policy policy_anything -out servernamecert.pem \
-config /etc/ssl/openssl.cnf -infiles new.pem
# mv newkey.pem servernamekey.pem

  Now servernamekey.pem is the private key and servernamecert.pem is the server certificate.

Create united certificate

  The IMAP server wants to have both private key and server certificate in the same file. And
  in general, this is also easier to handle, but the file has to be kept securely!. Apache
  also can deal with it well. Create a file servername.pem containing both the certificate
  and key.
    * Open the private key (servernamekey.pem) with a text editor and copy the private key
      into the "servername.pem" file.
    * Do the same with the server certificate (servernamecert.pem).

  The final servername.pem file should look like this:
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDutWy+o/XZ/[...]qK5LqQgT3c9dU6fcR+WuSs6aejdEDDqBRQ
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIERzCCA7CgAwIBAgIBBDANB[...]iG9w0BAQQFADCBxTELMAkGA1UEBhMCREUx
-----END CERTIFICATE-----

  What we have now in the directory /usr/local/certs/:
    * CA/private/cakey.pem (CA server private key)
    * CA/cacert.pem (CA server public key)
    * certs/servernamekey.pem (server private key)
    * certs/servernamecert.pem (server signed certificate)
    * certs/servername.pem (server certificate with private key)

  Keep the private key secure!

View certificate information

  To view the certificate information simply do:
# openssl x509 -text -in servernamecert.pem      # View the certificate info
# openssl req -noout -text -in server.csr        # View the request info
# openssl s_client -connect cb.vu:443            # Check a web server certificate