KeyInfo クラス
XMLDSIG <KeyInfo> 要素を表します。
この型のすべてのメンバの一覧については、KeyInfo メンバ を参照してください。
System.Object
System.Security.Cryptography.Xml.KeyInfo
Public Class KeyInfo
Implements IEnumerable
[C#]
public class KeyInfo : IEnumerable
[C++]
public __gc class KeyInfo : public IEnumerable
[JScript]
public class KeyInfo implements IEnumerable
スレッドセーフ
この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。
解説
このクラスを使用すると、署名ジェネレータで、デジタル署名の検証に必要なキーの識別を簡単にするキー関連情報を一緒に送信できます。複数の種類のキー関連情報を 1 つの KeyInfo 内に含めることができます。それぞれの種類のキー関連情報は、関連付けられた KeyInfoClause の派生クラスを保持しています。
<KeyInfo> 要素の詳細については、www.w3.org/TR/xmldsig-core/ の W3C から提供されている XMLDSIG 仕様を参照してください。
使用例
'
' This example signs a file specified by a URI
' using a detached signature. It then verifies
' the signed XML.
'
Imports System
Imports System.Security.Cryptography
Imports System.Security.Cryptography.Xml
Imports System.Text
Imports System.Xml
Class XMLDSIGDetached
<STAThread()> _
Overloads Shared Sub Main(args() As String)
' The URI to sign.
Dim resourceToSign As String = "https://www.microsoft.com"
' The name of the file to which to save the XML signature.
Dim XmlFileName As String = "xmldsig.xml"
Try
' Generate a signing key.
Dim Key As New RSACryptoServiceProvider()
Console.WriteLine("Signing: {0}", resourceToSign)
' Sign the detached resourceand save the signature in an XML file.
SignDetachedResource(resourceToSign, XmlFileName, Key)
Console.WriteLine("XML signature was succesfully computed and saved to {0}.", XmlFileName)
' Verify the signature of the signed XML.
Console.WriteLine("Verifying signature...")
'Verify the XML signature in the XML file.
Dim result As Boolean = VerifyDetachedSignature(XmlFileName)
' 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.
Public Shared Sub SignDetachedResource(URIString As String, XmlSigFileName As String, Key As RSA)
' Create a SignedXml object.
Dim signedXml As New SignedXml()
' Assign the key to the SignedXml object.
signedXml.SigningKey = Key
' Create a reference to be signed.
Dim reference As New Reference()
' Add the passed URI to the reference object.
reference.Uri = URIString
' Add a transformation if the URI is an XML file.
If URIString.EndsWith("xml") Then
reference.AddTransform(New XmlDsigC14NTransform())
End If
' Add the reference to the SignedXml object.
signedXml.AddReference(reference)
' 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()
' Save the signed XML document to a file specified
' using the passed string.
Dim xmltw As New XmlTextWriter(XmlSigFileName, New UTF8Encoding(False))
xmlDigitalSignature.WriteTo(xmltw)
xmltw.Close()
End Sub
' Verify the signature of an XML file and return the result.
Public Shared Function VerifyDetachedSignature(XmlSigFileName As String) As [Boolean]
' Create a new XML document.
Dim xmlDocument As New XmlDocument()
' Load the passed XML file into the document.
xmlDocument.Load(XmlSigFileName)
' Create a new SignedXMl object.
Dim signedXml As New SignedXml()
' 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 Class
[C#]
//
// This example signs a file specified by a URI
// using a detached signature. It then verifies
// the signed XML.
//
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Xml;
class XMLDSIGDetached
{
[STAThread]
static void Main(string[] args)
{
// The URI to sign.
string resourceToSign = "https://www.microsoft.com";
// The name of the file to which to save the XML signature.
string XmlFileName = "xmldsig.xml";
try
{
// Generate a signing key.
RSACryptoServiceProvider Key = new RSACryptoServiceProvider();
Console.WriteLine("Signing: {0}", resourceToSign);
// Sign the detached resourceand save the signature in an XML file.
SignDetachedResource(resourceToSign, XmlFileName, Key);
Console.WriteLine("XML signature was succesfully computed and saved to {0}.", XmlFileName);
// Verify the signature of the signed XML.
Console.WriteLine("Verifying signature...");
//Verify the XML signature in the XML file.
bool result = VerifyDetachedSignature(XmlFileName);
// 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.
public static void SignDetachedResource(string URIString, string XmlSigFileName, RSA Key)
{
// Create a SignedXml object.
SignedXml signedXml = new SignedXml();
// Assign the key to the SignedXml object.
signedXml.SigningKey = Key;
// Create a reference to be signed.
Reference reference = new Reference();
// Add the passed URI to the reference object.
reference.Uri = URIString;
// Add a transformation if the URI is an XML file.
if (URIString.EndsWith("xml"))
{
reference.AddTransform(new XmlDsigC14NTransform());
}
// 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();
// Save the signed XML document to a file specified
// using the passed string.
XmlTextWriter xmltw = new XmlTextWriter(XmlSigFileName, new UTF8Encoding(false));
xmlDigitalSignature.WriteTo(xmltw);
xmltw.Close();
}
// Verify the signature of an XML file and return the result.
public static Boolean VerifyDetachedSignature(string XmlSigFileName)
{
// Create a new XML document.
XmlDocument xmlDocument = new XmlDocument();
// Load the passed XML file into the document.
xmlDocument.Load(XmlSigFileName);
// Create a new SignedXMl object.
SignedXml signedXml = new SignedXml();
// 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();
}
}
[C++]
//
// This example signs a file specified by a URI
// using a detached signature. It then verifies
// the signed XML.
//
#using <mscorlib.dll>
#using <System.Security.dll>
#using <System.Xml.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.
void SignDetachedResource(String* URIString, String* XmlSigFileName, RSA* Key) {
// Create a SignedXml object.
SignedXml* signedXml = new SignedXml();
// Assign the key to the SignedXml object.
signedXml->SigningKey = Key;
// Create a reference to be signed.
Reference* reference = new Reference();
// Add the passed URI to the reference object.
reference->Uri = URIString;
// Add a transformation if the URI is an XML file.
if (URIString->EndsWith(S"xml")) {
reference->AddTransform(new XmlDsigC14NTransform());
}
// 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(__try_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();
// Save the signed XML document to a file specified
// using the passed string.
XmlTextWriter* xmltw = new XmlTextWriter(XmlSigFileName, new UTF8Encoding(false));
xmlDigitalSignature->WriteTo(xmltw);
xmltw->Close();
}
// Verify the signature of an XML file and return the result.
Boolean VerifyDetachedSignature(String* XmlSigFileName) {
// Create a new XML document.
XmlDocument* xmlDocument = new XmlDocument();
// Load the passed XML file into the document.
xmlDocument->Load(XmlSigFileName);
// Create a new SignedXMl object.
SignedXml* signedXml = new SignedXml();
// Find the "Signature" node and create a new
// XmlNodeList object.
XmlNodeList* nodeList = xmlDocument->GetElementsByTagName(S"Signature");
// Load the signature node.
signedXml->LoadXml(__try_cast<XmlElement*>( nodeList->Item(0) ));
// Check the signature and return the result.
return signedXml->CheckSignature();
}
[STAThread]
int main() {
String* args[] = Environment::GetCommandLineArgs();
// The URI to sign.
String* resourceToSign = S"https://www.microsoft.com";
// The name of the file to which to save the XML signature.
String* XmlFileName = S"xmldsig.xml";
try {
// Generate a signing key.
RSACryptoServiceProvider* Key = new RSACryptoServiceProvider();
Console::WriteLine(S"Signing: {0}", resourceToSign);
// Sign the detached resourceand save the signature in an XML file.
SignDetachedResource(resourceToSign, XmlFileName, Key);
Console::WriteLine(S"XML signature was succesfully computed and saved to {0}.", XmlFileName);
// Verify the signature of the signed XML.
Console::WriteLine(S"Verifying signature...");
//Verify the XML signature in the XML file.
bool result = VerifyDetachedSignature(XmlFileName);
// Display the results of the signature verification to
// the console.
if (result) {
Console::WriteLine(S"The XML signature is valid.");
} else {
Console::WriteLine(S"The XML signature is not valid.");
}
} catch (CryptographicException* e) {
Console::WriteLine(e->Message);
}
}
[Visual Basic]
'
' This example signs an XML file using an
' envelope signature. It then verifies the
' signed XML.
'
Imports System
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")
' 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.
Public Shared Sub SignXmlFile(FileName As String, SignedFileName As String, Key As RSA)
' 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
' Create a reference to be signed.
Dim reference As New Reference()
reference.Uri = ""
' Add a transformation to the reference.
Dim trns = New XmlDsigC14NTransform()
reference.AddTransform(trns)
' 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)
' 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.
Public Shared Function VerifyXmlFile(Name As [String]) As [Boolean]
' 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
' 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
[C#]
//
// 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");
// 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.
public static void SignXmlFile(string FileName, string SignedFileName, RSA Key)
{
// 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;
// Create a reference to be signed.
Reference reference = new Reference();
reference.Uri = "";
// Add a transformation to the reference.
Transform trns = new XmlDsigC14NTransform();
reference.AddTransform(trns);
// 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)
{
// 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();
}
// 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();
}
}
[C++]
//
// This example signs an XML file using an
// envelope signature. It then verifies the
// signed XML.
//
#using <mscorlib.dll>
#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.
void SignXmlFile(String* FileName, String* SignedFileName, RSA* Key) {
// 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 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 = S"";
// Add a transformation to the reference.
Transform* trns = new XmlDsigC14NTransform();
reference->AddTransform(trns);
// 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(__try_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 ((doc->FirstChild)->GetType() == __typeof(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.
Boolean VerifyXmlFile(String* 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(S"Signature");
// Load the signature node.
signedXml->LoadXml(__try_cast<XmlElement*>( nodeList->Item(0) ));
// Check the signature and return the result.
return signedXml->CheckSignature();
}
// Create example data to sign.
void CreateSomeXml(String* FileName) {
// Create a new XmlDocument object.
XmlDocument* document = new XmlDocument();
// Create a new XmlNode object.
XmlNode* node = document->CreateNode(XmlNodeType::Element, S"", S"MyElement", S"samples");
// Add some text to the node.
node->InnerText = S"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();
}
int main() {
try {
// Generate a signing key.
RSACryptoServiceProvider* Key = new RSACryptoServiceProvider();
// Create an XML file to sign.
CreateSomeXml(S"Example.xml");
Console::WriteLine(S"New XML file created.");
// Sign the XML that was just created and save it in a
// new file.
SignXmlFile(S"Example.xml", S"SignedExample.xml", Key);
Console::WriteLine(S"XML file signed.");
// Verify the signature of the signed XML.
Console::WriteLine(S"Verifying signature...");
bool result = VerifyXmlFile(S"SignedExample.xml");
// Display the results of the signature verification to
// the console.
if (result) {
Console::WriteLine(S"The XML signature is valid.");
} else {
Console::WriteLine(S"The XML signature is not valid.");
}
} catch (CryptographicException* e) {
Console::WriteLine(e->Message);
}
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Security.Cryptography.Xml
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
アセンブリ: System.Security (System.Security.dll 内)