如何在Java中使用pin/密码加载Windows MY keystore?

如何在Java中使用pin/密码加载Windows MY keystore?,java,applet,x509certificate,keystore,digital-certificate,Java,Applet,X509certificate,Keystore,Digital Certificate,我正在开发java小程序,它应该能够从Windows我的实例中读取证书。这是我能做的部分,并且工作得很好。我的问题是,当我输入PIN码(通过编辑文本控件提供)时,Windows证书管理器会在输入PIN码后再次要求我输入相同的PIN码 所以,我没有什么问题,如果你能帮助我,我将非常感激 我的代码做错了什么,为什么它没有使用通过EditText控件提供的PIN码?如何做到这一点 如果不可能,请告诉我,PKCS#12数字证书的行为是否与PKCS#11智能卡证书的行为相同?准确地说,他们要求PIN的方式

我正在开发java小程序,它应该能够从Windows我的实例中读取证书。这是我能做的部分,并且工作得很好。我的问题是,当我输入PIN码(通过编辑文本控件提供)时,Windows证书管理器会在输入PIN码后再次要求我输入相同的PIN码

所以,我没有什么问题,如果你能帮助我,我将非常感激

  • 我的代码做错了什么,为什么它没有使用通过
    EditText
    控件提供的PIN码?如何做到这一点
  • 如果不可能,请告诉我,PKCS#12数字证书的行为是否与PKCS#11智能卡证书的行为相同?准确地说,他们要求PIN的方式是否与PKCS 11相同?如果是这样,我应该能够删除我的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);
    
    keystore=keystore.getInstance(“Windows我的”、“SunMSCAPI”);
    keystore.load(null,_PIN);
    字符串别名=(字符串)别名.nextElement();
    X509Certificate oPublicCertificate=(X509Certificate)keystore.getCertificate(别名);
    PrivateKey oPrivateKey=(PrivateKey)keystore.getKey(别名,null);
    如果(oPrivateKey==null)继续;
    如果(别名!=别名)继续;
    System.out.println(“用别名签名:+别名”);
    System.out.println(“gettype:+oPublicCertificate.gettype());
    System.out.println(“序列号:+oPublicCertificate.getSerialNumber());
    System.out.println(“公钥:+oPublicCertificate.getPublicKey());
    _PK=Base64Utils.base64Encode(opublicertificate.getPublicKey().getEncoded());
    System.out.println(“公钥:”+_PK);
    Provider p=keystore.getProvider();
    //要签名的数据
    byte[]data=“用于签名的数据”。getBytes();
    //签署数据
    Signature sig=Signature.getInstance(“SHA1withRSA”);
    信号初始信号(oPrivateKey);
    信号更新(数据);
    
    字节[]签名=sig.sign()// 您需要实现一个回调处理程序 请查收

    本例复制了上述引用,该引用覆盖回调处理

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

    我希望这能有所帮助。

    您需要实现回调处理程序 请查收

    本例复制了上述引用,该引用覆盖回调处理

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

    我希望这能有所帮助。

    您是否测试了提供的解决方案?。我认为您没有,因为SunMSCAPI密钥库实现完全忽略了中所示的密码。您是否测试了提供的解决方案?。我认为您没有这样做,因为SunMSCAPI密钥库实现完全忽略了中所示的密码。