Bedava SSL için Let’s Encrypt ve Haproxy Entegrasyonu

SSL (Secure Sockets Layer) istemci ve sunucu arasında güvenli bir bağlantı kurulmasını sağlayan bir teknolojidir. Web sunucusu ile tarayıcı arasında, mail sunucu ve client’ı arasında güvenli bir bağlantı kurulmasını sağlar.

Hassas bilgilerin, örneğin kredi kartı bilgilerinin, kullanıcı adı ve şifre bilgilerinin ve buna benzer hassas özellikteki bilgilerin güvenli bir şekilde karşı tarafa ulaştırılmasını sağlar. Normalde tarayıcı kullanırken girdiğimiz veriler, düz text formatında gider. Bu durumda ağı dinleyen bir hacker sizin bilgilerinizi ele geçirebilir. SSL protokolü aktif hale getirilirse, böyle bir şeyin önüne geçilmiş olur.

Kendi sitelerimizde ssl özelliğini aktif etmek için bir sertifika yetkilisinden sertifika almanız gerekir. Bildiğiniz gibi Comodo, GeoTrust, Thawte ve Symantec gibi firmalardan ücret karşılığında sertifika edinebilirsiniz. Let’s Encrypt sayesinde ise siteniz için ssl özelliğini ücretsiz edinebilirsiniz.

Bu yazımızda adım adım let’s encrypt kurulumu ve haproxy entegrasyonunu anlatacağım. Kurulumu shell üzerinden yani bir terminal penceresi üzerinden yapacağım. Farklı hosting sağlayıcılarının arayüz panelleri üzerinden de kurulum yapılabilir.

Kurulum

Aşağıdaki komutları sırayla çalıştıralım:

$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot

Sitemiz için standalone özellikte bir sertifika üreteceğiz. Bu yüzden 80 ve 443 portunu dinleyen hiçbir uygulamanın çalışmaması gerekir. Haproxy servisini de durduralım.

sudo service haproxy stop

Portların dinlenmediğinden emin olmak için netstat komutu ile bakalım.

netstat -nlt | grep ':80\s'
netstat -nlt | grep ':443\s'

Varsa ilgili uygulamaları durduralım.

Artık sertifikamızı oluşturalım.

certbot certonly --standalone -d example.com -d www.example.com

Bu komutla -d parametresi ile belirttiğimiz alan adlarının sertifikasını üretmiş oluruz.

İstersek -d api.example.com gibi başka alt alan adlarımız var ise onları da ekleyebiliriz.

Herşey yolunda giderse, sertifikalarımız /etc/letsencrypt/archive dizininde oluşmuş olacaktır.

Hata olmasının belli başlı iki sebebi olabilir. 80 ve 443 portlarının kullanılıyor olması ya da güvenlik duvarının (firewall) bu portları engellemesidir.

Haproxy servisinin bu sertifikaları kullanabilmesi için, üretilmiş olan fullchain.pem ve privkey.pem dosyalarının birleştirilerek tek dosya haline getirilmesi gerekir. Aşağıdaki komut ile bu işi yapmış oluruz.

DOMAIN='example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'

example.com yerine kendi alan adınızı yazınız.

Haproxy Ayarı

Evet artık sertifikamız hazır. Haproxy servisinin ürettiğimiz sertifikaları kullanabilmesi için haproxy.cfg dosyasını değiştirelim. (Önceki yazımızda Haproxy’nin kurulumu konusunda bilgi vermiştik)

global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 30s
	user haproxy
	group haproxy
	daemon
        maxconn 2048
	tune.ssl.default-dh-param 2048

	# Default SSL material locations
	ca-base /etc/ssl/certs
	crt-base /etc/ssl/private

	# Default ciphers to use on SSL-enabled listening sockets.
	# For more information, see ciphers(1SSL). This list is from:
	#  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
	ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
	ssl-default-bind-options no-sslv3

defaults
	option forwardfor
	option http-server-close
	log	global
	mode	http
	option	httplog
	option	dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http


frontend www-http
	bind *:80
	reqadd X-Forwarded-Proto:\ http
	default_backend www-backend

frontend www-https
	bind *:443 ssl crt /etc/haproxy/certs/example.com.pem
	reqadd X-Forwarded-Proto:\ https
	acl letsencrypt-acl path_beg /.well-known/acme-challenge/
	use_backend letsencrypt-backend if letsencrypt-acl
	default_backend www-backend

backend www-backend
	redirect scheme https if !{ ssl_fc }
	server www-1 127.0.0.1:8080 check

backend letsencrypt-backend
	server letsencrypt 127.0.0.1:54321

Orjinal haproxy.cfg konfigürasyon dosyasında yaptığımız değişiklikler anlatmak gerekirse;

  • Global kısmına maxconn ve tune.ssl.default-dh-param değerleri eklendi.
  • Defaults kısmına option forwardfor ve option http-server-close değerleri eklendi.
  • frontend ile başlayan kısım sonuna kadar yeni eklendi.

Haproxy servisini /etc/haproxy/certs/example.com.pem sertifika dosyasını kullanacak şekilde ayarlıyoruz.

Http (80) portu ile gelen bağlantıları da https kullanacak şekilde tekrar yönlendiriyoruz.

backend www-backend
    redirect scheme https if !{ ssl_fc }

Haproxy servisini tekrar çalıştıralım.

sudo service haproxy start

Böylece sitemize ssl özelliği kazandırmış olduk.

Let’s Encrypt sertifikalarının geçerlilik süresi 90 gündür. Bu yüzden her 90 günde sertifikayı yenilememiz gerekiyor.

Yenilemekte çok kolay:

certbot renew --dry-run

Fakat her 90 günde bir yapmak zahmetli ve unutulabilecek bir iş olacağı için, otomatik olarak sertifikayı yenilemek için script yazıp, crontab’a job olarak ekleyelim.

autorenewcert.sh
#!/bin/bash
certbot renew --pre-hook "service haproxy stop" --post-hook "service haproxy start"
DOMAIN='example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/
$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'

script’i 90 günde bir çalıştırmak için, crontab’ı açalım:

crontab -e

Aşağıdaki satırı ekleyelim:

* * */89 * * /home/myuser/autorenewcert.sh

Böylece sitemize Let’s Encrypt ile ücretsiz bir şekilde ssl özelliği kazandırmış olduk.

Faydalandığım Kaynaklar

https://certbot.eff.org/

https://www.digitalocean.com/community/tutorials/how-to-use-haproxy-to-set-up-http-load-balancing-on-an-ubuntu-vps

https://skarlso.github.io/2017/02/15/how-to-https-with-hugo-letsencrypt-haproxy/

 

 

 

Yorum bırakın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Scroll to Top