Java中硬件令牌的私钥访问

Java中硬件令牌的私钥访问,java,certificate,keystore,Java,Certificate,Keystore,我正在尝试使用密钥库访问证书的私钥 这是我的密码: 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 { /**

我正在尝试使用密钥库访问证书的私钥

这是我的密码:

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

}
但是当我试图获取私钥以便用它对数据进行签名时,私钥为null

我做错了吗?如何使用该证书的私钥对数据进行签名


注意:我必须使用密钥库我不能使用硬件令牌驱动程序的DLL,因为我可能有许多不同的驱动程序进入服务器。

我终于从这篇文章中得到了答案:


私钥为null,除非它是KeyEntry。您试图从证书尝试中获取私钥,因此获得了NPE。在尝试私钥之前,只需测试条目的类型:或者,只需测试它是否为null,如果是,则继续枚举。

我在Java代码中有空密码。当我第一次将令牌插入USB并运行Java应用程序时,将显示来自令牌中间件的弹出窗口,并且可以访问私钥。但当我再次运行应用程序时,应用程序就会冻结。我必须删除并再次插入令牌。
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();