Mr. Editor-in-chief Mr. Editor-in-chief August 19, 2023 Updated April 24, 2026

Add SSL Certificate for Django Deployed with Apache on Ubuntu

Get (free or not free) a SSL certificate and scp the files into the server

# We will use a free certificate from ZeroSSL as an example
scp peng.works.zip user@ip_address:/etc/ssl/
ssh user@ip_address
cd /etc/ssl
unzip peng.works.zip # You will get 3 files: certificate.crt, ca_bundle.crt, private.key
rm peng.works.zip

Configure the apache server

# Suppose we have 2 files under /etc/apache2/sites-available
# 000-default.conf  default-ssl.conf  
cp 000-default.conf mdblog.conf
cp mdblog.conf mdblog-le-ssl.conf
sudo a2dissite 000-default.conf default-ssl.conf
sudo ennable mdblog-le-ssl.conf  mdblog.conf
# mdblog.conf
<VirtualHost *:80>
    ServerName peng.works
    ServerAlias www.peng.works

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

RedirectMatch permanent ^/(.*)$ https://%{SERVER_NAME}/$1
</VirtualHost>
# mdblog-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName peng.works
    ServerAlias www.peng.works

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

        alias /static /home/ubuntu/mdblog/static
        <Directory /home/ubuntu/mdblog/static>
                Require all granted
        </Directory>

        alias /media /home/ubuntu/mdblog/media
        <Directory /home/ubuntu/mdblog/media>
                Require all granted
        </Directory>

        <Directory /home/ubuntu/mdblog/blog>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        WSGIScriptAlias / /home/ubuntu/mdblog/blog/wsgi.py
        WSGIDaemonProcess mdblog python-path=/home/ubuntu/mdblog python-home=/home/ubuntu/mdblog/venv
        WSGIProcessGroup mdblog

SSLEngine on
SSLCertificateFile /etc/ssl/certificate.crt
SSLCertificateKeyFile /etc/ssl/private.key
SSLCertificateChainFile /etc/ssl/ca_bundle.crt
</VirtualHost>
</IfModule>
apachectl configtest
systemctl reload apache2
systemctl restart apache2