C# prise en charge de RSA, SHA 256 signature individuelle éléments XML

J'ai rencontré un bloqueur de avec la .NET Framework version 4.5 à faire avec la signature d'un document XML avec des signatures numériques.

Mon problème est basée autour de la nécessité de signer individu éléments XML avec X. 509 certificate avec le RSA, SHA-256 algorithme. J'ai lu beaucoup de .NET de messages sur ce sujet et il semble qu'il existe une solution initialement développé dans le CLR projet de Sécurité RSAPKCS1SHA256SignatureDescription.cs de la classe. RSAPKCS1SHA256SignatureDescription a bien sûr depuis été intégré à l' .net runtime et de .NET 4.5, est maintenant disponible sous l'distribué binaire System.Deployment.dll. J'ai tenté la solution ci-dessus dans .NET pour signer des éléments XML avec RSA, SHA-256 cependant ont pas encore eu de succès.

J'essaie de me connecter un message SOAP en respectant l'Oasis des ebm standard avec un WSSE Jeton. S'il vous plaît être conscient que la classe est écrit pour répondre à Savon Avec des pièces Jointes (SwA) et de la signature des pièces jointes.
Mon code est comme suit

Mon code est le suivant:

using System;
using System.Collections.Generic;
using System.IO;
using System.IdentityModel.Tokens;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.ServiceModel.Channels;
using System.ServiceModel.Security;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.Deployment.Internal.CodeSigning;
namespace TestCSharpX509CertificateRSSHA256
{
public class SignatureSupportUtility
{
private bool IsSignatureContentTransform
{
get
{
return true;
//get IsSignatureContentTransform                
}
}
public SignatureSupportUtility()
{
Register();
}
private static void Register()
{
CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
}
private void Sign(Message message, string[] elementIdsToSign, string[] attachmentsToSign, string wssNamespace, X509Certificate2 certificate)
{
//Prepare XML to encrypt and sign
var element = this.PrepareEncyrptSign(message);
bool signEntireDocument = true;
string elementToBeSigned = string.Empty;
var signedMessage = new XmlDocument();
signedMessage.AppendChild(signedMessage.ImportNode(element, true));
SignatureType signAs = SignatureType.InternallyDetached;
signedMessage.PreserveWhitespace = false;
OverrideSignedXml signedXml = new OverrideSignedXml(signedMessage);
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
if (elementIdsToSign != null && elementIdsToSign.Length > 0)
{
bool isContentTransform = this.IsSignatureContentTransform;
foreach (string s in elementIdsToSign)
{
//Create a reference to be signed.
Reference reference = new Reference(string.Format("#{0}", s));
reference.AddTransform(new XmlDsigExcC14NTransform());
reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
//Add the reference to the SignedXml object.
signedXml.AddReference(reference);
}
signEntireDocument = false;
}
//Reference attachments to sign
if (attachmentsToSign != null && attachmentsToSign.Length > 0)
{
bool isContentTransform = this.IsSignatureContentTransform;
foreach (string attachmentId in attachmentsToSign)
{
//Create a reference to be signed.
Reference reference = new Reference(string.Format("{0}{1}", Constants.CidUriScheme, attachmentId));
reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
if (isContentTransform)
{
AttachmentContentSignatureTransform env = new AttachmentContentSignatureTransform();
reference.AddTransform(env);
}
else
{
AttachmentCompleteSignatureTransform env = new AttachmentCompleteSignatureTransform();
reference.AddTransform(env);
}
//Add the reference to the SignedXml object.
signedXml.AddReference(reference);
}
signEntireDocument = false;
}
if (signEntireDocument)
{
Reference reference = new Reference();
reference.Uri = "";
reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
signedXml.AddReference(reference);
signAs = SignatureType.Enveloped;
}
string x509CertificateReferenceId = string.Format("{0}-{1}", Constants.IdAttributeName, Guid.NewGuid().ToString("N"));
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509SecurityTokenReference(string.Format("#{0}", x509CertificateReferenceId), wssNamespace));
signedXml.KeyInfo = keyInfo;
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
RSA  key = (RSACryptoServiceProvider)certificate.PrivateKey;
signedXML.SigningKey = key;
CidWebRequest.Message = message;
signedXml.ComputeSignature();
var xmlSignature = signedXml.GetXml();
XmlDocument unsignedEnvelopeDoc = new XmlDocument();
unsignedEnvelopeDoc.LoadXml(message.MessageAsString); }}} 
using System;
using System.Collections.Generic;
using System.IO;
using System.IdentityModel.Tokens;
using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.ServiceModel.Channels;
using System.ServiceModel.Security;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.Deployment.Internal.CodeSigning;
namespace TestCSharpX509CertificateRSSHA256
{
public sealed class OverrideSignedXml : SignedXml
{
public OverrideSignedXml()
: base()
{
}
public OverrideSignedXml(XmlDocument doc)
: base(doc)
{
}
public override XmlElement GetIdElement(XmlDocument document, string idValue)
{
XmlElement element = base.GetIdElement(document, idValue);
if (element == null)
{
XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable);
nsmgr.AddNamespace("wsu", ="http://docs.oasis-open. org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
element = document.SelectSingleNode("//*[@wsu:Id=\"" + idValue + "\"]", nsmgr) as XmlElement;
}
return element;
}
}

}

Le Signe de la méthode dans mon SignatureSupportUtility classe devrait être suffisant pour signer individu éléments XML ou tout le message, cependant je continuer à recevoir la Cryptographie exception affirmant que le SHA-256 n'est pas pris en charge. Je pense que cette exception ne devrait pas être valable en observant que l'RSAPKCS1SHA256SignatureDescription.cs est enregistré. Cependant observer que le SignedXML classe ne comprend pas l'espace de noms pour SHA-256 et que SHA-128 je commence à douter si le SHA-256 est pris en charge indépendamment de l'inscription.

Quelqu'un pourrait-il svp me conseiller sur la meilleure façon de résoudre mon problème et être en mesure de signer un document XML avec un X. 509 certificat par l'intermédiaire de RSA, SHA 256 algorithme?

  • Si vous n'êtes pas limité à l' .NET Framework classes, vous pouvez essayer de XML signature de la fonctionnalité dans notre SecureBlackbox produit, car il offre beaucoup plus de fonctionnalités. Voir eldos.com/sbb/net-xml.php