Ubuntu 17.04/Tomcat 7 SSL Kurulumu

Back end tarafında ter dökenler bilir, SSL entegrasyonları (özellikle benim gibi terminal kullanıcıları için) biraz zaman alabiliyor. Web servisler noktasında Apple’in getirdiği “Abi HTTPS yoksa ben yokum.” dayatmasından sonra artık yazdığım her back end uygulamasına bir de SSL entegrasyonu yapma durumunda kaldım. Her ne kadar Android Developer olarak çalışsam da, G3Core oluşumumuzun tek back end ve Android geliştiricisiyim. İşler back end uygulaması geliştirmeye geldiginde sadece uygulamayı yazmaktan ziyade kendimi bir de sunucu konfigürasyonlarıyla uğraşırken buldum.

SSL’i doğru kurabilmek hakkaten de zaman ve dikkat gerektiyor. Doğru şekilde dökümante edilmezse, unutmanız çok olası. Çünkü bu işlemi bir kere yapıyorsunuz ve daha sonra odaklandığınız tek şey uygulamanın geliştirilme kısmı, dolayısıyla sertifikanız bayatlayana kadar pek dokunmuyorsunuz.

Hangi sağlayıcı? Nereden almalıyım?

İnternette çok çeşitli yerlerden bir SSL sertifikası alabiliyorsunuz, bu tamamen size kalmış. Ben, daha önceden yaptığımız bir uygulamamız için sertifika aldığım hostet.net’i kullandım, hostet.net bu konuda gördüğüm kadarıyla en uygun fiyata sertifika satan sağlayıcı. Önceki uygulamam için buradan iki senelik, bu aralar geliştirdiğim uygulama için ise bir senelik sertifika satın aldım. Ek olarak da domain satın alma işlemlerimi genelde Natro uzerinden yapıyorum. Şu anda sahip olduğum tüm domainleri Natro’dan aldım diyebilirim.

hostnet.net üzerinden iki defa RapidSSL sertifikası satın aldım. İşi çok iyi bilmezken de canlı yardımlarından ziyadesiyle yararlandım ve gerçekten yardımcı oldular. Bunlar haricinde bir önceki uygulamamız için Digital Ocean’da $20'lik bir sunucumuz var iken, yeni uygulamamızda Vultr’a geçmeye karar verdik. Digital Ocean’in verdiği sunucuyu yarı fiyatına veriyorlar ve şu ana kadar hiç sorun yaşamadım. Kontrol panellerinin -bir Digital Ocean kullanıcısı için- öğrenilmesi hiç de zor degil. Hatta aynısı diyebilirim.

Başlangıç Notları

Bir önceki için HTTPS konfigürasyonu yaparken hakikaten zorlanmıştım, çünkü daha önce hiç yapmamıştım ve sanırım iki günümü de yedi. İnternette sürekli bu işler için kaynak aradım ama hakikaten bir yazılan bir yazılanı tutmuyordu. En sonunda -nerede oldugunu hatırlamıyorum- bir sitede işin nasıl yapılacağını anlatan bir makale buldum -ancak o da pek işe yaradı diyemem-. Daha önceki kaynaklardan edindiğim bilgileri de bir araya getirip -hatta sertifikayı yeniden oluşturmaya kadar gitti bu- olayın özünü kavradım. Açıkçası belki benimle birlikte aynı zorluğu yaşamış olanlar olabilir diye düşündüm ve paylaşım vaktidir dedim.

Ben bu işi terminal üstünden yaptım, yine o şekilde anlatmaya çalışacağım. Genel olarak bir adet keystore (JKS) bir de CSR dosyasına ihtiyacımız olacak. Bu dosyaları sunucuya bağlanıp üretmemiz gerekiyor. JKS (Java KeyStore) dosyamız bizim sertifikayı ürettikten sonra sertifikayı içine gömeceğimiz ve Tomcat’e “Bak artık güvenlik bilgilerin burada.” diyeceğimiz dosya. CSR ise bu güvenlik bilgilerinin -daha doğrusu sertifikanın- nasıl üretileceğini ve neler içermesi gerektiğini söyleyen ve yine bizim üreteceğimiz bir dosya. Ben bunları “certificates” adlı bir dizinde tutuyorum.

Başlayalım

Öncelikle sertifikayı oluşturmak icin sağlayıcının web sayfasında işlemlere başlayın. İlk olarak sizden istenecek olan şey “Abi bana bir CSR ver” olacak. Bu işlem icin önce sunucuya bağlanıyoruz, eğer benim gibi bir “certificates” klasörü açıp orada oynarsanız daha derli toplu olacaktır herşey. Bu klasörü açtıktan sonra içine zıplıyoruz ve öncelikli olarak bir tane JKS dosyası oluşturuyoruz:

root@g3coreubuntu2:~/certificates# keytool -genkey -alias [siteadi.com] -keyalg RSA -keysize 2048 -keystore [siteadi].jks

Alias parametresinin olduğu yerlere sitenizin ismini yazın, -ben buna siteadi.com dedim şimdilik- buraya doğru sekilde alias (sitenizin ismi) vermeniz çok onemli. Çünkü ilerideki hersey buna bağlı. Bu işlem sonrasında aşağıdaki sorular karşınıza gelecek, unutmayın alias’a verdiğiniz isim önemli ve onu kullanacağız.

Enter keystore password: [belirlediğiniz password]
Re-enter new password: [belirlediğiniz password tekrar]
What is your first and last name?
 [Unknown]: www.[siteadi].com
What is the name of your organizational unit?
 [Unknown]: www.[siteadi].com
What is the name of your organization?
 [Unknown]: www.[siteadi].com
What is the name of your City or Locality?
 [Unknown]: istanbul
What is the name of your State or Province?
 [Unknown]: istanbul
What is the two-letter country code for this unit?
 [Unknown]: TR
Is CN=www.[siteadi].com, OU=www.[siteadi].com, O=www.[siteadi].com, L=istanbul, ST=istanbul, C=TR correct?
 [no]: yes
Enter key password for <tomcat>
 (RETURN if same as keystore password):

İşlem bittikten sonra elimizde bir tane JKS dosyası olacak. Bu dosyanın içinde şu anda bir sertifika bilgisi yok, bu arkadaş önemli, bunu saklıyoruz, zira bu dosya herşeyimiz olacak birazdan. Sırada CSR (Certificate Signing Request) dosyamızı oluşturmak var:

keytool -certreq -alias [siteadi.com] -file siteadi_csr.txt -keystore siteadi.jks

CSR dosyamızı oluştururken önemli olan yukarıda JKS oluştururken kullandığımız aynı alias bilgisini kullanmak. CSR dosyamızı da oluşturduktan sonra satın alacağımız saglayıcının paneline geri dönebiliriz. Burada bizden az önce oluşturduğumuz CSR’in içeriğini istiyor olacak. Terminalde ben bunu vi siteadi_csr.txt diyerek açıyorum ve içeriğine ulaşabiliyorum. İçeriğini alın ve sağlayıcının sizden talep ettigi yere kopyalayın. Burada dikkat etmeniz gereken bir nokta var, CSR içeriğine göz atın, benim oluşturduğumda her satır sonunda “^M” şeklinde ekstradan iki karakter vardi ve ben bunları manuel olarak sildim -sadece sağlayıcının istediği yere kopyalarken, orijinal dosya aynen kalacak-. Zaten bunları kaldırmadığınızda sağlayıcı tarafında bir sonraki aşamaya geçerken hata alıyor olacaksınız.

Kopyalama işlemi bittikten sonra, sağlayıcı bize “Authentication işlemini nasıl yapayım birader?” diye bir soru soracak. Burada birkaç seçeneğiniz var, dosya ile, CNAME kayıtları ile, mail yolu ile vs. -ben mail yoluyla ilerlemeyi seçtim, yazının devamında da bunu anlatıyor olacağım-. Mail kısmında hemen Natro’ya geri döndüm, ve tarayıcımın bir tab’ında da bedava mail hosting hizmeti veren -en fazla 5 adres- zoho.com’u açtım. Zoho üstünden mail kurulumu gerçekten çok basit -bu başka bir post konusu olabilir bu arada-. Zoho domaininize ait mailin kurulumu icin sizi adım adım yönlendiriyor. Tek yapmanız gereken Zoho’nun size şuraya yönlendir dediği MX kayıtlarına domaininizi satın aldığınız yerden yönlendirme yapmak.

Zoho üstünden yönlendirme bittikten sonra, SSL sağlayıcımıza geri dönüyoruz. Ben administrator@siteadi.com seklinde bir mail tanımladım Zoho üstünden. Sağlayıcı authentication için nereye mail almak istediğimizi sorduğunda bunu işaretleyip devam edeceğiz. Bu işlemden biraz sonra -eğer yönlendirmeleriniz doğru ise- Zoho mail kutunuza SSL sertifikalarınızı indirebileceğiniz linkler gelecek. Bu linklerden dosyaları indirmek üzere gönderilene tıklayın ve sayfa açılsın.

Format Seçimi ve Sertifika Entegrasyonu

Açılan sayfada 2 tur sertifika indirme seçeneğimiz var, biri standart .cer uzantılı sertifikaları -3 arkadas geliyor bunlar, intermediate, root ve server- indirebileceğimiz link, biri de asıl bizim kullanacağımız PKCS7 dosyasının bulunduğu link. Buradan Tomcat ve IIS icin gerekli olan formatı -PKCS7- seçip indir diyoruz. Burada bir kontrol edin, indirme işlemi bittikten sonra elimizde bir tane P7S uzantılı bir dosya olması gerekiyor. scp yardımıyla dosyalarımızı sunucuya aktarıyoruz.

Burada işin büyük kısmı bitmiş oluyor. Artık yazının başında da bahsettigim JKS dosyamıza bu sertifika bilgimizin olduğu dosyayı tanıtma vakti geldi. Aktarma işlemine başlayabiliriz:

keytool -import -trustcacerts -alias [siteadi.com] -file [siteadi].p7s -keystore [siteadi].jks

Bu kod parçası az önce sunucuya aktardığımız ve içinde SSL bilgilerimizin olduğu dosyanın içeriğini keystore dosyamıza aktarmak için kullandığımız bir kod. Bu işlemden sonra JKS dosyamız bize şunu diyecek:

Enter keystore password: [JKS_PASSWORD]
Certificate reply was installed in keystore

Burada da görüldüğü üzere, önce bizden password istendi ve herşey yolunda ise, sertifika tanımları JKS içine eklenmiş oldu. Artık geriye tek birşey kalıyor, Tomcat konfigürasyonunu tamamlamak.

Tomcat Ayarları

JKS dosyamıza sertifikamızı entegre ettikten sonra dönüyoruz Tomcat’in server.xml dosyasının bulunduğu dizine -genelde conf/server.xml şeklindedir-. Bu dosyanın içeriğine de vi server.xml diyerek ulaşıyoruz. Burada 8080 portunun default HTTP portu olarak kullanıldığını göreceksiniz. Ben bunu default 80'e, ayni bloktaki HTTPS icin kullanılan 8443 portunu da default HTTPS hizmetinin verildiği 443'e çekiyorum. Sonrasında da şunu ekliyorum:

<Connector port=”443" protocol=”HTTP/1.1" SSLEnabled=”true”
 maxThreads=”150" scheme=”https” secure=”true”
 clientAuth=”false” sslProtocol=”TLS”
 keystoreFile=”/root/certificates/[siteadi].jks”
 keystorePass=”[JKS_PASSWORD]” />

Bu kod Tomcat’e default HTTPS portunun artık 443 olduğunu, bu porta gelen istekler icin de az önce içini doldurduğumuz JKS dosyasının kullanılacağını söylüyor. server.xml dosyasını bu şekilde düzenledikten sonra kaydedip çıkabiliriz. Sonrasında da Tomcat’i bir restart etmemiz gerekiyor.

Son Dokunuşlar

Sunucumuz artık HTTPS hizmeti vermeye hazır ve biz bunu görmek istiyoruz. Ama bir dakika! Domain sağlayıcınızdan domaininizi yönlendirmeniz gerek. Aksi takdirde tarayıcınıza gidip adres çubuğuna sunucunuzun IP’sini yazıp HTTPS görmeyi beklerseniz, hayal kırıklığına uğrarsınız. Unutmayın, o sertifikayı siteadi.com için aldınız.

Yönlendirmenizi yaptıktan sonra, back end uygulamanızda ‘secure’ olarak tanımlamak istediğiniz servisler/sayfalar olacaktır. Ben admin paneli ve REST servisleri secure olarak tanımlıyorum. Bunun için tek yapmanız gereken şey projenizin web.xml dosyasını bulun ve şunları ekleyin:

<security-constraint>
 <web-resource-collection>
 <web-resource-name>SiteAdi Secured Resources</web-resource-name>
 <url-pattern>/rest/*</url-pattern>
 <url-pattern>/panel/*</url-pattern>
 </web-resource-collection>
 <user-data-constraint>
 <transport-guarantee>CONFIDENTIAL</transport-guarantee>
 </user-data-constraint>
 </security-constraint>

Buradaki kod Tomcat’e rest ve panel ibaresi içeren URL’lerin artık HTTPS gerektirdiğini anlatmakta. Projeyi bu şekilde deploy ettikten sonra artık gönül rahatlığıyla HTTPS kullanabilir durumda oluyoruz.


Özetlemek gerekirse Tomcat’te HTTPS işlemleri biraz uzun bir süreç ve bir o kadar da karmaşık. Ama bu yazının -hatasıyla sevabıyla- benim gibi bu işten daha önce muzdarip olanların imdadına yetişeceğini düşünüyorum. Tekrardan back end/mobile deneyimlerimi paylaşabileceğim başka bir yazımda görüşmek üzere.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.