首页 > 解决方案 > 智能卡将 null 作为私钥的值

问题描述

我正在使用 aGemalto Smart card来签署XML文件。

我有一个方法,它返回certificate和搜索thumbprint是硬编码的。

我无法从中获得private keySmart 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.

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

在此处输入图像描述

标签: c#smartcarddigitalgemalto

解决方案


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

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


推荐阅读