HTTPS ile Docker üzerinde Apache sunucusu
Neden Docker SSL
Diğer birçok şirket gibi biz de geliştirme ortamı için Docker kullanıyoruz. Bunu müşteriler için testler ve önizleme için de kullanıyoruz. Bize tüm ortamlarda sunucu yapılandırmasını birleştirme imkanı veriyor. LAMP yığınını çalıştırmayı kolaylaştırmak için, tek bir uygulama için birden fazla kapsayıcı düzenlemek üzere docker-compose kullanıyoruz.
SSL şu anda İnternette standart oldu. Kullanmamak kötü bir izlenim. Güvenliği önemsemeseniz bile, web tarayıcılarında bazı web API’leri vardır, bunlar https iletişimi kullanmıyorsanız kullanılamaz. Yerel olarak geliştiricilerin SSL’e ihtiyacı yoktur – çoğu durumda localhost, https ana bilgisayarlarıyla aynı şekilde ele alınır. Ancak uygulamanızı testler için veya bir istemci için önizleme olarak dağıttığınızda ve İnternet üzerinden kullanılabilir olduğunda, HTTPS ile iletişimi yönetebilmelisiniz.
Gördüğünüz gibi, docker konteynırlarımızda HTTPS iletişimini etkinleştirmek çok önemlidir.
Ana Bilgisayar için HTTPS yapılandırması
Şimdi SSL yapılandırmasına geçmeliyiz. Cerbot ile oluşturulan letsencrypt sertifikasını kullanacağız. Certbot’u ana bilgisayara yüklememiz gerekiyor:
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python-certbot-apache
Artık sertifika oluşturmak için certbot’u kullanabiliriz. Bunun için otomatik olarak bir sanal konak yapılandırması da oluşturabiliriz. Komutla başlıyoruz:
sudo certbot – apache
Hangi alanı kullanmak istediğimizi seçmemiz istenecektir. Doğru olanı seçin. Bundan sonra, sanal bir ana bilgisayarın yapılandırması sorulacak – HTTP’yi HTTPS’ye yönlendirmeden seçeneği seçin. Normalde muhtemelen tüm HTTP trafiğini HTTPS’ye yönlendirirsiniz, ancak sunum amacıyla bunu yapmayız.
Komut dosyaları bittiğinde, SSL yapılandırması ile /etc/apache2/sites-available/test-https-docker.com-le-ssl.conf’u bulabilmeniz gerekir. Şimdi https://test-https-docker.com’u açtığımızda ower sayfasını görecektik. Ayrıca, http://test-https-docker.com hala çalışmalıdır.
Yaptığımız şeyi özetleyelim:
Certbot’u kurduk ve ana sunucu üzerindeki etki alanımız için SSL sertifikası oluşturduk. Konteynırda aynı sertifikaları kullandık.
Konteynırın 80 ve 443 numaralı bağlantı noktalarını ana bilgisayardaki seçili bağlantı noktalarına eşledik. Apache’yi bir ana bilgisayar üzerinde proxy olarak yapılandırdık ve HTTP ve HTTPS’yi eşlenen bağlantı noktalarına yönlendirdik.
Kapsayıcıya birimler olarak sertifikaları ve apache yapılandırma dosyalarını ekledik.
Eşleştirdiğimiz birimlere ve bağlantı noktalarına giden yolları tanımlamak için .env dosyasını kullandık. Bu bize birden çok ortam için bir yapılandırmada esneklik sağlar.
Bu, ana bilgisayardaki son https yapılandırmamızdır:
<IfModule mod_ssl.c>
<VirtualHost *:443>
. ServerName test-https-docker.com
. ServerAdmin webmaster@test-https-docker.com
. CustomLog /var/www/log/test-https-docker.com/custom.log combined
. ErrorLog /var/www/log/test-https-docker.com/errors.log
. ProxyPass. “/” “https://127.0.0.1:14443/”
. ProxyPassReverse “/” “https://127.0.0.1:14443/”
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPreserveHost On
SSLCertificateFile /etc/letsencrypt/live/test-https-docker.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test-https-docker.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
This is our HTTP configuration on host:
VirtualHost *:80>
. ServerName test-https-docker.com
. ServerAdmin webmaster@test-https-docker.com
. CustomLog /var/www/log/test-https-docker.com/custom.log combined
. ErrorLog /var/www/log/test-https-docker.com/errors.log
. ProxyPreserveHost On
. ProxyPass. “/” “http://127.0.0.1:14080/”
. ProxyPassReverse “/” “http://127.0.0.1:14080/”
</VirtualHost>
Here is our apache configuration on container, kept in /srv/www/web_apps/test_https/code/docker/000-default.conf:
<VirtualHost *:80>
. ServerName test-https-docker.com
. ServerAdmin webmaster@test-https-docker.com
. DocumentRoot /var/www/html
. ErrorLog ${APACHE_LOG_DIR}/error.log
. CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
. ServerName test-https-docker.com
. ServerAdmin webmaster@test-https-docker.com
. DocumentRoot /var/www/html
. ErrorLog ${APACHE_LOG_DIR}/error.log
. CustomLog ${APACHE_LOG_DIR}/access.log combined
. SSLCertificateFile /var/imported/ssl/fullchain.pem
. SSLCertificateKeyFile /var/imported/ssl/privkey.pem
. SSLEngine on
</VirtualHost>
</IfModule>
This is content of .env file from /srv/www/web_apps/test_https/code
HOST_HTTP_PORT=14080
APACHE_LOG_VOLUME=/srv/www/web_apps/test_https/apache_log
HOST_HTTPS_PORT=14443
SSL_VOLUME=/srv/www/web_apps/test_https/ssl
APACHE_CONF=./docker/000-default.conf
This is our docker-compose.yml kept in /srv/www/web_apps/test_https/code
version: ‘3.1'
services:
. webserver:
. image: php:7.3-apache
. restart: always
. volumes:
. – ./:/var/www/html
. – ${APACHE_LOG_VOLUME}:/var/log/apache2
. – ${APACHE_CONF}:/etc/apache2/sites-available/000-default.conf
. – ${SSL_VOLUME}:/var/imported/ssl
. ports:
. – “${HOST_HTTP_PORT}:80"
. – “${HOST_HTTPS_PORT}:443"