19 Temmuz 2018 Perşembe

SSLSocketFactory Sınıfı - SSL İstemci Socket Yaratır

Giriş
Açıklaması şöyle
This class acts as a factory for creating secure sockets.
Bu sınıfı SSL istemci soketleri içindir.
SSL istemcisi SSLSocketFactory sınıfını kullanılır.
SSL sunucusu SSLServerSocketFactory sınıfını kullanır.

SSL soketinin çalışabilmesi için sunucu ve istemcinin "cipher suit" ve "session key" konusunda el sıkışması gerekir. Bu el sıkışma işlemi bir çok mesaj değiş tokuşu ile olur.

Sistem Ayarları - keystore
Açıklaması şöyle
If the server does client authentication, the client will need a key pair and a client certificate which is installed in the server's trust store,

Sistem Ayarları - truststore
Açıklaması şöyle
If the client wants to authenticate the server, then the client's trust store must contain the server's certificate.
Şöyle yaparız.
java -Djavax.net.ssl.trustStore=keystore_name 
     -Djavax.net.ssl.trustStorePassword=password
Ya da şöyle yaparız.
Properties systemProps = System.getProperties(); 
systemProps.put( "javax.net.ssl.trustStore", "/path/to/yourTruststore.jks");  
systemProps.put( "javax.net.ssl.trustStorePassword", "trustStorePassword");  
System.setProperties(systemProps);  
Ya da şöyle yaparız.
System.setProperty("javax.net.ssl.trustStore", path);
System.setProperty("javax.net.ssl.trustStorePassword", pwd)
Sistem Ayarları - keystore + truststore
Hem istemci hem de sunucu authentication yapar.

Şöyle yaparız.
System.setProperty("javax.net.debug", "all");
System.setProperty("javax.net.ssl.trustStore", "C:/clientcert.jk");
System.setProperty("javax.net.ssl.trustStorePassword", "allianzebcm");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");

//my certificate and password
System.setProperty("javax.net.ssl.keyStore", "C:/EBCM_Client_TEST.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "allianzebcm");
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
Ayrıca SSL hatalarını görmek için JVM'de -Djavax.net.debug=ssl anahtarını kullanmak faydalı oluyor.

Eğer truststore jar dosyası içindeyse şöyle yaparız.

1. Include the keystore in your JAR file as a resource, as you did for your images.
2. Access it via getResourceAsStream().
3. Use that InputStream to load a KeyStore.
4. Use the KeyStore to initialize a TrustManager.
5. Use the TrustManager to initialize an SSLContext.
6. Use the SSLContext to create your SSLSocketFactory.
7. Use the SSLSocketFactory to create your SSLSocket.

constructor - SSLContext ile yaratma
Bu sınıfı SSLContext tarafından yaratılır. Şöyle yaparız.
sslContext.getSocketFactory()...
constructor - HttpsURLConnection ile yaratma
Şöyle yaparız.
SSLSocketFactory factory = HttpsURLConnection.getDefaultSSLSocketFactory();
createServerSocket metodu
İstemci socket için şöyle yaparız.Örnek ver

createSocket metodu
İstemci socket için şöyle yaparız.
Socket s = socketFactory.createSocket();
createSocket metodu - host + port
İstemci socket için şöyle yaparız.
SSLSocket socket = (SSLSocket) sslfactory.createSocket("gmail.com", 443);
createSocket metodu - socket + host + port + autoClose
Örnek
İstemci socket için şöyle yaparız.
Socket socket = ...; 
String host=...;
int port=...;
boolean autoClose =...;
Socket s = socketFactory.createSocket(socket, host, port, autoClose);
Örnek
Şöyle yaparız.
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setEnabledProtocols(new String[] {"TLSv1.2"});
getDefault metodu
keytool -genkey -alias mystore -keystore my.store şeklinde bir store yaratırım.

İstemci için şöyle yaparız.
System.setProperty ("javax.net.ssl.trustStore","my.store");

Sunucu için şöyle yaparız.
System.setProperty ("javax.net.ssl.keyStore","my.store");
System.setProperty ("javax.net.ssl.keyStorePassword","password");

Bu sınıf abstract olduğu için şöyle yapamayız.
SSLSocketFactory socketFactory = new SSLSocketFactory(ks);
Şöyle yaparız.
SSLSocketFactory sslfactory = (SSLSocketFactory)SSLSocketFactory.getDefault();

Hiç yorum yok:

Yorum Gönder