我正在尝试将c#的一些功能复制到Java中。我已经为此绞尽脑汁好几天了,但还是不知道我需要什么博士学位才能在Java中完成这项工作。我正在使用智能卡身份验证,并阅读了许多关于该主题的帖子。我已经能够连接到读者,让它告诉我什么时候插入/删除(简单的例子)和读者的名字。但是,我找不到从卡片上获得证书的任何信息。我记得大学里有很多类似于汇编语言的例子,但是没有一个可以用来实现这个目标。作为一个参考点,这段简单的代码,从各种例子中拼凑在一起,得到了我在c#中所需要的东西
public static X509Certificate2 GetCertFromCard()
{
string magicString = magicString = "Microsoft Base Smart Card Crypto Provider";
CspParameters cspParameters = new CspParameters(1, magicString)
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParameters);
string pubKeyXml = rsaProvider.ToXmlString(false);
X509Store x509Store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
x509Store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
foreach (X509Certificate2 cert in x509Store.Certificates)
{
if ((cert.PublicKey.Key.ToXmlString(false) == pubKeyXml) && cert.HasPrivateKey)
{
return cert;
}
}
return null;
}
显然,这不是什么新鲜事,也不是独一无二的。我并不想在这里做什么革命性的事情,所以你不需要成为一个火箭外科医生来弄清楚它。
我已经能够访问机器上的KeyStore来查看证书,并且已经能够在那里找到我需要的东西,我只需要能够将它与插入的卡匹配起来,以启用基于角色的选项。
你是一种欺骗:你似乎是使用智能卡安装了CSP。这个中间件知道如何访问和执行智能卡上的操作。
标准化的/Java等效方法是为您的智能卡提供pkcs# 11库,并使用Java pkcs# 11提供程序来访问它。当然,您也可以使用SunMSCAPI提供程序来访问Windows上的密钥/证书存储。
如果您没有任何这些,那么您可能需要使用SmartCardIO库并直接访问您的智能卡。但是,在这种情况下,您需要知道智能卡的具体格式。如果它使用一种通用的方式来定位密钥和证书(如ISO 7816-15,以前称为pkcs# 15),那么库可以直接访问证书并使用私钥。
放弃使用JNI调用M Cli/c++至少他们知道如何处理请求。