【问题标题】:Smart Card gives null as a value of private key智能卡将 null 作为私钥的值
【发布时间】: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 ReaderMicrosoft Usbccid Smartcard Reader

不确定我是否应该在这里设置其他东西,它会带来这个窗口和一个错误。

【问题讨论】:

    标签: c# smartcard digital gemalto


    【解决方案1】:

    智能卡的真正目的是保护机密数据。没有比私钥更机密的数据了(通常它永远不会离开智能卡),所以它是正常运行的标志,你没有得到它。

    实际上,您必须让智能卡进行签名,可能是通过发送您的 XML 文档的哈希值。

    【讨论】:

    • 好的,谢谢 guidot。我将进一步研究智能卡如何进行签名。
    • 似乎 grozdeto 谈到 cert.PrivateKeynull 如果提供的代码是可以通过的,这是 私钥的引用。那应该null。例如,您可能期望 null私有指数,但这不是要求的(我希望发生转换错误或访问相关异常,而不是返回null)。
    【解决方案2】:

    只是为了回答我的问题。整个问题是.dll。我错误地安装了另一个电子签名提供商,它使用的是那个 .dll 而不是我用于签名的那个。

    当我明白这一点后,这很容易解决,只需为使用错误 .dll 的提供商卸载应用程序即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2017-09-03
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多