2016-08-15 46 views
0

我正在開發java applet,它應該能夠從Windows-MY實例讀取證書。這是我能夠做的部分,並且工作正常。我的問題是當我輸入PIN碼(通過編輯文本控件提供)時,Windows證書管理器在那之後再次詢問我是否有相同的PIN碼。如何使用Java中的引腳/密碼加載Windows-MY密鑰存儲?

所以,我有幾個問題,如果你能幫助我,我將非常感激。

  1. 我在做什麼錯在我的代碼,爲什麼它不使用我通過EditText控制提供的PIN?如何做到這一點?
  2. 如果這不可行,請告訴我,PKCS#12數字證書的行爲方式與PKCS#11智能卡證書相同嗎?確切地說,他們是否像PKCS#11一樣請求PIN碼?如果是這樣,我應該能夠刪除我的PIN字段,並讓Windows來完成這部分工作。

這裏是我的小程序所使用的部分代碼:

keystore = KeyStore.getInstance("Windows-MY", "SunMSCAPI"); 
keystore.load(null,_PIN); 

String aliass = (String) aliasses.nextElement(); 
X509Certificate oPublicCertificate = (X509Certificate) keystore.getCertificate(alias); 
PrivateKey oPrivateKey = (PrivateKey) keystore.getKey(alias,null); 
if(oPrivateKey == null) continue; 
if(aliass != alias) continue; 

System.out.println("Sign with alias:"+aliass); 
System.out.println("gettype:"+oPublicCertificate.getType()); 
System.out.println("serial:"+oPublicCertificate.getSerialNumber()); 
System.out.println("Public Key:"+oPublicCertificate.getPublicKey()); 
_PK = Base64Utils.base64Encode(oPublicCertificate.getPublicKey().getEncoded()); 
System.out.println("Public Key:"+_PK); 

Provider p = keystore.getProvider(); 
// data to sign 
byte[] data ="Data for signing".getBytes(); 
// Signing the data 
Signature sig = Signature.getInstance("SHA1withRSA"); 
sig.initSign(oPrivateKey); 

sig.update(data); 

byte[] signature = sig.sign(); //<--- Here asks for PIN second time. 

System.out.println("Signature.sign():" + signature); 

Signature verifier = Signature.getInstance("SHA1withRSA", p); 
verifier.initVerify(oPublicCertificate); 
verifier.update(data); 
boolean isValidSignature = verifier.verify(signature); 
System.out.println("the verification result "+ isValidSignature); 

上午開放不同的方法來解決這個問題。

回答

0

你需要實現一個回調處理 請this

如本例自提引用複製其覆蓋回調處理

public void handle(Callback[] callbacks) 
throws IOException, UnsupportedCallbackException { 

    for (int i = 0; i < callbacks.length; i++) { 
     if (callbacks[i] instanceof PasswordCallback) { 

      // prompt the user for sensitive information 
      PasswordCallback pc = (PasswordCallback)callbacks[i]; 
      System.err.print(pc.getPrompt()); 
      System.err.flush(); 
      pc.setPassword(readPassword(System.in)); 

     } 
    } 
} 

那麼你可以使用你的回調

CallbackHandler callBackHandler = new yourImplementedHandler(); 
KeyStore.ProtectionParameter protection = new KeyStore.CallbackHandlerProtection(callBackHandler); 
Provider provider = Security.getProvider("SunMSCAPI"); 
KeyStore.Builder keystoreBuilder = KeyStore.Builder.newInstance("Windows-MY", 
                   provider, 
                   protection); 
KeyStore keystore = keystoreBuilder.getKeyStore(); 

我希望這可以幫助。