SignedXml Classe

Definição

Fornece um wrapper em um objeto de assinatura do núcleo XML para facilitar a criação de assinaturas de XML.Provides a wrapper on a core XML signature object to facilitate creating XML signatures.

public ref class SignedXml
public class SignedXml
type SignedXml = class
Public Class SignedXml
Herança
SignedXml

Exemplos

O exemplo de código a seguir mostra como assinar e verificar um documento XML inteiro usando uma assinatura envelopada.The following code example shows how to sign and verify an entire XML document using an enveloped signature.

//
// This example signs an XML file using an
// envelope signature. It then verifies the 
// signed XML.
//
#using <System.Security.dll>
#using <System.Xml.dll>

using namespace System;
using namespace System::Security::Cryptography;
using namespace System::Security::Cryptography::X509Certificates;
using namespace System::Security::Cryptography::Xml;
using namespace System::Text;
using namespace System::Xml;

// Sign an XML file and save the signature in a new file. This method does not  
// save the public key within the XML file.  This file cannot be verified unless  
// the verifying code has the key with which it was signed.
void SignXmlFile( String^ FileName, String^ SignedFileName, RSA^ Key )
{
   
   // Create a new XML document.
   XmlDocument^ doc = gcnew XmlDocument;
   
   // Load the passed XML file using its name.
   doc->Load( gcnew XmlTextReader( FileName ) );
   
   // Create a SignedXml object.
   SignedXml^ signedXml = gcnew SignedXml( doc );
   
   // Add the key to the SignedXml document. 
   signedXml->SigningKey = Key;
   
   // Create a reference to be signed.
   Reference^ reference = gcnew Reference;
   reference->Uri = "";
   
   // Add an enveloped transformation to the reference.
   XmlDsigEnvelopedSignatureTransform^ env = gcnew XmlDsigEnvelopedSignatureTransform;
   reference->AddTransform( env );
   
   // Add the reference to the SignedXml object.
   signedXml->AddReference( reference );
   
   // Compute the signature.
   signedXml->ComputeSignature();
   
   // Get the XML representation of the signature and save
   // it to an XmlElement object.
   XmlElement^ xmlDigitalSignature = signedXml->GetXml();
   
   // Append the element to the XML document.
   doc->DocumentElement->AppendChild( doc->ImportNode( xmlDigitalSignature, true ) );
   if ( (doc->FirstChild)->GetType() == XmlDeclaration::typeid )
   {
      doc->RemoveChild( doc->FirstChild );
   }

   
   // Save the signed XML document to a file specified
   // using the passed string.
   XmlTextWriter^ xmltw = gcnew XmlTextWriter( SignedFileName,gcnew UTF8Encoding( false ) );
   doc->WriteTo( xmltw );
   xmltw->Close();
}


// Verify the signature of an XML file against an asymmetric 
// algorithm and return the result.
Boolean VerifyXmlFile( String^ Name, RSA^ Key )
{
   
   // Create a new XML document.
   XmlDocument^ xmlDocument = gcnew XmlDocument;
   
   // Load the passed XML file into the document. 
   xmlDocument->Load( Name );
   
   // Create a new SignedXml object and pass it
   // the XML document class.
   SignedXml^ signedXml = gcnew SignedXml( xmlDocument );
   
   // Find the "Signature" node and create a new
   // XmlNodeList object.
   XmlNodeList^ nodeList = xmlDocument->GetElementsByTagName( "Signature" );
   
   // Load the signature node.
   signedXml->LoadXml( safe_cast<XmlElement^>(nodeList->Item( 0 )) );
   
   // Check the signature and return the result.
   return signedXml->CheckSignature( Key );
}


// Create example data to sign.
void CreateSomeXml( String^ FileName )
{
   
   // Create a new XmlDocument Object*.
   XmlDocument^ document = gcnew XmlDocument;
   
   // Create a new XmlNode object.
   XmlNode^ node = document->CreateNode( XmlNodeType::Element, "", "MyElement", "samples" );
   
   // Add some text to the node.
   node->InnerText = "Example text to be signed.";
   
   // Append the node to the document.
   document->AppendChild( node );
   
   // Save the XML document to the file name specified.
   XmlTextWriter^ xmltw = gcnew XmlTextWriter( FileName,gcnew UTF8Encoding( false ) );
   document->WriteTo( xmltw );
   xmltw->Close();
}

int main()
{
   try
   {
      
      // Generate a signing key.
      RSACryptoServiceProvider^ Key = gcnew RSACryptoServiceProvider;
      
      // Create an XML file to sign.
      CreateSomeXml( "Example.xml" );
      Console::WriteLine( "New XML file created." );
      
      // Sign the XML that was just created and save it in a 
      // new file.
      SignXmlFile( "Example.xml", "signedExample.xml", Key );
      Console::WriteLine( "XML file signed." );
      
      // Verify the signature of the signed XML.
      Console::WriteLine( "Verifying signature..." );
      bool result = VerifyXmlFile( "SignedExample.xml", Key );
      
      // Display the results of the signature verification to 
      // the console.
      if ( result )
      {
         Console::WriteLine( "The XML signature is valid." );
      }
      else
      {
         Console::WriteLine( "The XML signature is not valid." );
      }
   }
   catch ( CryptographicException^ e ) 
   {
      Console::WriteLine( e->Message );
   }

}

//
// This example signs an XML file using an
// envelope signature. It then verifies the 
// signed XML.
//
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;

public class SignVerifyEnvelope
{

    public static void Main(String[] args)
    {
        try
        {
           // Generate a signing key.
           RSACryptoServiceProvider Key = new RSACryptoServiceProvider();

           // Create an XML file to sign.
           CreateSomeXml("Example.xml");
           Console.WriteLine("New XML file created."); 

           // Sign the XML that was just created and save it in a 
           // new file.
           SignXmlFile("Example.xml", "signedExample.xml", Key);
           Console.WriteLine("XML file signed."); 

           // Verify the signature of the signed XML.
           Console.WriteLine("Verifying signature...");
           bool result = VerifyXmlFile("SignedExample.xml", Key);

           // Display the results of the signature verification to 
           // the console.
           if(result)
           {
               Console.WriteLine("The XML signature is valid.");
           }
           else
           {
            Console.WriteLine("The XML signature is not valid.");
           }
        }
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }
    }

    // Sign an XML file and save the signature in a new file. This method does not  
    // save the public key within the XML file.  This file cannot be verified unless  
    // the verifying code has the key with which it was signed.
    public static void SignXmlFile(string FileName, string SignedFileName, RSA Key)
    {
        // Create a new XML document.
        XmlDocument doc = new XmlDocument();

        // Load the passed XML file using its name.
        doc.Load(new XmlTextReader(FileName));

        // Create a SignedXml object.
        SignedXml signedXml = new SignedXml(doc);

        // Add the key to the SignedXml document. 
        signedXml.SigningKey = Key;

        // Create a reference to be signed.
        Reference reference = new Reference();
        reference.Uri = "";

        // Add an enveloped transformation to the reference.
        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
        reference.AddTransform(env);

        // Add the reference to the SignedXml object.
        signedXml.AddReference(reference);

        // Compute the signature.
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and save
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();

        // Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
        
        if (doc.FirstChild is XmlDeclaration)  
        {
            doc.RemoveChild(doc.FirstChild);
        }

        // Save the signed XML document to a file specified
        // using the passed string.
        XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
        doc.WriteTo(xmltw);
        xmltw.Close();
    }

    // Verify the signature of an XML file against an asymetric 
    // algorithm and return the result.
    public static Boolean VerifyXmlFile(String Name, RSA Key)
    {
        // Create a new XML document.
        XmlDocument xmlDocument = new XmlDocument();

        // Load the passed XML file into the document. 
        xmlDocument.Load(Name);

        // Create a new SignedXml object and pass it
        // the XML document class.
        SignedXml signedXml = new SignedXml(xmlDocument);

        // Find the "Signature" node and create a new
        // XmlNodeList object.
        XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");

        // Load the signature node.
        signedXml.LoadXml((XmlElement)nodeList[0]);

        // Check the signature and return the result.
        return signedXml.CheckSignature(Key);
    }

    // Create example data to sign.
    public static void CreateSomeXml(string FileName)
    {
        // Create a new XmlDocument object.
        XmlDocument document = new XmlDocument();

        // Create a new XmlNode object.
        XmlNode  node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples");
        
        // Add some text to the node.
        node.InnerText = "Example text to be signed.";

        // Append the node to the document.
        document.AppendChild(node);

        // Save the XML document to the file name specified.
        XmlTextWriter xmltw = new XmlTextWriter(FileName, new UTF8Encoding(false));
        document.WriteTo(xmltw);
        xmltw.Close();
    }
}
'
' This example signs an XML file using an
' envelope signature. It then verifies the 
' signed XML.
'
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates
Imports System.Security.Cryptography.Xml
Imports System.Text
Imports System.Xml



Public Class SignVerifyEnvelope
   
   Overloads Public Shared Sub Main(args() As [String])
      Try
         ' Generate a signing key.
         Dim Key As New RSACryptoServiceProvider()
         
         ' Create an XML file to sign.
         CreateSomeXml("Example.xml")
         Console.WriteLine("New XML file created.")
         
         ' Sign the XML that was just created and save it in a 
         ' new file.
         SignXmlFile("Example.xml", "signedExample.xml", Key)
         Console.WriteLine("XML file signed.")
         
         ' Verify the signature of the signed XML.
         Console.WriteLine("Verifying signature...")
         Dim result As Boolean = VerifyXmlFile("SignedExample.xml", Key)
         
         ' Display the results of the signature verification to 
         ' the console.
         If result Then
            Console.WriteLine("The XML signature is valid.")
         Else
            Console.WriteLine("The XML signature is not valid.")
         End If
      Catch e As CryptographicException
         Console.WriteLine(e.Message)
      End Try
   End Sub 
   
   
   
   ' Sign an XML file and save the signature in a new file. This method does not  
   ' save the public key within the XML file.  This file cannot be verified unless  
   ' the verifying code has the key with which it was signed.
   Public Shared Sub SignXmlFile(FileName As String, SignedFileName As String, Key As RSA)
      ' Create a new XML document.
      Dim doc As New XmlDocument()
      
      ' Load the passed XML file using its name.
      doc.Load(New XmlTextReader(FileName))
      
      ' Create a SignedXml object.
      Dim signedXml As New SignedXml(doc)
      
      ' Add the key to the SignedXml document. 
      signedXml.SigningKey = Key
      
      ' Create a reference to be signed.
      Dim reference As New Reference()
      reference.Uri = ""
      
      ' Add an enveloped transformation to the reference.
      Dim env As New XmlDsigEnvelopedSignatureTransform()
      reference.AddTransform(env)
      
      ' Add the reference to the SignedXml object.
      signedXml.AddReference(reference)
      
      ' Compute the signature.
      signedXml.ComputeSignature()
      
      ' Get the XML representation of the signature and save
      ' it to an XmlElement object.
      Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()
      
      ' Append the element to the XML document.
      doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))
      
      If TypeOf doc.FirstChild Is XmlDeclaration Then
         doc.RemoveChild(doc.FirstChild)
      End If
      
      ' Save the signed XML document to a file specified
      ' using the passed string.
      Dim xmltw As New XmlTextWriter(SignedFileName, New UTF8Encoding(False))
      doc.WriteTo(xmltw)
      xmltw.Close()
   End Sub
   
   
   ' Verify the signature of an XML file against an asymetric 
   ' algorithm and return the result.
   Public Shared Function VerifyXmlFile(Name As [String], Key As RSA) As [Boolean]
      ' Create a new XML document.
      Dim xmlDocument As New XmlDocument()
      
      ' Load the passed XML file into the document. 
      xmlDocument.Load(Name)
      
      ' Create a new SignedXml object and pass it
      ' the XML document class.
      Dim signedXml As New SignedXml(xmlDocument)
      
      ' Find the "Signature" node and create a new
      ' XmlNodeList object.
      Dim nodeList As XmlNodeList = xmlDocument.GetElementsByTagName("Signature")
      
      ' Load the signature node.
      signedXml.LoadXml(CType(nodeList(0), XmlElement))
      
      ' Check the signature and return the result.
      Return signedXml.CheckSignature(Key)
   End Function 
   
   
   
   ' Create example data to sign.
   Public Shared Sub CreateSomeXml(FileName As String)
      ' Create a new XmlDocument object.
      Dim document As New XmlDocument()
      
      ' Create a new XmlNode object.
      Dim node As XmlNode = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples")
      
      ' Add some text to the node.
      node.InnerText = "Example text to be signed."
      
      ' Append the node to the document.
      document.AppendChild(node)
      
      ' Save the XML document to the file name specified.
      Dim xmltw As New XmlTextWriter(FileName, New UTF8Encoding(False))
      document.WriteTo(xmltw)
      xmltw.Close()
   End Sub 
End Class 

O exemplo de código a seguir mostra como assinar e verificar um único elemento de um documento XML usando uma assinatura enveloping.The following code example shows how to sign and verify a single element of an XML document using an enveloping signature.

//
// This example signs an XML file using an
// envelope signature. It then verifies the 
// signed XML.
//
#using <System.Xml.dll>
#using <System.Security.dll>
#using <System.dll>

using namespace System;
using namespace System::Security::Cryptography;
using namespace System::Security::Cryptography::Xml;
using namespace System::Text;
using namespace System::Xml;

// Sign an XML file and save the signature in a new file.
static void SignXmlFile( String^ FileName, String^ SignedFileName, RSA^ Key, array<String^>^ElementsToSign )
{
   
   // Check the arguments.  
   if ( FileName == nullptr )
      throw gcnew ArgumentNullException( L"FileName" );

   if ( SignedFileName == nullptr )
      throw gcnew ArgumentNullException( L"SignedFileName" );

   if ( Key == nullptr )
      throw gcnew ArgumentNullException( L"Key" );

   if ( ElementsToSign == nullptr )
      throw gcnew ArgumentNullException( L"ElementsToSign" );

   
   // Create a new XML document.
   XmlDocument^ doc = gcnew XmlDocument;
   
   // Format the document to ignore white spaces.
   doc->PreserveWhitespace = false;
   
   // Load the passed XML file using it's name.
   doc->Load( gcnew XmlTextReader( FileName ) );
   
   // Create a SignedXml object.
   SignedXml^ signedXml = gcnew SignedXml( doc );
   
   // Add the key to the SignedXml document. 
   signedXml->SigningKey = Key;
   
   // Loop through each passed element to sign 
   // and create a reference.
   System::Collections::IEnumerator^ myEnum = ElementsToSign->GetEnumerator();
   while ( myEnum->MoveNext() )
   {
      String^ s = safe_cast<String^>(myEnum->Current);
      
      // Create a reference to be signed.
      Reference^ reference = gcnew Reference;
      reference->Uri = s;
      
      // Add an enveloped transformation to the reference.
      XmlDsigEnvelopedSignatureTransform^ env = gcnew XmlDsigEnvelopedSignatureTransform;
      reference->AddTransform( env );
      
      // Add the reference to the SignedXml object.
      signedXml->AddReference( reference );
   }

   
   // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
   KeyInfo^ keyInfo = gcnew KeyInfo;
   keyInfo->AddClause( gcnew RSAKeyValue( dynamic_cast<RSA^>(Key) ) );
   signedXml->KeyInfo = keyInfo;
   
   // Compute the signature.
   signedXml->ComputeSignature();
   
   // Get the XML representation of the signature and save
   // it to an XmlElement object.
   XmlElement^ xmlDigitalSignature = signedXml->GetXml();
   
   // Append the element to the XML document.
   doc->DocumentElement->AppendChild( doc->ImportNode( xmlDigitalSignature, true ) );
   if ( dynamic_cast<XmlDeclaration^>(doc->FirstChild) )
   {
      doc->RemoveChild( doc->FirstChild );
   }

   
   // Save the signed XML document to a file specified
   // using the passed string.
   XmlTextWriter^ xmltw = gcnew XmlTextWriter( SignedFileName,gcnew UTF8Encoding( false ) );
   doc->WriteTo( xmltw );
   xmltw->Close();
}


// Verify the signature of an XML file and return the result.
static Boolean VerifyXmlFile( String^ Name )
{
   
   // Check the arguments.  
   if ( Name == nullptr )
      throw gcnew ArgumentNullException( L"Name" );

   
   // Create a new XML document.
   XmlDocument^ xmlDocument = gcnew XmlDocument;
   
   // Format using white spaces.
   xmlDocument->PreserveWhitespace = true;
   
   // Load the passed XML file into the document. 
   xmlDocument->Load( Name );
   
   // Create a new SignedXml object and pass it
   // the XML document class.
   SignedXml^ signedXml = gcnew SignedXml( xmlDocument );
   
   // Find the "Signature" node and create a new
   // XmlNodeList object.
   XmlNodeList^ nodeList = xmlDocument->GetElementsByTagName( L"Signature" );
   
   // Load the signature node.
   signedXml->LoadXml( dynamic_cast<XmlElement^>(nodeList->Item( 0 )) );
   
   // Check the signature and return the result.
   return signedXml->CheckSignature();
}

int main()
{
   
   // Generate a signing key.
   RSACryptoServiceProvider^ Key = gcnew RSACryptoServiceProvider;
   try
   {
      
      // Specify an element to sign. 
      array<String^>^elements = {L"#tag1"};
      
      // Sign an XML file and save the signature to a 
      // new file.
      SignXmlFile( L"Test.xml", L"SignedExample.xml", Key, elements );
      Console::WriteLine( L"XML file signed." );
      
      // Verify the signature of the signed XML.
      Console::WriteLine( L"Verifying signature..." );
      bool result = VerifyXmlFile( L"SignedExample.xml" );
      
      // Display the results of the signature verification to 
      // the console.
      if ( result )
      {
         Console::WriteLine( L"The XML signature is valid." );
      }
      else
      {
         Console::WriteLine( L"The XML signature is not valid." );
      }
   }
   catch ( CryptographicException^ e ) 
   {
      Console::WriteLine( e->Message );
   }
   finally
   {
      
      // Clear resources associated with the 
      // RSACryptoServiceProvider.
      Key->Clear();
   }

   return 1;
}

//
// This example signs an XML file using an
// envelope signature. It then verifies the 
// signed XML.
//
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;

public class SignVerifyEnvelope
{

    public static void Main(String[] args)
    {
        // Generate a signing key.
       RSACryptoServiceProvider Key = new RSACryptoServiceProvider();

       try
       {
           // Specify an element to sign. 
           string[] elements =  { "#tag1" };

           // Sign an XML file and save the signature to a 
           // new file.
           SignXmlFile("Test.xml", "SignedExample.xml", Key, elements);
           Console.WriteLine("XML file signed.");

           // Verify the signature of the signed XML.
           Console.WriteLine("Verifying signature...");

           bool result = VerifyXmlFile("SignedExample.xml");

           // Display the results of the signature verification to 
           // the console.
           if (result)
           {
               Console.WriteLine("The XML signature is valid.");
           }
           else
           {
               Console.WriteLine("The XML signature is not valid.");
           }
       }
       catch (CryptographicException e)
       {
           Console.WriteLine(e.Message);
       }
       finally
       {
           // Clear resources associated with the 
           // RSACryptoServiceProvider.
           Key.Clear();
       }
   }

    // Sign an XML file and save the signature in a new file.
    public static void SignXmlFile(string FileName, string SignedFileName, RSA Key, string[] ElementsToSign)
    {
        // Check the arguments.  
        if (FileName == null)
            throw new ArgumentNullException("FileName");
        if (SignedFileName == null)
            throw new ArgumentNullException("SignedFileName");
        if (Key == null)
            throw new ArgumentNullException("Key");
        if (ElementsToSign == null)
            throw new ArgumentNullException("ElementsToSign");

        // Create a new XML document.
        XmlDocument doc = new XmlDocument();

        // Format the document to ignore white spaces.
        doc.PreserveWhitespace = false;

        // Load the passed XML file using it's name.
        doc.Load(new XmlTextReader(FileName));

        // Create a SignedXml object.
        SignedXml signedXml = new SignedXml(doc);

        // Add the key to the SignedXml document. 
        signedXml.SigningKey = Key;

        // Loop through each passed element to sign 
        // and create a reference.
        foreach (string s in ElementsToSign)
        {
            // Create a reference to be signed.
            Reference reference = new Reference();
            reference.Uri = s;

            // Add an enveloped transformation to the reference.
            XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
            reference.AddTransform(env);

            // Add the reference to the SignedXml object.
            signedXml.AddReference(reference);

        }

        // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
        KeyInfo keyInfo = new KeyInfo();
        keyInfo.AddClause(new RSAKeyValue((RSA)Key));
        signedXml.KeyInfo = keyInfo;

        // Compute the signature.
        signedXml.ComputeSignature();

        // Get the XML representation of the signature and save
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();

        // Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));

        if (doc.FirstChild is XmlDeclaration)
        {
            doc.RemoveChild(doc.FirstChild);
        }

        // Save the signed XML document to a file specified
        // using the passed string.
        XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
        doc.WriteTo(xmltw);
        xmltw.Close();
    }
    // Verify the signature of an XML file and return the result.
    public static Boolean VerifyXmlFile(String Name)
    {
        // Check the arguments.  
        if (Name == null)
            throw new ArgumentNullException("Name");

        // Create a new XML document.
        XmlDocument xmlDocument = new XmlDocument();

        // Format using white spaces.
        xmlDocument.PreserveWhitespace = true;

        // Load the passed XML file into the document. 
        xmlDocument.Load(Name);

        // Create a new SignedXml object and pass it
        // the XML document class.
        SignedXml signedXml = new SignedXml(xmlDocument);

        // Find the "Signature" node and create a new
        // XmlNodeList object.
        XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");

        // Load the signature node.
        signedXml.LoadXml((XmlElement)nodeList[0]);

        // Check the signature and return the result.
        return signedXml.CheckSignature();
    }
}
' This example signs an XML file using an
' envelope signature. It then verifies the 
' signed XML.
'
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Text
Imports System.Xml



Module SignVerifyEnvelope



    Sub Main(ByVal args() As String)
        ' Generate a signing key.
        Dim Key As New RSACryptoServiceProvider()

        Try
            ' Specify an element to sign. 
            Dim elements As String() = New String() {"#tag1"}

            ' Sign an XML file and save the signature to a 
            ' new file.
            SignXmlFile("Test.xml", "SignedExample.xml", Key, elements)
            Console.WriteLine("XML file signed.")

            ' Verify the signature of the signed XML.
            Console.WriteLine("Verifying signature...")

            Dim result As Boolean = VerifyXmlFile("SignedExample.xml")

            ' Display the results of the signature verification to \
            ' the console.
            If result Then
                Console.WriteLine("The XML signature is valid.")
            Else
                Console.WriteLine("The XML signature is not valid.")
            End If
        Catch e As CryptographicException
            Console.WriteLine(e.Message)
        Finally
            ' Clear resources associated with the 
            ' RSACryptoServiceProvider.
            Key.Clear()
        End Try

    End Sub


    ' Sign an XML file and save the signature in a new file.
    Sub SignXmlFile(ByVal FileName As String, ByVal SignedFileName As String, ByVal Key As RSA, ByVal ElementsToSign() As String)
        ' Check the arguments.  
        If FileName Is Nothing Then
            Throw New ArgumentNullException("FileName")
        End If
        If SignedFileName Is Nothing Then
            Throw New ArgumentNullException("SignedFileName")
        End If
        If Key Is Nothing Then
            Throw New ArgumentNullException("Key")
        End If
        If ElementsToSign Is Nothing Then
            Throw New ArgumentNullException("ElementsToSign")
        End If
        ' Create a new XML document.
        Dim doc As New XmlDocument()

        ' Format the document to ignore white spaces.
        doc.PreserveWhitespace = False

        ' Load the passed XML file using it's name.
        doc.Load(New XmlTextReader(FileName))

        ' Create a SignedXml object.
        Dim signedXml As New SignedXml(doc)

        ' Add the key to the SignedXml document. 
        signedXml.SigningKey = Key

        ' Loop through each passed element to sign 
        ' and create a reference.
        Dim s As String
        For Each s In ElementsToSign
            ' Create a reference to be signed.
            Dim reference As New Reference()
            reference.Uri = s

            ' Add an enveloped transformation to the reference.
            Dim env As New XmlDsigEnvelopedSignatureTransform()
            reference.AddTransform(env)

            ' Add the reference to the SignedXml object.
            signedXml.AddReference(reference)
        Next s

        ' Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
        Dim keyInfo As New KeyInfo()
        keyInfo.AddClause(New RSAKeyValue(CType(Key, RSA)))
        signedXml.KeyInfo = keyInfo

        ' Compute the signature.
        signedXml.ComputeSignature()

        ' Get the XML representation of the signature and save
        ' it to an XmlElement object.
        Dim xmlDigitalSignature As XmlElement = signedXml.GetXml()

        ' Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, True))


        If TypeOf doc.FirstChild Is XmlDeclaration Then
            doc.RemoveChild(doc.FirstChild)
        End If

        ' Save the signed XML document to a file specified
        ' using the passed string.
        Dim xmltw As New XmlTextWriter(SignedFileName, New UTF8Encoding(False))
        doc.WriteTo(xmltw)
        xmltw.Close()

    End Sub

    ' Verify the signature of an XML file and return the result.
    Function VerifyXmlFile(ByVal Name As String) As [Boolean]
        ' Check the arguments.  
        If Name Is Nothing Then
            Throw New ArgumentNullException("Name")
        End If
        ' Create a new XML document.
        Dim xmlDocument As New XmlDocument()

        ' Format using white spaces.
        xmlDocument.PreserveWhitespace = True

        ' Load the passed XML file into the document. 
        xmlDocument.Load(Name)

        ' Create a new SignedXml object and pass it
        ' the XML document class.
        Dim signedXml As New SignedXml(xmlDocument)

        ' Find the "Signature" node and create a new
        ' XmlNodeList object.
        Dim nodeList As XmlNodeList = xmlDocument.GetElementsByTagName("Signature")

        ' Load the signature node.
        signedXml.LoadXml(CType(nodeList(0), XmlElement))

        ' Check the signature and return the result.
        Return signedXml.CheckSignature()

    End Function
End Module

Comentários

A classe SignedXml é a implementação do .NET da sintaxe de assinatura XMLdo World Wide Web CONSORTIUM (W3C) e a especificação de processamento, também conhecida como XMLDSIG (assinatura digital XML).The SignedXml class is the .NET implementation of the World Wide Web Consortium (W3C) XML Signature Syntax and Processing Specification, also known as XMLDSIG (XML Digital Signature). O XMLDSIG é uma maneira baseada em padrões e interoperável de assinar e verificar todo ou parte de um documento XML ou outros dados que são endereçáveis de um URI (Uniform Resource Identifier).XMLDSIG is a standards-based, interoperable way to sign and verify all or part of an XML document or other data that is addressable from a Uniform Resource Identifier (URI).

Use a classe SignedXml sempre que você precisar compartilhar dados XML assinados entre aplicativos ou organizações de forma padrão.Use the SignedXml class whenever you need to share signed XML data between applications or organizations in a standard way. Todos os dados assinados usando essa classe podem ser verificados por qualquer implementação compatível da especificação W3C para XMLDSIG.Any data signed using this class can be verified by any conforming implementation of the W3C specification for XMLDSIG.

A classe SignedXml permite que você crie os três seguintes tipos de assinaturas digitais XML a seguir:The SignedXml class allows you to create the following three kinds of XML digital signatures:

Tipo de assinaturaSignature Type DescriçãoDescription
Assinatura envelopadaEnveloped signature A assinatura está contida no elemento XML que está sendo assinado.The signature is contained within the XML element being signed.
Assinatura envelopingEnveloping signature O XML assinado está contido no elemento <Signature>.The signed XML is contained within the <Signature> element.
Assinatura desanexada internaInternal detached signature A assinatura e o XML assinado estão no mesmo documento, mas nenhum elemento contém o outro.The signature and signed XML are in the same document, but neither element contains the other.

Há também um quarto tipo de assinatura chamado de assinatura desanexada externa, que é quando os dados e a assinatura estão em documentos XML separados.There is also a fourth kind of signature called an external detached signature which is when the data and signature are in separate XML documents. Não há suporte para assinaturas desanexadas externas na classe SignedXml.External detached signatures are not supported by the SignedXml class.

A estrutura de uma assinatura XMLThe structure of an XML Signature

XMLDSIG cria um elemento <Signature>, que contém uma assinatura digital de um documento XML ou outros dados endereçáveis de um URI.XMLDSIG creates a <Signature> element, which contains a digital signature of an XML document or other data that is addressable from a URI. O elemento <Signature> pode, opcionalmente, conter informações sobre onde encontrar uma chave que verificará a assinatura e qual algoritmo criptográfico foi usado para assinatura.The <Signature> element can optionally contain information about where to find a key that will verify the signature and which cryptographic algorithm was used for signing. A estrutura básica é a seguinte:The basic structure is as follows:

<Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">  
    <SignedInfo>  
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>  
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>  
      <Reference URI="">  
        <Transforms>  
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>  
        </Transforms>  
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>  
        <DigestValue>Base64EncodedValue==</DigestValue>  
      </Reference>  
    </SignedInfo>  
    <SignatureValue>AnotherBase64EncodedValue===</SignatureValue>  
</Signature>

As principais partes dessa estrutura são:The main parts of this structure are:

  • O elemento <CanonicalizationMethod>The <CanonicalizationMethod> element

    Especifica as regras para regravar o elemento de Signature de XML/texto em bytes para validação de assinatura.Specifies the rules for rewriting the Signature element from XML/text into bytes for signature validation. O valor padrão no .NET é http://www.w3.org/TR/2001/REC-xml-c14n-20010315, que identifica um algoritmo confiável.The default value in .NET is http://www.w3.org/TR/2001/REC-xml-c14n-20010315, which identifies a trustworthy algorithm. Esse elemento é representado pela propriedade SignedInfo.CanonicalizationMethod.This element is represented by the SignedInfo.CanonicalizationMethod property.

  • O elemento <SignatureMethod>The <SignatureMethod> element

    Especifica o algoritmo usado para geração e validação de assinatura, que foi aplicado ao elemento <Signature> para produzir o valor em <SignatureValue>.Specifies the algorithm used for signature generation and validation, which was applied to the <Signature> element to produce the value in <SignatureValue>. No exemplo anterior, o valor http://www.w3.org/2000/09/xmldsig#rsa-sha1 identifica uma assinatura RSA PKCS1 SHA-1.In the previous example, the value http://www.w3.org/2000/09/xmldsig#rsa-sha1 identifies an RSA PKCS1 SHA-1 signature. Devido a problemas de colisão com o SHA-1, a Microsoft recomenda um modelo de segurança baseado no SHA-256 ou superior.Due to collision problems with SHA-1, Microsoft recommends a security model based on SHA-256 or better. Esse elemento é representado pela propriedade SignatureMethod.This element is represented by the SignatureMethod property.

  • O elemento <SignatureValue>The <SignatureValue> element

    Especifica a assinatura criptográfica para o elemento <Signature>.Specifies the cryptographic signature for the <Signature> element. Se essa assinatura não verificar, uma parte do bloco de <Signature> foi violada e o documento será considerado inválido.If this signature does not verify, then some portion of the <Signature> block was tampered with, and the document is considered invalid. Desde que o valor de <CanonicalizationMethod> seja confiável, esse valor é altamente resistente à violação.As long as the <CanonicalizationMethod> value is trustworthy, this value is highly resistant to tampering. Esse elemento é representado pela propriedade SignatureValue.This element is represented by the SignatureValue property.

  • O atributo URI do elemento <Reference>The URI attribute of the <Reference> element

    Especifica um objeto de dados usando uma referência de URI.Specifies a data object using a URI reference. Esse atributo é representado pela propriedade Reference.Uri.This attribute is represented by the Reference.Uri property.

    • Não especificar o atributo URI, ou seja, definir a propriedade Reference.Uri como null, significa que o aplicativo receptor deve saber a identidade do objeto.Not specifying the URI attribute, that is, setting the Reference.Uri property to null, means that the receiving application is expected to know the identity of the object. Na maioria dos casos, um URI de null resultará em uma exceção sendo gerada.In most cases, a null URI will result in an exception being thrown. Não use um URI de null, a menos que seu aplicativo esteja interoperante com um protocolo que o exija.Do not use a null URI, unless your application is interoperating with a protocol which requires it.

    • Definir o atributo URI como uma cadeia de caracteres vazia indica que o elemento raiz do documento está sendo assinado, um formulário de assinatura envelopada.Setting the URI attribute to an empty string indicates that the root element of the document is being signed, a form of enveloped signature.

    • Se o valor do atributo URI começar com #, o valor deverá ser resolvido para um elemento no documento atual.If the value of URI attribute starts with #, then the value must resolve to an element in the current document. Esse formulário pode ser usado com qualquer um dos tipos de assinatura com suporte (assinatura envelopada, assinatura enveloping ou assinatura desanexada interna).This form can be used with any of the supported signature types (enveloped signature, enveloping signature or internal detached signature).

    • Qualquer outra coisa é considerada uma assinatura desanexada de recurso externo e não é suportada pela classe SignedXml.Anything else is considered an external resource detached signature and is not supported by the SignedXml class.

  • O elemento <Transforms>The <Transforms> element

    Contém uma lista ordenada de elementos de <Transform> que descrevem como o signatário obteve o objeto de dados que foi resumido.Contains an ordered list of <Transform> elements that describe how the signer obtained the data object that was digested. Um algoritmo de transformação é semelhante ao método de canonização, mas em vez de reescrever o elemento <Signature>, ele reescreve o conteúdo identificado pelo atributo URI do elemento <Reference>.A transform algorithm is similar to the canonicalization method, but instead of rewriting the <Signature> element, it rewrites the content identified by the URI attribute of the <Reference> element. O elemento <Transforms> é representado pela classe TransformChain.The <Transforms> element is represented by the TransformChain class.

    • Cada algoritmo de transformação é definido como pegar um XML (um conjunto de nós XPath) ou bytes como entrada.Each transform algorithm is defined as taking either XML (an XPath node-set) or bytes as input. Se o formato dos dados atuais for diferente dos requisitos de entrada de transformação, as regras de conversão serão aplicadas.If the format of the current data differs from the transform input requirements, conversion rules are applied.

    • Cada algoritmo de transformação é definido como produzir XML ou bytes como a saída.Each transform algorithm is defined as producing either XML or bytes as the output.

    • Se a saída do último algoritmo de transformação não estiver definida em bytes (ou nenhuma transformação tiver sido especificada), o método de canonização será usado como uma transformação implícita (mesmo que um algoritmo diferente tenha sido especificado no elemento <CanonicalizationMethod>).If the output of the last transform algorithm is not defined in bytes (or no transforms were specified), then the canonicalization method is used as an implicit transform (even if a different algorithm was specified in the <CanonicalizationMethod> element).

    • Um valor de http://www.w3.org/2000/09/xmldsig#enveloped-signature para o algoritmo de transformação codifica uma regra que é interpretada como remover o elemento <Signature> do documento.A value of http://www.w3.org/2000/09/xmldsig#enveloped-signature for the transform algorithm encodes a rule which is interpreted as remove the <Signature> element from the document. Caso contrário, um verificador de uma assinatura envelopada resumirá o documento, incluindo a assinatura, mas o assinante teria resumido o documento antes da aplicação da assinatura, levando a diferentes respostas.Otherwise, a verifier of an enveloped signature will digest the document, including the signature, but the signer would have digested the document before the signature was applied, leading to different answers.

  • O elemento <DigestMethod>The <DigestMethod> element

    Identifica o método Digest (hash criptográfico) a ser aplicado no conteúdo transformado identificado pelo atributo URI do elemento <Reference>.Identifies the digest (cryptographic hash) method to apply on the transformed content identified by the URI attribute of the <Reference> element. Isso é representado pela propriedade Reference.DigestMethod.This is represented by the Reference.DigestMethod property.

Escolhendo um método de canonizaçãoChoosing a canonicalization method

A menos que interopere com uma especificação que exija o uso de um valor diferente, recomendamos que você use o método de canonização do .NET padrão, que é o algoritmo XML-C14N 1,0, cujo valor é http://www.w3.org/TR/2001/REC-xml-c14n-20010315.Unless interoperating with a specification which requires the use of a different value, we recommend that you use the default .NET canonicalization method, which is the XML-C14N 1.0 algorithm, whose value is http://www.w3.org/TR/2001/REC-xml-c14n-20010315. O algoritmo XML-C14N 1,0 deve ter suporte de todas as implementações de XMLDSIG, principalmente porque é uma transformação final implícita a ser aplicada.The XML-C14N 1.0 algorithm is required to be supported by all implementations of XMLDSIG, particularly as it is an implicit final transform to apply.

Há versões de algoritmos de canonização que dão suporte à preservação de comentários.There are versions of canonicalization algorithms which support preserving comments. Comentários: preservar métodos de canonização não é recomendado porque eles violam o princípio "assinar o que é visto".Comment-preserving canonicalization methods are not recommended because they violate the "sign what is seen" principle. Ou seja, os comentários em um elemento <Signature> não alterarão a lógica de processamento de como a assinatura é executada, simplesmente qual é o valor da assinatura.That is, the comments in a <Signature> element will not alter the processing logic for how the signature is performed, merely what the signature value is. Quando combinado com um algoritmo de assinatura fraco, permitir que os comentários sejam incluídos dá a um invasor liberdade desnecessária para forçar uma colisão de hash, fazendo com que um documento adulterado pareça legítimo.When combined with a weak signature algorithm, allowing the comments to be included gives an attacker unnecessary freedom to force a hash collision, making a tampered document appear legitimate. No .NET Framework, somente os canonicalizers internos têm suporte por padrão.In the .NET Framework, only built-in canonicalizers are supported by default. Para dar suporte a canonicalizers adicionais ou personalizados, consulte a propriedade SafeCanonicalizationMethods.To support additional or custom canonicalizers, see the SafeCanonicalizationMethods property. Se o documento usar um método de canonização que não esteja na coleção representada pela propriedade SafeCanonicalizationMethods, o método CheckSignature retornará false.If the document uses a canonicalization method that is not in the collection represented by the SafeCanonicalizationMethods property, then the CheckSignature method will return false.

Observação

Um aplicativo extremamente defensiva pode remover qualquer valor que não espere que os assinantes usem da coleção de SafeCanonicalizationMethods.An extremely defensive application can remove any values it does not expect signers to use from the SafeCanonicalizationMethods collection.

Os valores de referência são seguros contra violação?Are the Reference values safe from tampering?

Sim, os valores de <Reference> são seguros contra violação.Yes, the <Reference> values are safe from tampering. O .NET verifica o cálculo de <SignatureValue> antes de processar qualquer um dos valores de <Reference> e suas transformações associadas e será anulado antecipadamente para evitar instruções de processamento potencialmente mal-intencionadas..NET verifies the <SignatureValue> computation before processing any of the <Reference> values and their associated transforms, and will abort early to avoid potentially malicious processing instructions.

Escolhendo os elementos a serem assinadosChoosing the elements to sign

É recomendável que você use o valor de "" para o atributo URI (ou defina a propriedade Uri como uma cadeia de caracteres vazia), se possível.We recommend that you use the value of "" for the URI attribute (or set the Uri property to an empty string), if possible. Isso significa que todo o documento é considerado para a computação resumida, o que significa que todo o documento está protegido contra violação.This means the whole document is considered for the digest computation, which means the whole document is protected from tampering.

É muito comum ver URI valores na forma de âncoras como #foo, referindo-se a um elemento cujo atributo de ID é "foo".It is very common to see URI values in the form of anchors such as #foo, referring to an element whose ID attribute is "foo". Infelizmente, é fácil que isso seja adulterado porque inclui apenas o conteúdo do elemento de destino, não o contexto.Unfortunately, it is easy for this to be tampered with because this includes only the content of the target element, not the context. Abusando essa distinção é conhecida como XSW (encapsulamento de assinatura XML).Abusing this distinction is known as XML Signature Wrapping (XSW).

Se seu aplicativo considerar que os comentários são semânticos (o que não é comum ao lidar com XML), você deverá usar "#xpointer (/)" em vez de "" e "#xpointer (ID (' foo '))" em vez de "#foo".If your application considers comments to be semantic (which is not common when dealing with XML), then you should use "#xpointer(/)" instead of "", and "#xpointer(id('foo'))" instead of "#foo". As versões de #xpointer são interpretadas como incluindo comentários, enquanto os formulários de curtoname estão excluindo comentários.The #xpointer versions are interpreted as including comments, while the shortname forms are excluding comments.

Se você precisar aceitar documentos que estão apenas parcialmente protegidos e quiser garantir que está lendo o mesmo conteúdo protegido pela assinatura, use o método GetIdElement.If you need to accept documents which are only partially protected and you want to ensure that you are reading the same content that the signature protected, use the GetIdElement method.

Considerações sobre segurança sobre o elemento KeyInfoSecurity considerations about the KeyInfo element

Os dados no elemento opcional <KeyInfo> (ou seja, a propriedade KeyInfo), que contém uma chave para validar a assinatura, não devem ser confiáveis.The data in the optional <KeyInfo> element (that is, the KeyInfo property), which contains a key to validate the signature, should not be trusted.

Em particular, quando o valor de KeyInfo representa uma chave pública simples, DSA ou ECDSA, o documento pode ter sido adulterado, apesar do método CheckSignature relatando que a assinatura é válida.In particular, when the KeyInfo value represents a bare RSA, DSA or ECDSA public key, the document could have been tampered with, despite the CheckSignature method reporting that the signature is valid. Isso pode acontecer porque a entidade que faz a violação precisa apenas gerar uma nova chave e assinar novamente o documento adulterado com essa nova chave.This can happen because the entity doing the tampering just has to generate a new key and re-sign the tampered document with that new key. Portanto, a menos que seu aplicativo Verifique se a chave pública é um valor esperado, o documento deve ser tratado como se tivesse sido violado.So, unless your application verifies that the public key is an expected value, the document should be treated as if it were tampered with. Isso requer que seu aplicativo examine a chave pública inserida no documento e verifique-a em uma lista de valores conhecidos para o contexto do documento.This requires that your application examine the public key embedded within the document and verify it against a list of known values for the document context. Por exemplo, se o documento puder ser entendido para ser emitido por um usuário conhecido, você verificará a chave em relação a uma lista de chaves conhecidas usadas por esse usuário.For example, if the document could be understood to be issued by a known user, you'd check the key against a list of known keys used by that user.

Você também pode verificar a chave depois de processar o documento usando o método CheckSignatureReturningKey, em vez de usar o método CheckSignature.You can also verify the key after processing the document by using the CheckSignatureReturningKey method, instead of using the CheckSignature method. Mas, para a segurança ideal, você deve verificar a chave com antecedência.But, for the optimal security, you should verify the key beforehand.

Como alternativa, considere a possibilidade de tentar as chaves públicas registradas do usuário, em vez de ler o que há no elemento <KeyInfo>.Alternately, consider trying the user's registered public keys, rather than reading what's in the <KeyInfo> element.

Considerações sobre segurança sobre o elemento X509DataSecurity considerations about the X509Data element

O elemento <X509Data> opcional é um filho do elemento <KeyInfo> e contém um ou mais certificados X509 ou identificadores para certificados X509.The optional <X509Data> element is a child of the <KeyInfo> element and contains one or more X509 certificates or identifiers for X509 certificates. Os dados no elemento <X509Data> também não devem ser inerentemente confiáveis.The data in the <X509Data> element should also not be inherently trusted.

Ao verificar um documento com o elemento de <X509Data> inserido, o .NET verifica apenas se os dados são resolvidos para um certificado X509 cuja chave pública pode ser usada com êxito para validar a assinatura do documento.When verifying a document with the embedded <X509Data> element, .NET verifies only that the data resolves to an X509 certificate whose public key can be successfully used to validate the document signature. Ao contrário da chamada do método CheckSignature com o parâmetro verifySignatureOnly definido como false, nenhuma verificação de revogação é executada, nenhuma relação de confiança de cadeia é verificada e nenhuma expiração é verificada.Unlike calling the CheckSignature method with the verifySignatureOnly parameter set to false, no revocation check is performed, no chain trust is checked, and no expiration is verified. Mesmo que seu aplicativo Extraia o certificado em si e o passe para o método CheckSignature com o parâmetro verifySignatureOnly definido como false, isso ainda não é suficiente para impedir a violação do documento.Even if your application extracts the certificate itself and passes it to the CheckSignature method with the verifySignatureOnly parameter set to false, that is still not sufficient validation to prevent document tampering. O certificado ainda precisa ser verificado como sendo apropriado para o documento que está sendo assinado.The certificate still needs to be verified as being appropriate for the document being signed.

O uso de um certificado de assinatura incorporado pode fornecer estratégias úteis de rotação de chaves, seja na seção <X509Data> ou no conteúdo do documento.Using an embedded signing certificate can provide useful key rotation strategies, whether in the <X509Data> section or in the document content. Ao usar essa abordagem, um aplicativo deve extrair o certificado manualmente e executar a validação semelhante a:When using this approach an application should extract the certificate manually and perform validation similar to:

  • O certificado foi emitido diretamente ou por meio de uma cadeia por uma autoridade de certificação (CA) cujo certificado público está inserido no aplicativo.The certificate was issued directly or via a chain by a Certificate Authority (CA) whose public certificate is embedded in the application.

    Usar a lista de confiança fornecida pelo sistema operacional sem verificações adicionais, como um nome de entidade conhecido, não é suficiente para impedir a violação de SignedXml.Using the OS-provided trust list without additional checks, such as a known subject name, is not sufficient to prevent tampering in SignedXml.

  • O certificado foi verificado para não ter expirado no momento da assinatura de documento (ou "agora" para processamento de documentos quase em tempo real).The certificate is verified to have not been expired at the time of document signing (or "now" for near real-time document processing).

  • Para certificados de vida útil longa emitidos por uma AC que dá suporte à revogação, verifique se o certificado não foi revogado.For long-lived certificates issued by a CA which supports revocation, verify the certificate was not revoked.

  • A entidade do certificado é verificada como sendo apropriada ao documento atual.The certificate subject is verified as being appropriate to the current document.

Escolhendo o algoritmo de transformaçãoChoosing the transform algorithm

Se você estiver Interoperando com uma especificação que tenha ditado valores específicos (como XrML), você precisará seguir a especificação.If you are interoperating with a specification which has dictated specific values (such as XrML), then you need to follow the specification. Se você tiver uma assinatura envelopada (como ao assinar o documento inteiro), você precisará usar http://www.w3.org/2000/09/xmldsig#enveloped-signature (representado pela classe XmlDsigEnvelopedSignatureTransform).If you have an enveloped signature (such as when signing the whole document), then you need to use http://www.w3.org/2000/09/xmldsig#enveloped-signature (represented by the XmlDsigEnvelopedSignatureTransform class). Você também pode especificar a transformação XML-C14N implícita, mas ela não é necessária.You can specify the implicit XML-C14N transform as well, but it's not necessary. Para uma assinatura enveloping ou desanexada, nenhuma transformação é necessária.For an enveloping or detached signature, no transforms are required. A transformação XML-C14N implícita cuida de tudo.The implicit XML-C14N transform takes care of everything.

Com a segurança atualizada introduzida pelo Boletim de segurança da Microsoft MS16-035, o .net restringiu quais transformações podem ser usadas na verificação de documentos por padrão, com transformações não confiáveis, fazendo com que CheckSignature sempre retorne false.With the security updated introduced by the Microsoft Security Bulletin MS16-035, .NET has restricted what transforms can be used in document verification by default, with untrusted transforms causing CheckSignature to always return false. Em particular, as transformações que exigem entrada adicional (especificada como elementos filho no XML) não são mais permitidas devido à sua susceptibilidade de abuso por usuários mal-intencionados.In particular, transforms which require additional input (specified as child elements in the XML) are no longer allowed due to their susceptibility of abuse by malicious users. O W3C aconselha evitar as transformações XPath e XSLT, que são as duas transformações principais afetadas por essas restrições.The W3C advises avoiding the XPath and XSLT transforms, which are the two main transforms affected by these restrictions.

O problema com referências externasThe problem with external references

Se um aplicativo não verificar se as referências externas parecem apropriadas para o contexto atual, elas podem ser abvidadas de maneiras que fornecem muitas vulnerabilidades de segurança (incluindo negação de serviço, negação de serviço de reflexão distribuída, informações Divulgação, bypass de assinatura e execução remota de código).If an application does not verify that external references seem appropriate for the current context, they can be abused in ways that provide for many security vulnerabilities (including Denial of Service, Distributed Reflection Denial of Service, Information Disclosure, Signature Bypass, and Remote Code Execution). Mesmo se um aplicativo fosse validar o URI de referência externa, resta um problema do recurso que está sendo carregado duas vezes: uma vez quando o aplicativo lê-lo e uma vez quando SignedXml lê-lo.Even if an application were to validate the external reference URI, there would remain a problem of the resource being loaded twice: once when your application reads it, and once when SignedXml reads it. Como não há nenhuma garantia de que as etapas de leitura e verificação de documento do aplicativo tenham o mesmo conteúdo, a assinatura não fornecerá confiabilidade.Since there's no guarantee that the application read and document verify steps have the same content, the signature does not provide trustworthiness.

Devido aos riscos de referências externas, SignedXml gerará uma exceção quando uma referência externa for encontrada.Given the risks of external references, SignedXml will throw an exception when an external reference is encountered. Para obter mais informações sobre esse problema, consulte o artigo 3148821 da basede dados de conhecimento.For more information about this issue, see KB article 3148821.

Construtores

SignedXml()

Inicializa uma nova instância da classe SignedXml.Initializes a new instance of the SignedXml class.

SignedXml(XmlDocument)

Inicializa uma nova instância da classe SignedXml do documento XML especificado.Initializes a new instance of the SignedXml class from the specified XML document.

SignedXml(XmlElement)

Inicializa uma nova instância da classe SignedXml do objeto XmlElement especificado.Initializes a new instance of the SignedXml class from the specified XmlElement object.

Campos

m_signature

Representa o objeto Signature do objeto SignedXml atual.Represents the Signature object of the current SignedXml object.

m_strSigningKeyName

Representa o nome da chave instalada a ser usada para assinar o objeto SignedXml.Represents the name of the installed key to be used for signing the SignedXml object.

XmlDecryptionTransformUrl

Representa o URI (Uniform Resource Identifier) da transformação de descriptografia do modo XML.Represents the Uniform Resource Identifier (URI) for the XML mode decryption transformation. Este campo é constante.This field is constant.

XmlDsigBase64TransformUrl

Representa o URI (Uniform Resource Identifier) da transformação de base 64.Represents the Uniform Resource Identifier (URI) for the base 64 transformation. Este campo é constante.This field is constant.

XmlDsigC14NTransformUrl

Representa o URI (Uniform Resource Identifier) para a transformação XML canônica.Represents the Uniform Resource Identifier (URI) for the Canonical XML transformation. Este campo é constante.This field is constant.

XmlDsigC14NWithCommentsTransformUrl

Representa o URI (Uniform Resource Identifier) da transformação XML canônica, com comentários.Represents the Uniform Resource Identifier (URI) for the Canonical XML transformation, with comments. Este campo é constante.This field is constant.

XmlDsigCanonicalizationUrl

Representa o URI (Uniform Resource Identifier) do algoritmo de canonicalização padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard canonicalization algorithm for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigCanonicalizationWithCommentsUrl

Representa o URI (Uniform Resource Identifier) do algoritmo de canonização padrão para assinaturas digitais XML e inclui comentários.Represents the Uniform Resource Identifier (URI) for the standard canonicalization algorithm for XML digital signatures and includes comments. Este campo é constante.This field is constant.

XmlDsigDSAUrl

Representa o URI (Uniform Resource Identifier) do algoritmo de DSA padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard DSA algorithm for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigEnvelopedSignatureTransformUrl

Representa o URI (Uniform Resource Identifier) da transformação de assinatura envelopada.Represents the Uniform Resource Identifier (URI) for enveloped signature transformation. Este campo é constante.This field is constant.

XmlDsigExcC14NTransformUrl

Representa o URI (Uniform Resource Identifier) para a conversão em formato canônico exclusiva do XML.Represents the Uniform Resource Identifier (URI) for exclusive XML canonicalization. Este campo é constante.This field is constant.

XmlDsigExcC14NWithCommentsTransformUrl

Representa o URI (Uniform Resource Identifier) da canonicalização XML exclusiva, com comentários.Represents the Uniform Resource Identifier (URI) for exclusive XML canonicalization, with comments. Este campo é constante.This field is constant.

XmlDsigHMACSHA1Url

Representa o URI (Uniform Resource Identifier) do algoritmo de HMACSHA1 padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard HMACSHA1 algorithm for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigMinimalCanonicalizationUrl

Representa o URI (Uniform Resource Identifier) do algoritmo mínimo de canonicalização padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard minimal canonicalization algorithm for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigNamespaceUrl

Representa o URI (Uniform Resource Identifier) do algoritmo de namespace padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard namespace for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigRSASHA1Url

Representa o URI (Uniform Resource Identifier) do método de assinatura RSA padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard RSA signature method for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigRSASHA256Url

Representa o URI da variação de método de assinatura SHA-256 RSA para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the RSA SHA-256 signature method variation for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigRSASHA384Url

Representa o URI (Uniform Resource Identifier) da variação do método de assinatura SHA-384 RSA para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the RSA SHA-384 signature method variation for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigRSASHA512Url

Representa o URI (Uniform Resource Identifier) da variação do método de assinatura SHA-512 RSA para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the RSA SHA-512 signature method variation for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigSHA1Url

Representa o URI (Uniform Resource Identifier) do método de resumo SHA1 padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard SHA1 digest method for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigSHA256Url

Representa o URI (Uniform Resource Identifier) do método de resumo SHA256 padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard SHA256 digest method for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigSHA384Url

Representa o URI (Uniform Resource Identifier) do método de resumo SHA384 padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard SHA384 digest method for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigSHA512Url

Representa o URI (Uniform Resource Identifier) do método de resumo SHA512 padrão para assinaturas digitais XML.Represents the Uniform Resource Identifier (URI) for the standard SHA512 digest method for XML digital signatures. Este campo é constante.This field is constant.

XmlDsigXPathTransformUrl

Representa o URI (Uniform Resource Identifier) do XPath (Linguagem XML).Represents the Uniform Resource Identifier (URI) for the XML Path Language (XPath). Este campo é constante.This field is constant.

XmlDsigXsltTransformUrl

Representa o URI (Uniform Resource Identifier) de transformações XSLT.Represents the Uniform Resource Identifier (URI) for XSLT transformations. Este campo é constante.This field is constant.

XmlLicenseTransformUrl

Representa o URI (Uniform Resource Identifier) do algoritmo de transformação de licença usado para normalizar licenças XrML para assinaturas.Represents the Uniform Resource Identifier (URI) for the license transform algorithm used to normalize XrML licenses for signatures.

Propriedades

EncryptedXml

Obtém ou define um objeto EncryptedXml que define as regras de processamento de criptografia XML.Gets or sets an EncryptedXml object that defines the XML encryption processing rules.

KeyInfo

Obtém ou define o objeto KeyInfo do objeto SignedXml atual.Gets or sets the KeyInfo object of the current SignedXml object.

Resolver

Define o objeto XmlResolver atual.Sets the current XmlResolver object.

SafeCanonicalizationMethods

Obtém os nomes dos métodos cujos algoritmos de canonicalização são explicitamente permitidos.Gets the names of methods whose canonicalization algorithms are explicitly allowed.

Signature

Obtém o objeto Signature do objeto SignedXml atual.Gets the Signature object of the current SignedXml object.

SignatureFormatValidator

Obtém um delegado que será chamado para validar o formato (não a segurança criptográfica) de uma assinatura XML.Gets a delegate that will be called to validate the format (not the cryptographic security) of an XML signature.

SignatureLength

Obtém o comprimento da assinatura do objeto SignedXml atual.Gets the length of the signature for the current SignedXml object.

SignatureMethod

Obtém o método de assinatura do objeto SignedXml atual.Gets the signature method of the current SignedXml object.

SignatureValue

Obtém o valor de assinatura do objeto SignedXml atual.Gets the signature value of the current SignedXml object.

SignedInfo

Obtém o objeto SignedInfo do objeto SignedXml atual.Gets the SignedInfo object of the current SignedXml object.

SigningKey

Obtém ou define a chave de algoritmo assimétrico usada para assinar um objeto SignedXml.Gets or sets the asymmetric algorithm key used for signing a SignedXml object.

SigningKeyName

Obtém ou define o nome da chave instalada a ser usada para assinar o objeto SignedXml.Gets or sets the name of the installed key to be used for signing the SignedXml object.

Métodos

AddObject(DataObject)

Adiciona um objeto DataObject à lista de objetos a serem assinados.Adds a DataObject object to the list of objects to be signed.

AddReference(Reference)

Adiciona um objeto Reference ao objeto SignedXml que descreve um método de resumo, o valor de resumo e a transformação a ser usada para criar uma assinatura digital XML.Adds a Reference object to the SignedXml object that describes a digest method, digest value, and transform to use for creating an XML digital signature.

CheckSignature()

Determina se a propriedade Signature é verificada usando a chave pública na assinatura.Determines whether the Signature property verifies using the public key in the signature.

CheckSignature(AsymmetricAlgorithm)

Determina se a propriedade Signature verifica se a chave especificada existe.Determines whether the Signature property verifies for the specified key.

CheckSignature(KeyedHashAlgorithm)

Determina se a propriedade Signature é verificada em relação ao algoritmo MAC (Message Authentication Code) especificado.Determines whether the Signature property verifies for the specified message authentication code (MAC) algorithm.

CheckSignature(X509Certificate2, Boolean)

Determina se a propriedade Signature verifica o objeto X509Certificate2 especificado e, opcionalmente, se o certificado é válido.Determines whether the Signature property verifies for the specified X509Certificate2 object and, optionally, whether the certificate is valid.

CheckSignatureReturningKey(AsymmetricAlgorithm)

Determina se a propriedade Signature é verificada usando a chave pública na assinatura.Determines whether the Signature property verifies using the public key in the signature.

ComputeSignature()

Calcula uma assinatura digital XML.Computes an XML digital signature.

ComputeSignature(KeyedHashAlgorithm)

Calcula uma assinatura digital XML usando o algoritmo MAC (Message Authentication Code) especificado.Computes an XML digital signature using the specified message authentication code (MAC) algorithm.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.Determines whether the specified object is equal to the current object.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.Serves as the default hash function.

(Herdado de Object)
GetIdElement(XmlDocument, String)

Retorna o objeto XmlElement com a ID especificada do objeto XmlDocument especificado.Returns the XmlElement object with the specified ID from the specified XmlDocument object.

GetPublicKey()

Retorna a chave pública de uma assinatura.Returns the public key of a signature.

GetType()

Obtém o Type da instância atual.Gets the Type of the current instance.

(Herdado de Object)
GetXml()

Retorna a representação XML de um objeto SignedXml.Returns the XML representation of a SignedXml object.

LoadXml(XmlElement)

Carrega um estado SignedXml de um elemento XML.Loads a SignedXml state from an XML element.

MemberwiseClone()

Cria uma cópia superficial do Object atual.Creates a shallow copy of the current Object.

(Herdado de Object)
ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.Returns a string that represents the current object.

(Herdado de Object)

Aplica-se a

Veja também