XML签名
用户可以对XML文件进行数字签名,然后可以验证签名。如果文件在签名后有被更改,则验证将失败。XMLSpy同时支持XML签名的创建和验证。
XMLSpy视图中的XML签名
可以为所有类型的XML文件创建XML签名,包括XML Schema、WSDL和XBRL文件。因此,XML | 创建XML签名和XML | 验证XML签名 命令在所有XMLSpy视图中都可用:文本视图、网格视图、Schema视图、WSDL视图以及XBRL视图。
XML签名的工作原理
从创建签名到验证签名,整个过程如下:
1.XML文件是用证书的私钥或密码进行签名的。在XMLSpy中,您可以使用XML | 创建XML签名命令来创建签名。获取签名是通过处理:(i) XML文档,以及(ii) 证书的私钥或密码。
2.签名可以包括在XML文件中,也可以存储在单独的文件中。
3.XML文件的签名可以通过使用证书的公钥或密码来验证。验证过程如下,首先处理:(i) XML文档,以及(ii) 用于签名的证书的公钥或密码,其次,将此结果与签名进行对比。如果XML文件在签名后被更改,则验证将失败。在XMLSpy中,您可以使用XML | 验证XML签名命令来验证签名。
本部分的小节中详细描述了如何在XMLSpy中创建和验证签名。
如何在XML签名中使用证书
为了与XML签名一起使用,证书必须有一个私钥和公钥。私钥是用于创建XML签名的,而公钥是用于验证XML签名的。
在常见的情况下,XML文档的发送者有权限访问证书的私钥并使用它创建XML签名。文档的接收者将有权限访问证书的公钥。这种访问可以有两种类型:(i) 发送者发送带有签名的公钥信息;(ii) 接收者有权限访问发送者使用的公钥版本的证书。
有关证书的更多详细信息,请参见小节使用证书。
注意: | XMLSpy的XML签名功能支持RSA-SHA1、DSA-SHA1和SHA-256类型的证书。基于密码的签名使用HMAC-SHA256算法(XMLSpy2018及更高版本;参见创建XML签名)。 |
XML文档有效性
如果将XML签名嵌入到XML文档中,则命名空间http://www.w3.org/2000/09/xmldsig#中的Signature元素将被添加到XML文档中。为了使文档根据Schema保持有效,该Schema必须包含适当的元素声明。XMLSpy以两种方式嵌入签名:
•封内签名:Signature元素被创建为根(或文档)元素的最后一个子元素。
•封外签名:Signature元素被创建为根(或文档)元素,而原始XML文档元素被放在名为Object的签名元素的子元素中。
如果您不希望修改XML文档的Schema,则可以在外部文件中创建XML签名。有关更多详细信息,请参见创建XML签名部分中有关放置选项的描述。
下方给出的是XML Schema的片段,显示了如何允许封内签名的Signature元素。您可以使用这些示例作为指导,来修改您的Schema。
在第一个片段中,XML Signature Schema被导入到用户的Schema中。XML Signature Schema的网址是:http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsig="http://www.w3.org/2000/09/xmldsig#"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd"/>
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element ref="FirstChildOfRoot"/>
<xs:element ref="SecondChildOfRoot" minOccurs="0"/>
<xs:element ref="ThirdChildOfRoot" minOccurs="0"/>
<xs:element ref="xsig:Signature" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
...
</xs:schema>
第二个选项(参见下方片段)是添加一个通用通配符元素,它匹配来自其他命名空间的任何元素。将processContents特性设置为lax会导致验证器跳过此元素—因为找不到匹配的元素声明。因此,用户不需要引用XML Signatures Schema。但是,此选项的缺点是,任何元素(不只是Signature元素)都可以被添加到XML文档中的指定位置,而不会使XML文档无效。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="Root">
<xs:complexType>
<xs:sequence>
<xs:element ref="selection"/>
<xs:element ref="newsitems" minOccurs="0"/>
<xs:element ref="team" minOccurs="0"/>
<xs:any namespace="##other" minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
...
</xs:schema>
W3C规范
有关XML签名的更多详细信息,请参见位于https://www.w3.org/TR/xmldsig-core1/的XML签名的W3C规范。