【问题标题】:C# Cades P7M with SmartcardC# Cades P7M 与智能卡
【发布时间】:2019-05-17 02:43:44
【问题描述】:

我读了这篇文章how can sign a file with BouncyCastle dll in c# 我想知道是否有可能找到对存储在智能卡中的证书的支持。

我想做的是创建 P7M cade,但似乎不可能找到任何文档、.NET 类或免费库。

【问题讨论】:

标签: c# digital-signature pkcs#7


【解决方案1】:

您也可以试试这个欧盟委员会倡议的 c# 移植版本:

DSS .NET

它支持 CAdES。尝试使用 MSCAPISignatureToken 和 CookBook 中的指南

CookBook

【讨论】:

    【解决方案2】:

    我在 DSS.NET 中使用了这段代码:

    using System.Security.Cryptography.X509Certificates;
    using EU.Europa.EC.Markt.Dss;
    using EU.Europa.EC.Markt.Dss.Signature;
    using EU.Europa.EC.Markt.Dss.Signature.Cades;
    using EU.Europa.EC.Markt.Dss.Signature.Token;
    
       private static void SignP7M(X509Certificate2 card, string sourcepath)
                {
                    var service = new CAdESService();
    
                    // Creation of MS CAPI signature token
                    var token = new MSCAPISignatureToken { Cert = card };
    
                    var parameters = new SignatureParameters
                    {
                        SignatureAlgorithm = SignatureAlgorithm.RSA,
                        SignatureFormat = SignatureFormat.CAdES_BES,
                        DigestAlgorithm = DigestAlgorithm.SHA256,
                        SignaturePackaging = SignaturePackaging.ENVELOPING,
                        SigningCertificate = Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(token.Cert),
                        SigningDate = DateTime.UtcNow
                    };
    
                    var toBeSigned = new FileDocument(sourcepath);
    
                    var iStream = service.ToBeSigned(toBeSigned, parameters);
    
                    var signatureValue = token.Sign(iStream, parameters.DigestAlgorithm, token.GetKeys()[0]);
    
                    var signedDocument = service.SignDocument(toBeSigned, parameters, signatureValue);
    
                    var dest = sourcepath + ".p7m";
                    if (File.Exists(dest)) File.Delete(dest);
                    var fout = File.OpenWrite(dest);
                    signedDocument.OpenStream().CopyTo(fout);
                    fout.Close();
                }
    

    您可以通过两种方式获得卡片:

    • 来自证书存储区
    • 来自证书序列号

    这里是样本:

    public static X509Certificate2 GetCertificate(string _certSn)
            {
                //selezione del token di firma
    
                var st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                st.Open(OpenFlags.ReadOnly);
                var col = st.Certificates;
                var card = col.Cast<X509Certificate2>().FirstOrDefault(t => t.SerialNumber == _certSn);
    
                st.Close();
    
                return card;
            }
    
    
    public static X509Certificate2 selectCert(StoreName store, StoreLocation location, string windowTitle, string windowMsg)
    {
    
        X509Certificate2 certSelected = null;
        X509Store x509Store = new X509Store(store, location);
        x509Store.Open(OpenFlags.ReadOnly);
    
        X509Certificate2Collection col = x509Store.Certificates;
        X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, windowTitle, windowMsg, X509SelectionFlag.SingleSelection);
    
        if (sel.Count > 0)
        {
            X509Certificate2Enumerator en = sel.GetEnumerator();
            en.MoveNext();
            certSelected = en.Current;
        }
    
        x509Store.Close();
    
        return certSelected;
    }
    

    【讨论】:

      【解决方案3】:

      如果智能卡映射到 Windows 证书存储,那么您可以使用通过 CryptoAPI 提供的证书。如果智能卡可通过 PKCS#11 获得,您可以使用我们 SecureBlackbox 产品的PKIBlackbox 包来使用它。 PKIBlackbox 还支持 CAdES 格式,而不仅仅是 PKCS#7/CMS。

      【讨论】:

      • PKIBlackBox 使用托管代码。我正在为我的智能卡使用 pkcs11 包装器。例如,当我必须签署 pdf 文件时,我通过调用包装器的 Sign 方法来使用 IExternalSignature 接口实现。我会在不使用任何其他组件的情况下为 p7m 做这样的事情..
      • PKIBlackbox 在原生 C++ 和 VCL 版本中也可用。你仍然不会只用 .NET 来做 CAdES(当然,除非你想自己重写大量的协议实现 )。
      • 好的,但它不是免费的。有什么免费软件吗?
      • @bit 一切都要付出代价。正如您已经发现的那样,免费软件会花费时间在错误和缺乏文档上。
      • 当然。但是,如果我已经能够通过我的智能卡进行签名,获取有关 CSP 和其他内容的信息,我会更乐意免费实现简单的 p7M..
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多