【发布时间】:2019-11-12 09:09:44
【问题描述】:
我正在使用Gemalto Smart card 签署XML 文件。
我有一个方法可以返回 certificate 并通过硬编码的 thumbprint 进行搜索。
我无法从该Smart card 获取private key 并用它签署文档。
当我 debug 应用程序时,它返回 null。
我的目标是获取private key,然后要求用户提供PIN 以授权签署文档。
public static X509Certificate2 GetDefaultCertificateStoredOnTheCard()
{
X509Store store = new X509Store("MY", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindByTimeValid, DateTime.Now, true);
// by thumbprint, there is only one
certs = certs.Find(X509FindType.FindByThumbprint, "6BB4F9D483206F44A992799541114536579CF2B3", true);
if (certs.Count == 0)
{
throw new ArgumentException("Please insert smart card to obtain certificate.");
}
X509Certificate2 cert = certs[0];
RSACryptoServiceProvider key;
if (cert.HasPrivateKey)
{
// software cert
key = cert.PrivateKey as RSACryptoServiceProvider;
}
else
{
// certificate from smartcard
CspParameters csp = new CspParameters(1, "Microsoft Base Smart Card Crypto Provider");
csp.Flags = CspProviderFlags.UseDefaultKeyContainer;
key = new RSACryptoServiceProvider(csp);
}
return cert;
}
如您所见,如果密钥为空,请将key 设置为使用Microsoft Base Smart Card Crypto Provider。
我在设备管理器上注意到我的Smart Card Reader 是Microsoft Usbccid Smartcard Reader。
不确定我是否应该在这里设置其他东西,它会带来这个窗口和一个错误。
【问题讨论】:
标签: c# smartcard digital gemalto