使用x509证书签署xml文档每次我尝试发送已签名的XML时,Web服务验证器都会拒绝它。为了签名文档,我刚调整了Microsoft提供的示例代码:http://msdn.microsoft.com/es-es/library/ms229745(v=vs.110).aspx我的实施:publicstaticXmlDocumentFirmarXML(XmlDocumentxmlDoc){尝试{X509Certificate2myCert=null;varstore=newX509Store(StoreLocation.CurrentUser);//StoreLocation.LocalMachine也失败store.Open(OpenFlags.ReadOnly);varcertificates=store.Certificates;foreach(varcertificateincertificates){if(certificate.Subject.Contains("xxx")){myCert=certificate;休息;}}if(myCert!=null){RSArsaKey=((RSA)myCert.PrivateKey);//签署XML文档。SignXml(xmlDoc,rsaKey);}}catch(Exceptione){MessageBox.Show(e.Message);}返回xmlDoc;}//签署一个XML文件。//除非验证//代码具有用于签名的密钥,否则无法验证此文档。publicstaticvoidSignXml(XmlDocumentxmlDoc,RSAKey){//检查参数。如果(xmlDoc==null)抛出新的ArgumentException("xmlDoc");if(Key==null)抛出新的ArgumentException("密钥");//创建一个SignedXml对象。SignedXmlsignedXml=newSignedXml(xmlDoc);//将密钥添加到SignedXml文档。已签名的Xml。签名密钥=密钥;//创建要签名的引用。引用reference=newReference();参考.Uri="";//向引用添加一个封装转换。XmlDsigEnvelopedSignatureTransformenv=newXmlDsigEnvelopedSignatureTransform();reference.AddTransform(env);//添加对SignedXml对象的引用。已签名的Xml。添加参考(参考);//计算签名.signedXml.ComputeSignature();//获取签名的XML表示并保存//到XmlElement对象。XmlElementxmlDigitalSignature=signedXml.GetXml();//将元素附加到XML文档.xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlDigitalSignature,true));我想我使用我自己的证书执行了相同的步骤,但它没有按预期工作任何建议都会受到欢迎。服务器如何知道文档是用哪个证书签名的?看起来您没有在签名文档中包含证书:KeyInfokeyInfo=newKeyInfo();KeyInfoX509DatakeyInfoData=newKeyInfoX509Data(Key);keyInfo.AddClause(keyInfoData);signedXml.KeyInfo=keyInfo;如果您需要更多详细信息,请参阅我的博客文章http://www.wiktorzychla.com/2012/12/interoperable-xml-digital-signatures-c_20.html我已经根据Wiktor的示例进行了一些更改。但是,签名仍然被Web服务拒绝。我现在使用来签名的方法是这样的:publicstaticstringSignXml(XmlDocumentDocument,X509Certificate2cert){SignedXmlsignedXml=newSignedXml(Document);signedXml.SigningKey=cert.PrivateKey;//创建要签名的引用。引用reference=newReference();参考.Uri="";//向引用添加一个封装转换。XmlDsigEnvelopedSignatureTransformenv=newXmlDsigEnvelopedSignatureTransform(true);reference.AddTransform(env);//规范化XmlDsigC14NTransformc14t=newXmlDsigC14NTransform();参考.AddTransform(c14t);KeyInfokeyInfo=newKeyInfo();KeyInfoX509DatakeyInfoData=newKeyInfoX509Data(cert);KeyInfoNamekin=newKeyInfoName();kin.Value="证书公钥";RSACryptoServiceProviderrsaprovider=(RSACryptoServiceProvider)cert.PublicKey.Key;RSAKeyValuerkv=newRSAKeyValue(rsaprovider);keyInfo.AddClause(kin);keyInfo.AddClause(rkv);keyInfo.AddClause(keyInfoData);signedXml.KeyInfo=keyInfo;//添加对SignedXmlobject.signedXml.AddReference(reference)的引用;//计算签名.signedXml.ComputeSignature();//获取签名的XML表示并保存//到XmlElement对象。XmlElementxmlDigitalSignature=signedXml.GetXml();Document.DocumentElement.AppendChild(Document.ImportNode(xmlDigitalSignature,true));返回Document.OuterXml;签名在文档中出现如下:zRSPtja5EtX7hVbyJ11EjoYTRDk=Ua1/WP28WzfXaxUj....publickeyofcertificate/C0mmC/k5....AQABMIIF3jCCBUegAwIBAgIEPQa1....当正确的文档被发送到服务器时,返回我用作识别必要字段的模式的签名:nQOtmW194/aI+hedq+Dqp+n3IuU=kyp+a6arETylW8ZuucKJyd....证书公钥t0Yial28LxcIoPj16PlLIzaV...AQABMIIHOTCCBiGgAwIBAgICVJIwDQYJKo....对我来说似乎是正确的但仍然不起作用。有人有任何线索吗?以上就是C#学习教程:使用x509证书对xml文档分享的全部内容进行签名。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
