Month: May 2016

Java Uygulama için Api’ın Geçerli Sertifika Dosyasını Set Etmek

Https protokolü ile SaaS hizmet sağlayan https://api1.paritus.com servisi mevcut. Bu servisin cevabını, yazmış olduğumuz bir java uygulaması içinde kullanmayı planlıyoruz. Jackson – JaxRS, Jersey-Client veya başka bir rest client kütüphanesi kullanarak normal bir http isteğini handle edebiliriz. Ama iş https üzerinden veri çekmeye gelince java tarafında daha önce karşılaşmadığım javax.net.ssl.SSLHandshakeException hatası ile karşılaştım.

Biraz araştırınca .Net tarafında da benzer problemler olduğunu, .Net tarafında aşağıdaki gibi bir yöntem ile kod içinde çözülebildiğini gördüm.

//System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object s, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) { return true; };

Java tarafında daha farklı çözümler varmış. Biri application server’ın conf/server.xml konfigurasyon dosyası üzerinde cert dosyasını tanımlamak. Diğeri ise uygulamanın çalışacağı java’nın keystore dosyasına api1.paritus.com’un .cer dosyasını import etmek. Ben ikincisini uyguladığımdan onu açıklayacağım.

Öncelikle api1.paritus.com’un kullandığı sertifikayı tarayıcı üzerinden görüntüleyip exportunu alıyoruz. Aşağıdaki .cer dosyası tarayı üzerinden inmiş sertifika bilgi dosyasıdır.

./jre_linux/bin/keytool -import -noprompt -trustcacerts -alias api1.paritus.com -file ../api1_paritus_com.cer -keystore ./jre_linux/lib/security/cacerts -storepass changeit

Yukarda “keytool” u kullanarak güvenilir ca sertifikalarına yenisini ekliyoruz. Alias ile bir isim veriyoruz. file ile tarayıcıdan indirdiğimiz sertifika bilgi dosyasını belirtiyoruz. keystore ile ca sertifikalarının olduğu caCerts dosyasını belirtiyoruz.

Bundan sonra kodu geliştirdiğimiz ortamı veya kodun çalıştığı application server’i restart ediyoruz ve handshake hatasını almayıp kodumuzun başarılı çalıştığını görüyoruz.

Not: linux ve windows makine üzerinde aynı komutu çalıştırdım. Problem yaşamadım. Sormak istediğiniz birşey olursa sefersezer@gmail.com adresime mail atabilirsiniz.

Saygılarımla

Advertisements

Blog Başlıkları

Merhabalar,

Aklımda yüze yakın sayıda blog konusu var. Bunları yazmak isterim ama tipik Y kuşağı insanı olduğumdan hiçbirşey yapmamak daha cazip geliyor.

Tabi, o kadar da değil; yazıcam bu blogları. Buraya aklımdaki blog başlıklarını not etmek, ilerde de yazdıkça burada üzerini çizmek istiyorum.

Listeye şöyle başlıyorum:

  • Arduino İle Digital Port Dinlemek
  • Maven Parent <> Dependency Versiyon İlişkisi
  • Maven Deneyimlerim
  • Jenkins Hakkındaki Yorumlarım
  • Docker Hakkındaki Yorumlarım
  • Coordinate Clustering (DBSCAN Algorithm)

İlk Spring Boot Uygulaması

Bu yazıdaki hedefimiz spring boot’un derinlerine inmek değil, hello-world uygulama yazıp, çalıştırılabilir .jar olarak paketleyip servisin çalışırlığını test etmektir.

Başlamadan önce biraz bahsetmek isterim. Spring boot, eskide kalan ve uygulama sunucusuna ihtiyaç duyan .war paketi yerine tüm ihtiyaçlarını .jar paketi içinde toparlamayı sağlayan bir Spring framework kütüphanesidir. En temel özelliği, yazılacak uygulamanın servis katmanını, istenilen methodlar veya interface method signature’ları üzerindeki notasyonlar ile kolaylıkla yönetebilmektir.

Hızlıca günün gereksinimlerini açıklayayım:

  • maven 3.0 +

  • java 1.8

  • Ide (eclipse)

1. Method ve Notasyonları

Klasik bir maven projesi oluşturup, “hello-world” yazdırabilmek için App.java sınıfını şu şekilde düzenliyoruz. Daha başka konfigurasyona ihtiyaç duymadan servisimizi kullanılabilir hale getiriyoruz…

Aşağıdaki commentlerde hangi satırın ne işe yaradığı açıklanmaktadır.

@EnableAutoConfiguration
@RestController
public class App {
public static void main(String[] args) { // starter method
SpringApplication.run(App.class, args); // spring boot uygulaması burada tetikleniyor.
}

@RequestMapping(“/”) // request mapping sağlanıyor. şimdilik sadece root dizininde, parametresiz, yalın bir çağırım gerçekleştiriliyor.
public String home() {
return “Hello Docker World”;
}
}

2. Bağımlılıklar ve Parent

Kodu yazdıktan sonra .pom dosyasına sadece şu dependency’leri eklememiz yeterli olacaktır:

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.3.3.RELEASE</version>
</dependency>

Projenin parent’i olarak spring-boot-starter-parent belirliyoruz. Bu parent projenin .jar olarak start edilebilmesini sağlayacak olan manifestleri içermektedir. Bir konfigurasyon beklememektedir. Eğer parent’i eklemek istemezseniz manifest ve diğer konfigurasyonları manuel yapmanız gerekecektir. <dependencies> node’unun üstüne / dışına yazmamız uygun olacaktır.

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
</parent>

Eğer “parent kullanmak istemiyorum. Projemdeki jpa’nın persistence dosyası veya diğer bağımlılıklar ile çakışmalar yaratıyor” diyorsanız spring-boot-maven-plugin eklentisini aşağıdaki ikinci yöntem gibi düzenleyebilirsiniz.

3. Plugin’ler

Aşağıda targetteki java sürümünü 1.8 olarak belirlememizi sağlayan compiler plugin ve spring boot’u executable package haline getirmemizi sağlayan eklentiler yer almaktadır.

Maven compiler plugin, projenin diğer bağımlılıklarını .jar dosyasına include etmeyi sağlar. Ayrıca bu plugin ile compiling jre version belirlenebilir.

<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

Parent’i kullanıyorsanız:

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin></plugins></build>

Parent’i kullanmadan:

<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.3.5.RELEASE</version>
<configuration>
<mainClass>com.test.App</mainClass>
<finalName>${project.build.finalname}</finalName>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>

Yukarda spring-boot ile paketleme işlemi yaptık. Normal paketleme executable package oluşturamıyor; spring boot’a özel paketleme gerekiyor. Ayrıca yukarıda görüldüğü gibi bir main class ve harici output dir verilebiliyor.

4. Packaging

Benim kullandığım projede “jpa ile ilgili problemlerimi” görmezden gelirsek, sadece mvn package çalıştırarak paketimizi oluşturabiliyoruz.

mvn clean package spring-boot:repackage

5. Start

Sonrasında windows konsolu, linux konsolu veya Jenkins CI Tool ile aşağıdaki kodu tetikleyerek servisi çalışır hale getirebiliriz.

java -jar bootsample.jar

Not: Ben docker içinde kullanacağım için işim henüz bitmedi. Docker’in image’ında çalışma ortam bilgileri de set edilmesi gerekiyormuş… araştırmaya devam edeceğim ve bir container içinde harici kaynaklar ile çalışan bir uygulama yazacağım.

Saygılarımla

sefersezer@gmail.com