Setup Apache

The following is an example setup process for Apache, please adopt to your exact needs.

Apache SSLOpenSSLConfCmd DHParameters

For Apache 2.4.8 or later and OpenSSL 1.0.2 or later, you can generate and specify your Diffie-Hellman (DH) params file. If not already present, add an SSLOpenSSLConfCmd directive and a new certificate with stronger keys (which improves forward secrecy). The OpenSSL command may take a quite a while to complete, so please be patient.

You can place the certificate into any directory of your choice. We recommend /etc/apache2/ in this guide, just for the sake of simplicity.

sudo openssl dhparam -out /etc/apache2/dh4096.pem 4096

Add the following directive to your common SSL configuration:

SSLOpenSSLConfCmd DHParameters /etc/apache2/dh4096.pem

Add the /.well-known/acme-challenge location in your Virtual Host directive for port 80

<virtualHost *.80>
  ServerName mydom.tld

  Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
  <Directory "/var/www/letsencrypt/.well-known/acme-challenge/">
      Options None
      AllowOverride None
      ForceType text/plain
      RedirectMatch 404 "^(?!/\.well-known/acme-challenge/[\w-]{43}$)"
  </Directory>

  # ...
</virtualHost>

Prepare a virtualHost directive for port 443

It is easiest, if you create a separate file for the following SSL directives. If these directives already exist in this Virtual Host, delete them and include the file instead. When the certificate has been created, you can use this file in any SSL Virtual Host for which the certificate is valid, without reissuing.

cd /etc/apache2/
sudo mkdir ssl_rules

Create a file named ssl_mydom.tld in the newly created directory.

# ssl rules for mydom.tld
# eases letsencrypt initial cert issuing

SSLEngine on

SSLCertificateChainFile  /etc/letsencrypt/live/mydom.tld/fullchain.pem
SSLCertificateKeyFile    /etc/letsencrypt/live/mydom.tld/privkey.pem
SSLCertificateFile       /etc/letsencrypt/live/mydom.tld/cert.pem

To reduce the SSL performance penalty, we recommend you use the SSLUseStapling and SSLStaplingCache directives: Here’s an example configuration:

SSLUseStapling on
SSLStaplingCache         shmcb:/tmp/stapling_cache(2097152)

Then adopt your Virtual Host block:

<virtualHost *:443>
  ServerName mydom.tld

  # ssl letsencrypt
  # Include /etc/apache2/ssl_rules/ssl_mydom.tld

  #...
</virtualHost>

Commenting the Include directive is required, because the certificate files currently do not exist.

Test and enable your Apache configuration

To test your configuration run

sudo apache2ctl -t # You can also use: sudo apache2ctl configtest

It should reply without errors. Load your new Apache configuration:

sudo apache2ctl graceful

Creating certificates

Check that you have commented out the Include directive as stated above and run the following command:

sudo /etc/letsencrypt/<your-domain-name>.sh

To double check the issued certificate, run the list.sh script.

sudo /etc/letsencrypt/list.sh

If successful, you will see output similar to that below, when the command completes:

Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Found the following certs:
  Certificate Name: mydom.tld
    Domains: mydom.tld
    Expiry Date: 2018-06-18 10:57:18+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/mydom.tld/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/mydom.tld/privkey.pem
-------------------------------------------------------------------------------

When successfully issuing the certificate for the first time, the certificate files exist and you can un-comment the Include directive to use them with SSL.

<virtualHost *:443>
  ServerName mydom.tld

  # ssl letsencrypt
  Include /etc/apache2/ssl_rules/ssl_mydom.tld

  #...
</virtualHost>

Reload the Apache configuration

sudo service apache2 reload

Your web server is now ready to serve https request for the given domain using the issued certificates.