智能卡给出 null 作为私钥的值
Smart Card gives null as a value of private key
我正在使用 Gemalto Smart card
签署 XML
文件。
我有一个方法 returns certificate
并通过硬编码的 thumbprint
进行搜索。
我无法从 Smart card
获得 private key
并用它签署文档。
它 returns null
当我 debug
应用程序时。
我的目标是获得 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
。
不确定我是否应该在这里设置其他东西,它带来了这个 window 和一个错误。
智能卡的根本目的是保护机密数据。没有比私钥更机密的数据(通常这永远不会离开智能卡),所以它是正确运行的标志,你没有得到它。
实际上你必须让智能卡做签名,可能是通过发送你的 XML 文档的散列值。
只是为了回答我的问题。整个问题是.dll。我错误地安装了另一个电子签名提供程序,它使用的是那个 .dll 而不是我用于签名的那个。
当我了解到这一点后,修复起来很容易,只需卸载使用错误 .dll 的提供商的应用程序即可。
我正在使用 Gemalto Smart card
签署 XML
文件。
我有一个方法 returns certificate
并通过硬编码的 thumbprint
进行搜索。
我无法从 Smart card
获得 private key
并用它签署文档。
它 returns null
当我 debug
应用程序时。
我的目标是获得 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
。
不确定我是否应该在这里设置其他东西,它带来了这个 window 和一个错误。
智能卡的根本目的是保护机密数据。没有比私钥更机密的数据(通常这永远不会离开智能卡),所以它是正确运行的标志,你没有得到它。
实际上你必须让智能卡做签名,可能是通过发送你的 XML 文档的散列值。
只是为了回答我的问题。整个问题是.dll。我错误地安装了另一个电子签名提供程序,它使用的是那个 .dll 而不是我用于签名的那个。
当我了解到这一点后,修复起来很容易,只需卸载使用错误 .dll 的提供商的应用程序即可。