c# - 智能卡将 null 作为私钥的值
问题描述
我正在使用 aGemalto Smart card
来签署XML
文件。
我有一个方法,它返回certificate
和搜索thumbprint
是硬编码的。
我无法从中获得private key
并Smart card
用它签署文档。
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
.
不知道我是否应该在这里设置其他东西,它会带来这个窗口和一个错误。
解决方案
智能卡的真正目的是保护机密数据。没有比私钥更多的机密数据(通常它永远不会离开智能卡),所以它是正确运行的标志,你没有得到它。
实际上,您必须让智能卡进行签名,可能是通过发送 XML 文档的哈希值。
推荐阅读
- sql-server-2019 - SQL Server Polybase - 自动统计查询问题
- dynamics-365 - 在 Dynamics 365 online 中使用 JS 或工作流等待条件实现?
- spring - 使用 Nacos 注册表调用 Spring Cloud 中所有服务实例方法的最佳方法是什么?
- excel - 从 DataTables 导出到 Excel 时禁用自动数字格式
- backup - 无法识别 Clonezilla 可启动 USB (InsydeH2O UEFI)
- php - 没看懂在说什么?
- flutter - 为什么 .contains 不签入列表
- python - 如何使用我的应用程序中的功能启用 Windows 打开
- firebase - 找不到另一个“FirebaseCore/FirebaseCore.h”文件问题 - SwiftUI
- swift - macOS SwiftUI:通过焦点在垂直方向而不是水平方向上的制表符