Ara
12
2017

HSM Makinasına Crypto Kullanıcı Parolası ile Bağlantı Kurma PKCS11 Keystore Okuma Problemi Çözümü

Merhaba,
Bu yazımda HSM (Hardware Security Module) cihazı (Safenet Luna – Üretici : Gemalto) üzerinde ayarları token üzerinde ve kullanıcı yetkileri düzgün verilmiş ancak imzalama işlemleri için gerekli java Keystore okuması sırasında CKR_PIN_INVALID hatasının çözümü aşağıdaki şekilde bir workaround ile yapılmaktadır.

Admin parolası ile sağlıklı bir şekilde yapılan işlemler Crypto user parolası ile yapılamamaktadır.

PKCS11 kütüphanesi ile jenerik Keystore işlemleri yapılmaktadır.

HSM in PKCS11 arayüzünü desteklemesi teoride aşağıdaki workarround un farklı üreticilerin HSM cihazlarında da çalışacağı anlamına gelir.

Aşağıdaki kod Admin parolası ile düzgün çalışmaktadır. (java Keystore dan instance alıp Load etme işlemi ardından bağlanılan slottaki key aliaslarını listeler)
Ancak Crypto user parolası ile calıştırıldığında keyStore.load islemi sırasında CKR_PIN_INVALID vermektedir.

 
import JAVA.io.ByteArrayInputStream;
import JAVA.security.KeyStore;
import JAVA.security.Provider;
import JAVA.security.Security;
import JAVA.util.Enumeration;
 
PUBLIC class HSMTest {
 
    PUBLIC static void main(String args[]) throws EXCEPTION {
 
        String passWord = "";
        String soDirectory = "";
        String pkcs11Cfg
                = "name = " + "USER-PKCS11" + "\n" + "library = " + soDirectory + "\nslotListIndex = 5" + "\n";
        byte[] pkcs11CfgBytes = pkcs11Cfg.getBytes();
        ByteArrayInputStream cfgStream
                = NEW ByteArrayInputStream(pkcs11CfgBytes);
 
        Provider pkcs11Provider = NEW sun.security.pkcs11.SunPKCS11(cfgStream);
 
        Security.addProvider(pkcs11Provider);
 
        KeyStore keyStore = KeyStore.getInstance("PKCS11", pkcs11Provider);
 
        keyStore.load(NULL, passWord.toCharArray());
 
        Enumeration aliases = keyStore.aliases();
        WHILE (aliases.hasMoreElements()) {
            String alias = aliases.nextElement().toString();
            System.OUT.println("alias:" + alias);
        }
 
    }
}

Hatanın çözümü için aşağıdaki şekilde PKCS11 wrapper kütüphanesi kullanılarak native olarak (Crypto User a ait constant id yi verip ) Crypto kullanıcısı ile bağlanarak işlemler yapıldığında keyStore.load ile verilen parolayı Crypto User ID si override edildiği için kabul etmektedir.

 
 
import JAVA.io.ByteArrayInputStream;
import JAVA.security.KeyStore;
import JAVA.security.Provider;
import JAVA.security.Security;
import JAVA.util.Enumeration;
import JAVA.io.IOException;
import sun.security.pkcs11.wrapper.*;
 
PUBLIC class HSMTest {
 
    PUBLIC static void main(String args[]) throws EXCEPTION {
 
        int slotId = 0;
        String passWord = "";
        String soDirectory = "";
 
 
        PKCS11 p11 = PKCS11.getInstance(soDirectory, "C_GetFunctionList", NEW CK_C_INITIALIZE_ARGS(), FALSE);
 
        LONG hSession = p11.C_OpenSession(slotId, PKCS11Constants.CKF_SERIAL_SESSION | PKCS11Constants.CKF_RW_SESSION, NULL, NULL);
 
        //Login AS Crypto USER => 2147483649L
        p11.C_Login(hSession,2147483649L, passWord.toCharArray());  
/**************************************************************************************************************************/        
 
                    String pkcs11Cfg
                            = "name = " + "USER-PKCS11" + "\n" + "library = " + soDirectory + "\nslotListIndex = " + slotId + "\n";
                    byte[] pkcs11CfgBytes = pkcs11Cfg.getBytes();
                    ByteArrayInputStream cfgStream
                            = NEW ByteArrayInputStream(pkcs11CfgBytes);
 
                    Provider pkcs11Provider = NEW sun.security.pkcs11.SunPKCS11(cfgStream);
 
                    Security.addProvider(pkcs11Provider);
 
                    KeyStore keyStore = KeyStore.getInstance("PKCS11", pkcs11Provider);
 
                    keyStore.load(NULL, passWord.toCharArray());
 
                    Enumeration aliases = keyStore.aliases();
                    WHILE (aliases.hasMoreElements()) {
                        String alias = aliases.nextElement().toString();
                        System.OUT.println("alias:" + alias);
                    }
/**************************************************************************************************************************/
        p11.C_Logout(hSession);
	p11.C_CloseSession(hSession);
        p11.C_Finalize(NULL);
 
 
    }
}

Crypto kallanıcı parolası ile C_Login ve C_Logout arasında keyStore load işlemi başarıyla yapılmaktadır.

Mustafa Korkmaz

Oracle Applications Developer at Partnera
2005 yılında Dokuz Eylül Üniversitesi Endüstri Mühendisliğinden Mezun
Oldu, 2011 Yılında Ahmet Yesevi Üniversitesi Bilgisayar Mühendisliğinde
Yüksek Lisansını Tamamlandı,2012 Yılında Doğuş Üniversitesinde Bilgisayar
Mühendisliği Doktora Eğitimine Başladı.10 yılı aşkın bir zamandır Oracle
Ürünleri Uygulama Yazılım Uzmanı Olarak profesyonel kariyerine devam
etmektedir. İlgi alanları Middleware, CI/CD,
Oracle Database , PL/SQL , Java , Makine Öğrenmesi ve Veri Madenciliği alanlarındadır.
2 versiyon Oracle Database ' (10g, 11g) inde OCA(Oracle Certificate Associate) ve
PL/SQL Certificated Professional ünvanları bulunmaktadır.
Mail: mustafakorkmz@gmail.com
Mustafa Korkmaz


Yorum yapın

*