27 Şubat 2017 Pazartesi

X509Certificate Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.security.cert.X509Certificate;
İlk X.509 standardı 1988 yılında yayınlandı ve bir çok RFC dokümanına yayılmış vaziyette. X.509 için 3 sürüm var. v1, v2 ve v3.

Bu sınıf CertificateFactory tarafından yaratılabilir.

Sertifika Zinciri
Şöyledir.
GeoTrust Global CA
   Google Internet Authority G2
      *.google.com
Issuer Name
CA adı

Private Key
Sertifikayı kullanan kişinin anahtarı

Public Key
Sertifikayı kullanan kişinin anahtarı

Serial Number
CA tarafından atanan seri numara.

Giriş
Şu satırı dahil ederiz.
import java.security.cert.X509Certificate;
Subject Name
Sertifikayı kullanan kişinin adı

Subject Alternative Name
Aynı serifikanın bir çok farklı alan ismi ile kullanılabilmesini sağlar.

ThumbPrint
Sertifikanın bir parçası değildir. tbsSertificate + signatureAlgorithm (CA tarafından imzalamak için kullanılan algoritma) + signatureValue değerlerinin tek yönlü bir hash'ten geçirilerek elde edilen değerdir. ThumbPrint sertifkaları kolayca aramak için kullanılır.

constructor
Şöyle yaparız.
CertificateFactory cf = ...;
X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream);
getEncoded metodu
byte[] döner. Şöyle yaparız.
cert.getEncoded()
getExtendedKeyUsage metodu
String döner.

getKeyUsage metodu
Örnek ver

getPublicKey metodu
PublicKey tipinden bir nesne döner. Şöyle yaparız.
RSAPublicKey eServer = (RSAPublicKey) cert.getPublicKey();
getSubjectX500Principal metodu
Şöyle yaparız.
X509Certificate cert = ...;       
X500Principal s = cert.getSubjectX500Principal();


SSLContext Sınıfı

Giriş
Şu satırı dahil ederiz.
import javax.net.ssl.SSLContext;
Bu sınıf https bağlantısı açmak için kullanılabilir. Şöyle yaparız.
HttpsURLConnection con = ...;
...
con.setSSLSocketFactory (sslContext.getSocketFactory()); 
constructor - apache
Şöyle yaparız.
TrustStrategy acceptingTrustStrategy = 
(X509Certificate[] chain, String authType) -> true;

SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
  .loadTrustMaterial(null, acceptingTrustStrategy)
  .build();
getInstance metodu
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("SSLv3");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("TLS");
Şöyle yaparız.
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
getSocketFactory metodu
Bu sınıftan SSLSocketFactory alınabilir.
sslContext.getSocketFactory()
Şöyle yapabiliriz.
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
init metodu - KeyManager
SSLContext socket yaratmadan önce ilklendirilir ve tekrar ilklendirmenin bir yolu yoktur. Bir KeyManager verebiliriz. Böylece belli bir sertifikayı kullanabiliriz.
KeyManagerFactory kmf = ...;
...
sc.init(kmf.getKeyManagers(), null, null );
init metodu - TrustManager
Bir TrustManager belirtebiliriz. Böylece hangi isim alanlarına güveneceğimiz belirtiriz. Şöyle yapabiliriz.
sslContext.init(null, new TrustManager[] { tm }, null);
İlaveten rastgele sayı üreteci de belirtebiliriz. Şöyle yaparız
sslContext.init(null, new TrustManager[] { tm },new SecureRandom());
Şöyle yaparız.
TrustManagerFactory tmf = ...;
sslContext.init(null, tmf.getTrustManagers(), null);

java komutu

Giriş
Söz dizimi şöyle
java [optionsclassname [args]
JAVA_HOME ortam değişkeni
JAVA_HOME scriptlerde kullanılmak üzere tanımlanan bir değişkenden ibaret. İsmi de geleneksel olarak böyle.

1. Tanımlama adımı
Script içinde tanımlamak istersek şöyle yaparız.
# export JAVA_HOME=...
Linux'ta sistem dosyasına yazmak istersek
/etc/environment veya ~/.bashrc dosyasına tanımlarız.

Windows'ta değişkene atanan yol şöyledir.
C:\Program Files (x86)\Java\jdk1.8.0_77
2. Daha sonra PATH'e dahil edilir (isteğe bağlı)
Linux'ta şöyle yaparız.
export PATH=$JAVA_HOME/bin:$PATH
ve java çağrılır.
java -version
3.  Ya da PATH'e dahil edilmeden kullanılır (isteğe bağlı)
Linux'ta şöyle yaparız.
${JAVA_HOME}/bin/java -version
Windows'ta şöyle yaparız.
%JAVA_HOME%\bin\java -version
CLASSPATH ortam değişkeni
Windows'ta CLASSPATH değişkenine atana yol şöyledir.
C:\...\jdk1.8.0_77\bin;C:\...\jre1.8.0_77\bin
-classpath (ya da -cp )seçeneği
Açıklaması şöyle
$ java -help
    …
    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
Kullanılacak jar dosyalarının dizinini verir.
bash$ java -classpath path/to/jars/directory MyMainClass
Windows'ta tek tırnak ile şöyle yaparız. Dizinler ; karakteri ile ayrılır
java -verbose -classpath '../lib;.' bt_sim <args>
Linux'ta dizinler : karakteri ile ayrılır.

Bu seçeneği kullanmak yerine CLASSPATH ortam değişkenini kullanmak daha iyi.
bash$ export CLASSPATH="path/to/jars/directory1:path/tojars/directory2"
bash$ javac MyMainClass.java
-de
Açıklaması şöyle
-da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
Assertleri kapatır.

-ea seçeneği
Açıklaması şöyle
-ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
Kod içindeki assertlerin çalışması için gerekir. Uzun hali -enableassertions seçeneğidir. Kod derleyici tarafından şu hale getirilir.
if (!cond)
    throw new AssertionError();
Eğer assert için mesaj kullanılırsa
assert d != null : "d is null";
Kod derleyici tarafından şu hale getirilir.
if ($assertionsEnabled && !(Expression1))
    throw new AssertionError(Expression2);
-D seçeneği
JVM'e parametre geçilebilir.
-Dfoo.bar=foobar
Kodda parametreye şöyle erişilir.
class Foo {
    private static final String BAR;
    static {
        String foobar = System.getProperty("foo.bar");
        if(foobar != null && foobar.length()>0) {
            BAR = foobar;
        } else {
            BAR = "somedefaultvalue";
        }
    }
}
Ayrıca JVM'in kullanacağı locale de belirtilir.
-Duser.language=de
-Duser.country=DE
-jar seçeneği - Executable Jar çalıştırmak
jar dosyasında Manifest varsa şöyle ve bu dosyada Main-Class satırı varsa şöyle yaparız.
java -jar path/to/jar/file
Eğer Manifest dosyası yoksa başlangıç sınıfını vermek gerekir.
java -cp path/to/jar/file MainClass
Elimizde şöyle bir dizin yapısı olsun
jar_root/
├── executable.jar
├── folder1/
    └── required_file1.txt

├── folder2/
    └── required_file2.txt

├── other_folder/
   └── ...
└── other_file.txt
executable.jar dosyasını çalıştırınca folder1/required_file1.txt dosyasını okumak istiyor olsun. Bu durumda harici bir dosya okuduğumuz için jar dosyası şöyle çalıştırılır. Önce jar'ın olduğu dizine gideriz. Sonra -jar seçeneği ile executable jar'ı çalıştırırız.
cd /path/to/jar_root/ 
java -jar executable.jar <options>
jar içindeki java kodu dosyayı muhtemelen şöyle açıyordur.
File file = new File("folder1", "required_file1")

-javaagent seçeneği
Şöyle yaparız.
java -javaagent:agent.jar -jar myApp.jar
-server seçeneği
Açıklaması şöyle
-server       to select the "server" VM
                  The default VM is server.
-X seçeneği
Açıklaması şöyle
-X            print help on non-standard options
-XaddExports
Java 9 (Jigsaw) ile standart olmayan sun.reflect.* gibi paketleri kullanabilmek için şöyle yaparız.
java -cp classes -XaddExports:java.base/sun.reflect Test
-Xms seçeneği
Kullanılacak en az heap büyüklüğünü ayarlar. Şöyle yaparız.
"%JAVA_HOME%\bin\java" ... -Xms256m ...
-Xmx seçeneği
Kullanılacak en fazla heap büyüklüğünü ayarlar. Şöyle yaparız.
"%JAVA_HOME%\bin\java" ... -Xmx512m ...
-Xss seçeneği
Kullanılacak stack büyüklüğü ayarlar.

-XX:HeapDumpOnCtrlBreak seçeneği
Şöyle yaparız.
-XX:+HeapDumpOnCtrlBreak writes heap dump together with thread dump on CTRL+BREAK
-XX:HeapDumpOnOutOfMemoryError seçeneği
Açıklaması şöyle
This will create a dump which can be analysed afterwards. The dump will be located at the location given at -XX:HeapDumpPath=some_path.
Şöyle yaparız.
-XX:+HeapDumpOnOutOfMemoryError writes heap dump on OutOfMemoryError (recommended)
-XX:MaxNewSize
Young generation için kullanılan en fazla heap büyüklüğünü ayarlar.

-XX:MaxPermSize
Java 8'den itibaren kaldırıldı. Şöyle yaparız.
"%JAVA_HOME%\bin\java" ... -XX:MaxPermSize=256m ...
-XX:NewSize
Young generation için kullanılan başlangıç heap büyüklüğünü ayarlar.

-XX:OnError=path_to_some_script.sh
Açıklaması şöyle
Same as -XX:OnOutofMemoryError before, but for more generic exceptions.
-XX:OnOutOfMemoryError=path_to_some_script.sh
Açıklaması şöyle
This will run a script (it must be runnable by the same user which runs the application) when the application returns an error as an OutOfMemory

-XX:+UseConcMarkSweepGC
Farklı bir garbage collector kullanmamızı sağlar. Şöyle yaparız.
-XX:+UseConcMarkSweepGC
-verbose seçeneği
Açıklaması şöyle
-verbose:[class|gc|jni]
                  enable verbose output
Daha detaylı çıktı üretir. Şöyle yaparız.
java -verbose ...
-version seçeneği
Açıklaması şöyle
-version      print product version and exit
Şöyle yaparız.
java -version
Çıktı olarak şunu alırız.
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)
Eğer java kurulu değilse Ubuntu'da şu çıktıyı alırız.
~$ java -version
The program 'java' can be found in the following packages:
 * default-jre
 * gcj-5-jre-headless
 * openjdk-8-jre-headless
 * gcj-4.8-jre-headless
 * gcj-4.9-jre-headless
 * openjdk-9-jre-headless
Try: sudo apt install <selected package>