2014-01-18 4 views
2

SoftHSM을 사용 중이며 토큰에 키를 생성하고 저장할 수 있습니다. SunPKCS 인터페이스를 사용하려면 많은 메소드가 세션 핸들을 필요로하며,이를 검색하는 방법이 손실됩니다. 현재 SoftHSM과 PKCS11을 다음과 같이 사용하고 있습니다. 코멘트 내에있는 코드는 SUNPKCS11 인터페이스 서명으로 작업을 시도한 것입니다. 키를 랩핑하고 풀지 않는 방법에 대한 예제 코드도 많은 도움이 될 것입니다. 당신이 할 수처럼 하나의 토큰에서 다른 나의 이해가 옳다면, 접근이 포장을 통해해야합니다 PKCS11를 사용하여 백업 키를 시도하고있다 .... SitaramanSunPKCS11에서 세션 핸들을 얻는 방법

public static void main(String[] args) { 
    // TODO code application logic hereString configName = "softhsm.cfg"; 
    try { 
     // Set up the Sun PKCS 11 provider 

     String configName = "/etc/softhsm.cfg"; 
     Provider p = new SunPKCS11(configName); 

     String configName1 = "/etc/softhsm1.cfg"; 
     Provider p1 = new SunPKCS11(configName1); 

     if (-1 == Security.addProvider(p)) { 
      throw new RuntimeException("could not add security provider"); 
     } 
     PKCS11 p11 = PKCS11.getInstance("/usr/local/lib/softhsm/libsofthsm.so", "C_GetFunctionList", null, false); 

     /* p11.C_GetSessionInfo(0); 
     CK_INFO cki = p11.C_GetInfo(); 

     long[] slots = p11.C_GetSlotList(true); 
     String label = new String(p11.C_GetTokenInfo(slots[0]).label); 
     Object obj = new Object(); 
     long sessionhandle = p11.C_OpenSession(slots[0], 1, null, null); 

     CK_MECHANISM ckm = new CK_MECHANISM(); 
     ckm.mechanism  = PKCS11Constants.CKM_RSA_PKCS; 
     CK_ATTRIBUTE[] cka = new CK_ATTRIBUTE[1]; 
     CK_ATTRIBUTE[] cka1 = new CK_ATTRIBUTE[1];   
     long[] keypair =p11.C_GenerateKeyPair(slots[1], ckm, cka, cka1); 
     */ 
     //System.out.println("No. of slots" + slots.length + "label" + label); 
     // Load the key store 
     char[] pin = "vit12345".toCharArray(); 
     char[] pin1 = "User12345".toCharArray(); 
     KeyStore ks = KeyStore.getInstance("PKCS11", p); 
     KeyStore ks1 = KeyStore.getInstance("PKCS11", p1); 
     ks.load(null, pin); 
     ks1.load(null, pin1); 
     Entry e; 
     KeyStore.PrivateKeyEntry e1; 

     // Generate the key 
     SecureRandom sr = new SecureRandom(); 
     KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", p); 
     keyGen.initialize(1024, sr); 
     KeyPair keyPair = keyGen.generateKeyPair(); 
     PrivateKey pk = keyPair.getPrivate(); 

     // Java API requires a certificate chain 
     X509Certificate[] chain = generateV3Certificate(keyPair); 

     ks.setKeyEntry("ALIAS-GOES-HERE", pk, "1234".toCharArray(), chain); 
     //ks1.setKeyEntry("ALIAS-GOES-HERE1", pk, "1234".toCharArray(), chain); 
     ks.store(null); 
     //ks1.store(null); 
     Key k = ks.getKey("ALIAS-GOES-HERE", "1234".toCharArray()); 
     System.out.println("key string is " + k.toString()); 
     PrivateKey pk1 = (PrivateKey) k; 

     System.out.println("OK"); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

답변

2

당신은 SunPKCS11 프로 래퍼에서 방법을 사용할 수 있습니다 샘플 코드에서 주석 처리 된 블록.

다음 샘플 코드에 의해 세션 핸들을 얻을 수 있습니다

 CK_ATTRIBUTE[] aesKeyObject = new CK_ATTRIBUTE[13]; 

     try 
     { 
      aesKeyObject[0] = new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY); 
      aesKeyObject[1] = new CK_ATTRIBUTE(CKA_KEY_TYPE, CKK_AES); 
      aesKeyObject[2] = new CK_ATTRIBUTE(CKA_VALUE_LEN, 32); 
      aesKeyObject[3] = new CK_ATTRIBUTE(CKA_TOKEN, true); 
      aesKeyObject[4] = new CK_ATTRIBUTE(CKA_LABEL, label); 
      aesKeyObject[5] = new CK_ATTRIBUTE(CKA_PRIVATE, true); 
      aesKeyObject[6] = new CK_ATTRIBUTE(CKA_EXTRACTABLE, false); 
      aesKeyObject[7] = new CK_ATTRIBUTE(CKA_WRAP, true); 
      aesKeyObject[8] = new CK_ATTRIBUTE(CKA_UNWRAP, true); 
      aesKeyObject[9] = new CK_ATTRIBUTE(CKA_ENCRYPT, true); 
      aesKeyObject[10] = new CK_ATTRIBUTE(CKA_DECRYPT, true); 
      aesKeyObject[11] = new CK_ATTRIBUTE(CKA_TRUSTED, true); 
      aesKeyObject[12] = new CK_ATTRIBUTE(CKA_ID, 1550); 

      CK_MECHANISM mech = new CK_MECHANISM(CKM_AES_KEY_GEN); 

      long newAESKeyHandle = p11.C_GenerateKey(hSession, mech, aesKeyObject);  
     }catch(Exception e) 
     { 
     } 
: AES 키를 생성하고 (예를 들어) 다음 생성 된 키 사용에 대한 핸들을 얻기 위해 예를 들어

CK_C_INITIALIZE_ARGS initArgs = new CK_C_INITIALIZE_ARGS(); 
PKCS11 p11 = PKCS11.getInstance("D:\\cryptoki.dll", "C_GetFunctionList", initArgs, false); 
long hSession = p11.C_OpenSession(0, CKF_SERIAL_SESSION| CKF_RW_SESSION, null, null); 
char [] pin = {'1', '2', '3', '4', '5', '6', '7', '8'}; 
p11.C_Login(hSession, CKU_USER, pin); 
// do work 
p11.C_Logout(hSession); 
p11.C_CloseSession(hSession); 

그러면이 핸들을 사용하여 새로 생성 된 키를 사용할 수 있습니다. 또한 PKCS11 랩퍼에는 백업에 사용할 수있는 키 랩핑 W 랩핑 해제 메소드가 있습니다.

public native byte[] C_WrapKey(long hSession, 
    CK_MECHANISM pMechanism, 
    long hWrappingKey, 
    long hKey) throws PKCS11Exception 

public native long C_UnwrapKey(long hSession, 
    CK_MECHANISM pMechanism, 
    long hUnwrappingKey, 
    byte[] pWrappedKey, 
    CK_ATTRIBUTE[] pTemplate) throws PKCS11Exception 
관련 문제