2014-09-10 97 views
0

我試圖使用密鑰庫訪問我的證書的私鑰。在Java中訪問硬件令牌的私鑰

這裏是我的代碼:

package test.java.com; 

import java.security.Key; 
import java.security.KeyStore; 
import java.security.cert.Certificate; 
import java.security.cert.X509Certificate; 
import java.util.Enumeration; 

public class Main { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     KeyStore ks; 
     try { 
      ks = KeyStore.getInstance("Windows-MY"); 

      ks.load(null, null); 
      Enumeration<String> en = ks.aliases(); 
      while (en.hasMoreElements()) { 
       String aliasKey = (String) en.nextElement(); 
       Certificate c = ks.getCertificate(aliasKey); 
       Key key = ks.getKey(aliasKey, "1753".toCharArray()); // Here I try to access the private key of my hardware certificate 
       byte[] bt = key.getEncoded(); 

       if(bt != null) { 
        System.out.println("private key correctly accessed"); 
       } else { 
        System.out.println("Can't access private key"); 
       } 

       System.out.println("---> alias : " + aliasKey); 
       if (ks.isKeyEntry(aliasKey)) { 
        Certificate[] chain = ks.getCertificateChain(aliasKey); 
        System.out.println("---> chain length: " + chain.length); 
        X509Certificate Cert = null; 
        for (Certificate cert : chain) { 
         System.out.println(cert); 
        } 
       } 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

但是,當我試圖讓私鑰(爲了與它簽約數據),私鑰爲空。

我做錯了嗎?如何使用其私鑰對該證書籤名數據?

注意:我必須使用密鑰庫(我不能使用硬件令牌驅動程序的DLL,因爲我可能有許多不同的驅動程序來到服務器)。

+0

我在Java代碼中有空的密碼。 當我第一次向USB插入令牌並運行Java應用程序時,會顯示來自令牌中間件的彈出窗口,並且私鑰是可訪問的。 但是,當我第二次運行應用程序和更多次,應用程序凍結。 我必須再次移除並插入標記。 – 2016-11-04 08:22:43

回答

0

我終於得到了這個職位的答案:Java security - MSCAPI provider: How to use without password popup?

String alias = "Alias to my PK"; 
char[] pass = "MyPassword".toCharArray(); 

KeyStore ks = KeyStore.getInstance("Windows-MY"); 
ks.load(null, pass); 
Provider p = ks.getProvider(); 

Signature sig = Signature.getInstance("SHA1withRSA",p); 
PrivateKey key = (PrivateKey) ks.getKey(alias, pass) 

sig.initSign(key); 
sig.update("Testing".getBytes()); 
sig.sign(); 
0

私鑰爲空,除非它是一個keyentry指南。你試圖從CertificateEntry中獲得私鑰,所以你得到了一個N​​PE。在嘗試使用私鑰之前,只需測試一下條目的類型:或者只是測試它爲空,如果是,則繼續枚舉。