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:
Bu ve benzeri tüm tanımlar için ÇözümPark Bilişim Sözlüğünü Kullanabilirsiniz.
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;
- Manuel olarak oluşturacağımız TrustStore’da
- 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”
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@
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:
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@
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.
CA’in Root ve Intermediate Sertifikaları:
comodo-root.cer ve comodo-intermediate.cer
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.
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”
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@
keytool –import –trustcacerts –alias comodo-intermediate -file comodo-intermediate.cer -keystore “C:\Cagatay\TrustedMakale.jks” -storepass ikaru5@
Yüklü sertifikaları listeleme
TrustStore içeriğini kontrol ediyoruz:
keytool -list -v -keystore TrustedMakale.jks -storepass ikaru5@ > cagatayTrusted.txt
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@
İşlem sonrası TrustedMakale.jks içeriğine bakalım:
keytool -list -v -keystore TrustedMakale.jks -storepass ikaru5@ > cagatayTrusted.txt
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
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.