1.XML文書に電子証明書で署名する
1.5 電子証明書を準備する
// 証明書 X509Certificate2 cert = GetCertificate();
電子証明書は、関数GetCertificate()で選択されるものとします。
この関数では証明書の有効性、利用目的や秘密鍵の有無などを調査する必要があります。この証明書は、電子署名に利用できるすべての条件を満たしているものとします。
この関数では証明書の有効性、利用目的や秘密鍵の有無などを調査する必要があります。この証明書は、電子署名に利用できるすべての条件を満たしているものとします。
1.6 署名用の鍵を指定
指定の電子証明書に対応する秘密鍵を署名用の鍵として指定します。
// 証明書に対応する秘密鍵を指定する signedXml.SigningKey = cert.PrivateKey;
1.7 証明書情報<X509Data>を準備
他には、
// <KeyValue>を生成 KeyInfo keyInfo = new KeyInfo(); // <X509Data>オブジェクトを生成して<KeyInfo>に加える keyInfo.AddClause(new KeyInfoX509Data(cert)); // <KeyInfo>オブジェクトを SignedXmlオブジェクトに追加する signedXml.KeyInfo = keyInfo;
1.8 電子署名を実施
署名を実施し、指定したXML文書を作成します。
// Compute the signature. signedXml.ComputeSignature();
1.9 署名したXML文書を取得
署名されたXML文書を取得します。
結果は、ファイルsigned.xmlに格納されます。
結果は、ファイルsigned.xmlに格納されます。
// XML署名データをXmlElementオブジェクトで取り出す XmlElement xmlDigitalSignature = signedXml.GetXml(); // 署名される文書(original.xml)に署名を追加する doc.DocumentElement.AppendChild( doc.ImportNode(xmlDigitalSignature, true)); // ファイルに格納する doc.Save("signed.xml"); } } }
XML文書全体への署名なので、署名データ(<Signature>)は、署名されるXML文書の子エレメントになります。部分署名の場合は、署名データは親エレメントになります。
1.10 署名結果およびサンプル
電子署名されたXML文書の例です。(見やすくするためインデントや改行しています。)
<root> <creditcard> <number>19834209</number> <expiry>02/02/2002</expiry> </creditcard>> <Signature xmlns="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>qf9G+NGDr9YbsV4Tu1a8je/DCLE=</DigestValue> </Reference> </SignedInfo> <SignatureValue>Qysxl+4tHKgczZKEJash5TtlHAJjuZ+DScSDz6wCf2KtR3v QELKhlMa22YXh0HOi6q3/5HJi5WpKAif3rPZXMTet/3ESMJn/8xL0LG zEod2kL0XRw2ubT9uoqVqeUcxJ4WBNQNg0+9z8zYno3Jks2QvimGZav E7UHgLrL9Q47vI=</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIEvjCCA6agAwIBAgIQKjHnW8ti/1AlJgCYYX YRBTANBgkqhkiG9w0BAQUFADCB3TELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduL CBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJt cyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNTEeMBwGA1U ECxMVUGVyc29uYSBOb3QgVmFsaWRhdGVkMTcwNQYDVQQDEy5WZXJpU2lnbiBDbGFzcyAxIE luZGl2aWR1YWwgU3Vic2NyaWJlciBDQSAtIEcyMB4XDTEwMDgwOTAwMDAwMFoXDTEwMTAwO DIzNTk1OVowggELMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp Z24gVHJ1c3QgTmV0d29yazFGMEQGA1UECxM9d3d3LnZlcmlzaWduLmNvbS9yZXBvc2l0b3J 5L1JQQSBJbmNvcnAuIGJ5IFJlZi4sTElBQi5MVEQoYyk5ODEeMBwGA1UECxMVUGVyc29uYS BOb3QgVmFsaWRhdGVkMScwJQYDVQQLEx5EaWdpdGFsIElEIENsYXNzIDEgLSBNaWNyb3NvZ nQxFzAVBgNVBAMUDkhpcm9zaGkgVGFrYWt1MSUwIwYJKoZIhvcNAQkBFhZ0YWtha3UyMDEx QHlhaG9vLmNvLmpwMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2X3fYZmb+CTNP7CC n81cTHtD6fd5VECsDJH3OOdXmnoEzXsocxfoPeEG30gbjnPPul8ruypAd19dEIfbFhpoCDr kmGEn3p4Mz9BCqmLzMSUn6FikyclBk4byrQ3wwfOY2VDGkvjXQnQtwHPKn5laUqHKyTBfqT iRuUbgsJpuPNQIDAQABo4HMMIHJMAkGA1UdEwQCMAAwRAYDVR0gBD0wOzA5BgtghkgBhvhF AQcXATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhMAsGA1U dDwQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDBAYIKwYBBQUHAwIwSgYDVR0fBEMwQTA/oD 2gO4Y5aHR0cDovL0luZEMxRGlnaXRhbElELWNybC52ZXJpc2lnbi5jb20vSW5kQzFEaWdpd GFsSUQuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQBhaHBfyQWHuR4gH4lyRTsNbyj1CKPvrQwM vPo0IinZiwPy5WMqHp7/mzVfopS/FnPVllWTPuuS5BgZwFw11O3BbKRZEzYGGfCq94WLkTl NgpeO7ngUuq+DWFcHDkezGvTLtNhTrzoCQZz53DpMjvVoFWYGdNHD0fc/W0/ez9C8k3vQ19 p9x9zEmhm29vzxKBoMXnZAauD42/BXjsxCvIzMmeJJjiMZRN3sUkI1oR8L41jfCINvrTgEJ bz79hX69oxw2Xv1Pt5O4/5mY7NIZ0DH3V39RL9R4/yAQAv527dZ5z8Wc6X7GRSkbXME+c+T Hav353zQ8tg/cJyA+YuKtkbm</X509Certificate> </X509Data> </KeyInfo> </Signature> </root>
サンプルコードはお問い合わせください。
(記載の会社名および製品名は、各社の登録商標および商標です。)