我正在开发一个应用程序,用户应该能够使用智能卡对XML文档进行数字签名,该智能卡将持有其私钥。
在测试过程中,我能够在给定两个密钥(公共密钥和私有密钥)的文件路径的情况下生成xml签名。
我的问题是如何从智能卡读取私钥。 我可以使用以下代码从卡中获得回复:
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
CardTerminal terminal = terminals.get(0);
Card card = terminal.connect("*");
System.out.println("Card: " + card);
CardChannel channel = card.getBasicChannel();
ResponseAPDU r = channel.transmit(new CommandAPDU(0x00, 0x84, 0x00, 0x00, 0x08));
String hex = DatatypeConverter.printHexBinary(r.getBytes());
System.out.println("Response: " + hex);
对于如何读取/查看卡内容以查找私钥的任何帮助,将不胜感激。
谢谢!
答案 0 :(得分:0)
无法从智能卡读取私钥。使用诸如SunPKCS11之类的PKCS11库或其他PKCS11变形器,您可以获取私钥的句柄,然后使用PKCS11从硬件设备(例如智能卡)进行签名。您需要提供智能卡驱动程序的路径,以配置Java安全提供程序JCA / JCE。
有关更多详细信息,请参阅:JDK 8 PKCS#11 Reference Guide
或者,您可以使用任何易于使用的库来实现此目的。 Signer Digital 由我公司提供,是服务器端的商业库之一。虽然使用智能卡或USB令牌签名的浏览器扩展是免费的。