2016-08-15 3 views
0

Windows-MY 인스턴스에서 인증서를 읽을 수 있어야하는 Java 애플릿을 개발 중입니다. 이것은 내가 할 수 있고 잘 작동하는 부분입니다. 내 문제는 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

당신은 당신이 당신의 콜백 사용할 수 있습니다

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)); 

     } 
    } 
} 

을 처리하는 콜백을 우선 언급 된 기준에서 복사 한 예로서 this

을 확인하시기 바랍니다 콜백 핸들러 를 구현해야

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(); 

도움이 될 수 있기를 바랍니다.