二、XML安全组件签名法
IBM 的 X ML 安全组件,也可以对XML文件进行数字签名,方法如下:
1 、准备工作
下载安装 Java 2 Development Kit ,下载地址 http://192.18.97.149/ECom/EComTicketServlet/BEGIN7266332AC4DA34792F559F9D93294C03/-2147483648/719182887/1/430034/429902/719182887/2ts+/westCoastFSEND/j2sdk-1.4.1_07-oth-JPR/j2sdk-1.4.1_07-oth-JPR:1/j2sdk-1_4_1_07-windows-i586.exe ,文件大小 37MB ;然后 下载安装之XMLSecurity Suite ( http://www.alphaworks.ibm.com/tech/xmlsecuritysuite ) ,将 /xss4j/samples和xss4j.jar ( http://pws.prserv.net/Hiroshi.Maruyama/xmlbook/samples4v2/chap3/xss4j.jar )添加至你的 classpath 中。
2、创建自己的数字证书
在对 XML文件数字签名之前,首先应该有一个X.509数字证书,你可以用 Java 2 的 keytool 命令创建这个数字证书,方法如下:进入命令提示符下,CD命令进入X:\Program Files\j2sdk1.4.1_07\bin目录,输入以下命令
keytool -genkey -dname "CN=lh1, OU=cwk, O=zlsgs,L=liuan, S=anhui, C=china" -keypass 123456 -storepass security -alias xss4j
在以上命令中, dname称为特异名,特异名在整个因特网上都是唯一的,dname由普通名(CN)、组织单元(OU)、组织(O)、区域 (L)、州(S)和国家(C)组成;密匙库 (-storepass) 的密码为 security,此证书的私钥密码 (-keypass)为123456,而 xss4j 则是认证 (-alias) 的别名。
3、如何对内部XML资源数字签名
下面我们要用刚才生成的数字证书,对 d:/xss4j/samples/sonnet.xml文件进行数字签名,首先我们看看如何对内部XML资源数字签名?如果你要以这种方式对sonnet.xml签名,签名过后,将会产生一个新文件lh.XML,该文件内容如下图1所示,包含了签名信息、密钥和原来sonnet.xml文件的内容(如下图1)。

图1
要创建这样的数字签名,你可以使用 SampleSign 应用程序,这个程序是XML安全组件附带的,你可以在 xss4j/samples 目录中找到之。以下是对 sonnet.XML进行数字签名的方法:
进入命令提示符下, CD命令进入X:\Program Files\j2sdk1.4.1_07\bin目录,输入以下命令(注意以下命令是单行的)
java SampleSign xss4j security 123456 –embXMLfile:///d:/xss4j/samples/sonnet.XML> lh.XML
请注意:上面命令中的别名( xss4j)、密匙库密码(security)、私钥密码(123456)、与以上keytool 命令中的相同,这里用 file: URL 代替了简单的文件名,而输出内容则送至(用 >操作符)文件 lh.xml中。执行过该命令之后,利用证书对内部XML资源数字签名就大功告成,结果会产生一个签名过的XML文件lh.XML。
4、如何对外部XML资源数字签名
对外部XML资源签名,表明文件中的<Signature>下包含XML资源的 URL,而不是资源本身,即分离的数字签名。要创建这样的数字签名,应使用 -extXML选项,方法如下:进入命令提示符下,CD命令进入X:\Program Files\j2sdk1.4.1_07\bin目录,输入以下命令
java SampleSign xss4j security 123456 –extXMLfile:///d:/xss4j/samples/sonnet.XML> external-lh.XML
于是将产生一个签名过的 XML文件external-lh.XML,它与以上的lh.XML相似,不过sonnet.xml文件的内容,并没有被复制到external-lh.xml中的<Signature>下。
5、验证数字签名
XML安全组件还提供了一个实用程序 SampleVerify,用来验证数字签名。使用它,你可以检查某个签名过的XML文件,以便确认被签名的资源没有被篡改,此外还能检查该签名与发送者的证书信息是否相符。
例如要验证 external-lh.xml中的数字签名,你可以这样操作:进入命令提示符下,输入以下命令
java SampleVerify -dom < external-lh.XML
显示结果如下:
Signer: CN=lh1, OU=cwk, O=zlsgs,L=liuan, S=anhui, C=china
SignedInfo Bytes: 1069
----------------------------------------
--> Location: file:///d:/xss4j/samples/sonnet.XML
Validity: Ok
--> SignedInfo: Ok
--> All: Ok?
从以上命令的显示结果可知,该数字 签名有效, 签名过的文件没有被改动。假如签名过的文件被改动了,以上命令执行后,将会显示不同的结果,表示该签名不再有效,于是改动过的XML文件同数字签名就不符,我们即可知道不能信任该文件。 (完)
点这里回到文章导读>>>