SSL sertifikanız var ve kullanıcılarınızın gerçekten sizin sertifikanızın public anahtarını kullandığından emin olmak istiyorsunuz. Bunu Public key Pinning yaparak gerçekleştirebilirsiniz. HSTS ‘de olduğu gibi HPKP için de bir başlık bilgisini sunucu tarafında uygulayarak kullanıcı tarafında bu tarz bir güvenlik önlemi alabilirsiniz.
Not: Kurumsal firmalarında ssl inspection yapan proxy sunucular gerçek sertiifka daki public anahtarı değiştirmedikleri sürece bu başlıktan dolayı sıkıntı yaşamazsınız.
Bu yazımızda openssl aracından da yararlanarak Apache üzerinde HPKP’yi nasıl gerçekleştireceğimizi göreceğiz.
Elinizde ssl sertifikası yoksa indiriyoruz.
echo | openssl s_client -connect gokhankesici.com:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > sertifika.crt
Sertifikadan public anahar çıkartılır.
openssl x509 -inform pem -in sertifika.crt -pubkey -noout > public_anahtar
Public key’in özet değeri alınır ve daha sonra base64 ile encode edilir.
openssl dgst -sha256 -binary public_anahtar | openssl enc -base64
7S3apEuTpzkJzUiW7YmxDpVm0N9iTT2r8BC7ZIFX5Qc=
HPKP ‘in aktif olabilmesi için en az 2 adet pin’in set edilmesi gerekir. 1 tane pin set ederseniz HPKP politikası işlemez. İkinci pin backup pin’idir. İkinci pin kullanılmayan ve başka bir CA’den alınmış olsun. Böyle bir public anahtarım olmadığından. Bir CSR oluşturup bunun public anahtarını yukarıdakine benzer şekilde encode ettim.
openssl req -in mycsr.csr -noout -pubkey > mypub
openssl dgst -sha256 -binary mypub | openssl enc -base64
L9XlDqPAg8Z0mEQPXmBn4trbSd7A8bHMEgD6axpgnUc=
Son olarak apache web sunucunun konfigürasyonunda Public-Key-Pins başlığı set edilir ve web sunucu restart edilir.
Header always set Public-Key-Pins "pin-sha256="7S3apEuTpzkJzUiW7YmxDpVm0N9iTT2r8BC7ZIFX5Qc="; pin-sha256="L9XlDqPAg8Z0mEQPXmBn4trbSd7A8bHMEgD6axpgnUc="; max-age=60; includeSubDomains"
Sonuç olarak başlık bilgisi istemciye gönderiliyor.
Not : Belirli bir süre sonra bu pin bilgisi tarayıcısında’un db sinde hash’lenecektir. Bu yüzden özellikle pin bilgisi girerken olabildiğince dikkatli olunuz. Aksi durumunda bu bilginin tutulma süresi (max-age)’i yüksek tuttuysanız sitenize erişemeyebilirsiniz. O yüzden ilk denemenizde max-age’i olabildiğince düşük tutmakta fayda var.
Örneğin Chrome’da pin işlemnin aktif olup olmadığını chrome://net-internals/#hsts ‘dan domainizi sorgulayarak dynamic_spki_hashes alınından görebilirsiniz. Örneğin aşağıda boş görünüyor. Yani yaptığımız işlem hala Chrome tarafından onaylanmamış.