【问题标题】:Pkcs11 - How to add signature to xml file?Pkcs11 - 如何将签名添加到 xml 文件?
【发布时间】:2018-04-06 06:30:00
【问题描述】:

我在获取证书并放入 xml 文件时出现问题。我应该使用私钥进行签名吗?我在证书中只看到公钥。我的证书中没有私钥。

                        byte[] ckaIdd = objectAttributess[0].GetValueAsByteArray();
                        string ckaLabel = objectAttributess[1].GetValueAsString();
                        byte[] ckaValue = objectAttributess[2].GetValueAsByteArray();
                        var _rawData = ckaValue ?? throw new ArgumentNullException(nameof(ckaValue));
                        var _parsedCertificate = new X509Certificate2(_rawData);
                        ECertificate cert = new ECertificate(_parsedCertificate.GetRawCertData());

                        string signatureListString = "";
                        XmlDocument document = new XmlDocument();
                        document.Load(@"C:\Users\MyUser\Desktop\myfile.xml");
                        Esya e = new Esya();
                        Context context = e.CreateContext();
                        context.Document = document;
                        XMLSignature signature = new XMLSignature(context, false);

                        signature.addKeyInfo(new ECertificate(cert.getEncoded()));

                        //signature.sign(v);  << ! My problem is with this line

                        var inv = (XmlElement)signature.Document.GetElementsByTagName("Invoice")[0];
                        signatureListString += inv.OuterXml + "\n";

                        var elementCount = (XmlElement)document.GetElementsByTagName("ElementCount")[0];
                        if (elementCount != null)
                        {
                            elementCount.InnerText = "1";
                        }

                        var element = (XmlElement)document.GetElementsByTagName("ElementList")[0];
                        if (element != null)
                        {
                            element.InnerXml = signatureListString;
                        }

                        var xmlPageSettings = document.GetElementsByTagName("Invoice");
                        foreach (XmlElement xmlElement in xmlPageSettings)
                        {
                            xmlElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
                            xmlElement.SetAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
                        }

                        session.Logout();
                        return cert;
                    }
                }

我应该如何处理signature.sign(v);?如何在 xml 文件中添加签名?

【问题讨论】:

  • 是的,签名需要私钥。
  • 但是证书中的私钥似乎是假的。我该怎么办?
  • 这取决于您希望如何与您的 HSM 交谈。我看到很多证书克隆正在进行。也许你最初得到的_rawData 有能力引用私钥。也许 Windows 证书存储有一个从您期望的证书到 HSM 的链接条目。
  • Pkcs11Interop.X509Store 项目可以为您完成所有繁重的工作。更多详情take a look at my older answer to similar question.
  • @TEngineer X509Certificate2::PrivateKey 只能与基于 CSP/CNG 的密钥一起使用。您不能与基于 PKCS#11 的密钥一起使用。这就是我启动 Pkcs11Interop.X509Store 项目的原因之一。

标签: c# .net rsa hsm pkcs11interop


【解决方案1】:

您必须实现继承自 System.Security.Cryptography.RSA 类的类,在其实现中使用 Pkcs11Interop,然后将自定义类的实例用作 SigningKey

【讨论】:

  • 您为此操作使用了公钥。 base.KeySizeValue = _certContext.CertificateInfo.ParsedCertificate.GetRSAPublicKey().KeySize;这样使用时:signedXml.ComputeSignature()>>不计算密钥值。他们说应该是签名的私钥,但我无法得到私钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多