我有一个小程序,它读取证书,结果是来自usb令牌的公钥和私钥。 我可以在插入令牌时读取对PrivateKey的访问权限,但是我有一个加密环境,我需要将证书和密钥发布到servlet,这个servlet将在我的应用程序上签署选定的文件。它工作正常,直到我得到这个带有不可导出的PrivateKey的令牌。
PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, PIN.toCharArray());
然后我使用解码器将bytes数组转换为BASE64并发布它。
sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
String base64encoded = encoder.encode(privateKey.getEncoded());
但是,使用此特定标记时,在privateKey.getEncoded()上使用的方法getEncoded()将始终返回null。所以我没有找到从PrivateKey对象获取bytes数组的方法。
有可能这样做吗?
答案 0 :(得分:2)
您无法从PKCS11
令牌获取私钥,PKCS11
用于将密钥材料放在安全设备中,并且当您要使用此签名时无法解析签名的设备类型(HSM,智能卡等)在其中执行。
如果要使用客户端PKCS11
usb令牌和applet执行签名,则必须在客户端计算机中执行的applet中执行签名,而不是在服务器端执行签名传递密钥因为这个选项是不可能的。
希望这有帮助,
答案 1 :(得分:0)
现代浏览器不再支持使用applet。因此,您需要使用浏览器扩展来访问在浏览器下运行的主机服务,以访问本地计算机上的证书存储,该证书存储具有使用CSP(Windows上的加密服务提供程序)处理usb加密令牌或智能卡上的私钥的功能。因此,哈希的签名将在令牌内完成,签名的内容(签名)将由主机应用程序返回给浏览器,浏览器又将其发送到服务器以完成签名操作。