Free HTTPS for Django project on Heroku

HTTPS is an important option for modern websites. With free SSL certificates from Let's Encrypt there is no excuses do not use it.

First of all, you have to need download Certbot install script:

$ wget https://dl.eff.org/certbot-auto

Give the permission for the file execution

$ chmod a+x ./certbot-auto

Then run it:

$ ./certbot-auto certonly --manual

The script will install all necessary packages and run certbot. Now you need to answer for a list of questions.

Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): xxxxx@mydomain.com

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a
-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: y
Please enter in your domain name(s) (comma and/or space separated)
(Enter 'c' to cancel):mydomain.com

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mydomain.com

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o:y

Than you'll see something like that:

-------------------------------------------------------------------------------
Make sure your web server displays the following content at
http://mydomain.com/.well-known/acme-challenge/some-hash before continuing:

some-answer-line

This is a necessary to prove that you are the owner of the domain. And this part requires some changes in your application code. Add the next two lines to your settings module:

LETSENCRYPT_URL = os.environ.get('LETSENCRYPT_URL')
LETSENCRYPT_RESPONSE = os.environ.get('LETSENCRYPT_RESPONSE', '')

Then add the next lines to the main urls.py:

if settings.LETSENCRYPT_URL:
    from django.http import HttpResponse
    urlpatterns += [
        url(
            settings.LETSENCRYPT_URL,
            lambda r: HttpResponse(settings.LETSENCRYPT_RESPONSE, content_type='text/plain'),
        ),
    ]

Now you need to setup environment variables LETSENCRYPT_URL and LETSENCRYPT_RESPONSE and restart the project dynos.

Heroku vars

Heroku restart all dynos menu

Heroku restart dynos dialog

Wait a few seconds for verification and the next message will be appeared:

web app
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/mydomain.com/fullchain.pem. Your cert will expire on XXXX-XX-XX. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Now you can use the files fullchain.pem and privkey.pem for Heroku.

Heroku Domains and certificates

Heroku configure ssl 1

Heroku configure ssl 2

And the last, do not forget to change your DNS:

Heroku configure ssl 3