Güvenlik

Java Uygulamalarında SSL Sertifika Yönetimi

En değerli varlığımız olan verinin güvenli yöntemlerle işlenmesini sağlamak dikkat etmemiz gereken en önemli noktalardan biridir. Çoğu kurumda, veritabanlarında depolanan bilgiye erişim uygulama sunucuları üzerinde çalışan uygulamalar üzerinden yapılmaktadır.

Bu makalemizde, Java tabanlı uygulamalarda kullanılan SSL Sertifikaların yönetilmesinden bahsedeceğiz. Öncelikle, ssl sertifikalar ile ilgili temel kavramları açıklayarak başlayalım:

CA – Certification Authority : Sertifika Otoritesi, sertifika vermeye yetkili kurum

RA – Registration Authority:  Sertifika talebinde bulunan kişi/kurumun kimlik bilgilerini doğrulayan yerel kurum

CRL – Certificate Revocation List: Sertifikaların geçerlilik sürelerinin takip edildiği liste

Private Key: Kişiye/Kuruma özel, kesinlikle başkalarıyla paylaşılmaması gereken şifreleme anahtarı

Public Key: Kişiye/Kuruma özel, başkalarının da erişebildiği şifreleme anahtarı

Sertifika: Public Key + Dijital İmza

Root ve Intermediate Sertifikalar: Kişi/kurum sertifikasını doğrulamak için kullanılan CA sertifikaları

Dijital İmza: Sertifika talebinde bulunan kişi/kurumun Public Key Hashi’nin CA’in Private Keyi ile şifrelenmesi (imzalanması) işlemi.

CSR – Certificate Signing Request: Private kullanılarak oluşturulacak public key’in CA tarafından imzalanması için gönderilen sertifika imzalama isteği (*.csr)

KeyStore: Private key ve sertifikaları içeren Java’ya özel dosya (*.jks)

TrustStore: Kişi/kurum sertifikalarını doğrulamak için kullanılacak genellikle CA’in root ve intermediate sertifikalarını içeren Java’ya özel dosya(*.jks) .(Internal root CA sertifikalarını da içerebilir)

Java uygulama kodunda kullanılacak SSL sertifikalar, Keystore (*.jks) adı verilen dosyalarda tutulur. Bu sertifikaları doğrulamak için kullanılan CA’in root ve intermediate sertifikalarının uygulama sunucusunda (AS – Application Server) olması gerekir. Bunun için iki yöntem vardır;

    1. Manuel olarak oluşturacağımız TrustStore’da
  1. Uygulama sunucusunun Default Trustore’unda

Bu makalede, (a.) yöntemi seçilmiştir. Java uygulama kodunda, kullanacağımız sertifikanın KeyStore’da, sertifikamızı doğrulamak için kullanılacak CA root ve intermediate sertifikalarının da manuel yarattığımız TrustStore içinde olduğunu belirteceğiz. (Bknz “İlgili Kod Parçacığı” bölümü).

(b.) yöntemi kullanıldığında, CA’in root ve intermediate sertifikaların uygulama sunucusu yönetim ara yüzünden Default TrustStore’a yüklenmesi gerekir.

Gerçekleştireceğimiz işlemler:

1.)    Keystore ve keystore içinde bir Private Key oluşturulması

2.)    Private key kullanılarak CSR oluşturulması, CSR’ın kontrol edilmesi ve imzalanmak üzere CA’ya gönderilmesi

3.)    CA’dan gelen sertifikanın Keystore import edilmesi

4.)    CA’in root ve intermediate sertifikalarının import edilmesi için TrustStore oluşturulması ve CA sertifikalarının import edilmesi (sertifikamız bu CA sertifikaları ile doğrulanır)

5.)    TrustStore içindeki kullanılmayacak private key’in silinmesi

6.)    Store içindeki nesneleri export edilmesi

7.)    Java kod parçacığı ve/veya uygulama sunucusu üzerinde yapılması gereken değişiklikler

Java SSL Sertifika işlemleri için “keytool” uygulamasını kullanıyoruz. Varsayılan olarak aşağıdaki path’de olan uygulamayı (işletim sistemine ve kurulum ayarlarınıza göre değişebilir), işletim sisteminizde path variable olarak eklerseniz istediğiniz dizinde bu işlemleri gerçekleştirebilirsiniz.

C:\Program Files\Java\jre6\bin

Store içindeki nesnelere erişim “alias” adı verilen parametreler ile gerçekleştirilir.

1.)    JKS + Private Key Oluşturma

2048 bitlik, RSA algoritması kullanan, KeyStore şifresi “ikaru55@”, Private key şifresi “5uraki@”, Common Name: Elma olan Makale.jks keystore’u oluşturmak için aşağıdaki komutu kullanıyoruz:

Burada, elma vb örnek olarak kullanılmıştır. Uygulama.kurum.com.tr vb olarak gerçek ortamlarda kullanılabilir.

keytool.exe -genkey -keystore “C:\Cagatay\Makale.jks” -alias Makale -storepass ikaru5@ -keypass 5uraki@ -keyalg RSA -keysize 2048 -dname “CN=Elma, OU=Bank AS, O=Cagatay”

image001

2.)    CSR oluşturma + Kontrol Etme + CA’ya gönderme

KeyStore içindeki Private Key’imizi kullanarak CA’ya sertifika imzalama isteği (makale.csr) gönderiyoruz. Aslında CA yerine, RA’ya gönderiyoruz. RA, bizim gerçekten o sertifikayı almaya yetkili olup olmadığımızı imza sirküleri, ticaret sicil gazetesi vb kontroller ile gerçekleştirir. Uygun bulunursa sertifikamız gönderilir.

keytool -certreq -alias Makale -file Makale.csr -keystore Makele.jks -storepass ikaru5@ -keypass 5uraki@

image002

Oluşturduğumuz CSR’ı kontrol etmek için metin editörü ile açıp http://www.sslshopper.com/csr-decoder.html linkindeki uygulamayı kullarak kontrol ediyoruz:

image003

image004

Doğrulama işlemi için internette farklı kaynaklar da mevcuttur.

3.)    CA’den Gelen Sertifikayı KeyStore’a Import Etme

Store içindeki key ve sertifikalara erişim “alias” kullanılarak gerçekleştirilir.

CA tarafından imzalanan sertifika (Makale_Sertifika.cer) tarafımıza ulaştığında, KeyStore’a import ediyoruz:

keytool –import –trustcacerts –alias Makale_Sertifika -file Makale_Sertifika.cer -keystore “C:\Cagatay\Makale.jks” -storepass ikaru5@

image005

image006

Sertifikamızla beraber, CA’in root ve intermediate sertifikalarını edinmemiz gerekir. Bu sertifikaları da makalemizin ilerleyen bölümlerinde TrustStore’a import edeceğiz. Sertifikamız, CA sertifikaları ile doğrulanacak. Makalemizde, CA olarak COMODO seçilmiştir.

image007

image008

CA’in Root ve Intermediate Sertifikaları:

comodo-root.cer ve comodo-intermediate.cer

image009

image010

Yüklü key ve sertifikaları listeleme

Sertifikamızı Makale.jks keystore’umuza import etmiştik. Şimdi, Makale.jks içeriğini cagatay.txt’ye yazdırıp kontrol edelim:

keytool -list -v -keystore Makale.jks -storepass ikaru5@ > cagatay.txt

Dosyaya yazdırmadığımız durumda (>cagatay.txt olmadan),  sonucu ekrana basacağından çok sayıda sertfika ve key olduğunda kontrol daha zor olacaktır.

image011

Alias=makale nesnesi, entry type değerinden de görüleceği üzere Privata Key’imiz, makale_sertifika ise CA’in (Comodo) imzaladığı sertifikamızdır.

4.)    TrustStore Oluşturarak CA Sertifikalarının Import Edilmesi

Sertifikamızı doğrulamak için kullanacağımız CA root ve intermediate sertifikalarını içeren TrustStore oluşturmak için aşağıdaki komutu kullanıyoruz:

keytool.exe -genkey -keystore “C:\Cagatay\TrustedMakale.jks” -alias TrustedMakale -storepass ikaru5@ -keypass 5uraki@ -keyalg RSA -keysize 2048 -dname “CN=Elma, OU=Bank AS, O=Cagatay”

image012

Root CA sertifikalarını TrustStore’a import etme

CA root ve intermediate sertifikalarını TrustStore’a import ediyoruz:

keytool –import –trustcacerts –alias comodo-root  -file comodo-root.cer -keystore “C:\Cagatay\TrustedMakale.jks” -storepass ikaru5@

image013

keytool –import –trustcacerts –alias comodo-intermediate -file comodo-intermediate.cer -keystore “C:\Cagatay\TrustedMakale.jks” -storepass ikaru5@

image014

Yüklü sertifikaları listeleme

TrustStore içeriğini kontrol ediyoruz:

keytool -list -v -keystore TrustedMakale.jks -storepass ikaru5@ > cagatayTrusted.txt

image015

image016

TrustStore içinde (trustedmakale.jks) üç nesne bulunuyor. Alias=Trustedmakale nesnesi örnek amaçlı yaratılmış private key. Kullanmayacağımız için silmemiz gerekiyor.

5.)    Private key’i silme

Alias=Trustedmakale private key nesnesini aşağıdaki komut ile siliyoruz:

keytool -delete -alias TrustedMakale -keystore Trustedmakale.jks -storepass ikaru5@

image017

İşlem sonrası TrustedMakale.jks içeriğine bakalım:

keytool -list -v -keystore TrustedMakale.jks -storepass ikaru5@ > cagatayTrusted.txt

image018

TrustStore oluştururken –genkey parametresini kullanmasaydık private key oluşturulmayacaktı. Jks içinden nesne silmeyi (alias kullanarak) göstermek için bu şekilde oluşturulmuştur.

Son Durum

image019

6.)    Store İçindeki Key/Certificate Nesnelerinin Export Edilmesi

Store içindeki key ve sertifikaları export etmek için –export switchini kullanabiliriz:

keytool -export -alias makale_sertifika -file makale_sertifika.cer -keystore Makale.jks -storepass ikaru5@

7.)    İlgili Kod Parçacığı

Artık, java uygulama kodumuz içinde aşağıdaki tanımlamaları yaparak uygulamamızın CA tarafından imzalanmış SSL sertifikası kullanmasını sağlayabiliriz.

props.setProperty(“javax.net.ssl.keyStore”          , local path of jks file that holds private key);

props.setProperty(“javax.net.ssl.keyStorePassword”   , private keystore file storepassword);

props.setProperty(“javax.net.ssl.keyStoreType”       ,”JKS”);

props.setProperty(“javax.net.ssl.trustStore”          , local path of jks file that holds private key);

props.setProperty(“javax.net.ssl.trustStorePassword”   , private keystore file storepassword);

props.setProperty(“javax.net.ssl.trustStoreType”       ,”JKS”);

Makalemizin başında belirttiğimiz gibi, TrustStore kullanmak zorunda değildik. Uygulama sunucusunun default TrustStore’una CA’in root ve intermediate sertifikalarını yönetim arayüzünden import edip java uygulama kodu içindeki trustStoreType içeren satırları silerek de kullanabilirdik. Her iki yöntemi de anlatmak için bu şekilde uyguladık.

İlgili Makaleler

Bir yanıt yazın

Başa dön tuşu