Servlets 使用小程序从令牌检索私钥

Servlets 使用小程序从令牌检索私钥,servlets,applet,certificate,private-key,pkcs#11,Servlets,Applet,Certificate,Private Key,Pkcs#11,我有一个小程序,它读取证书,并从usb令牌读取公钥和私钥。 无论何时插入令牌,我都可以读取并访问PrivateKey,但我有一个加密环境,需要将证书和密钥发布到servlet,这个servlet将在我的应用程序上对所选文件进行签名。在我拿到这张带有不可出口私钥的代币之前,一切都很顺利 PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, PIN.toCharArray()); 然后,我使用一个解码器将字节数组转换为BASE64并

我有一个小程序,它读取证书,并从usb令牌读取公钥和私钥。 无论何时插入令牌,我都可以读取并访问PrivateKey,但我有一个加密环境,需要将证书和密钥发布到servlet,这个servlet将在我的应用程序上对所选文件进行签名。在我拿到这张带有不可出口私钥的代币之前,一切都很顺利

PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, PIN.toCharArray());
然后,我使用一个解码器将字节数组转换为BASE64并发布它

sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
String base64encoded = encoder.encode(privateKey.getEncoded());
但是,使用这个特定标记,privateKey.getEncoded()上使用的方法getEncoded()总是返回null。所以我没有找到从PrivateKey对象获取字节数组的方法


有没有可能的办法

您无法从
PKCS11
令牌中获取私钥,
PKCS11
用于将密钥材料放在安全设备中,并且无法提取,当您想要使用此类设备(HSM、智能卡等)签名时,签名将在其中执行

如果要使用客户端
PKCS11
usb令牌和小程序执行签名,则必须在客户端计算机中执行的小程序中执行签名,而不是在服务器端传递密钥,因为此选项不可行


希望这能有所帮助,

使用applet从浏览器访问令牌是一种古老的方式,现代浏览器不太支持applet。您可以参考页面上的几个SO链接,以获得更好的实现方法。