ationMethod.INCLUSIVE_WITH_COMMENTS,
(C14NMethodParameterSpec) null);
2. SignatureMethod dsa_sha1SigMethod =
fac.newSignatureMethod(SignatureMethod.DSA_SHA1, null);
3. SignedInfo signedInfo =
fac.newSignedInfo(c14nWithCommentMethod,
dsa_sha1SigMethod,
Collections.singletonList(refToRootDoc));
因为最终的数字签名是针对 <SignedInfo> 元素而生成的,所以需要指定该 XML 元素的规范化方法,以确定最终被处理的数据。这里指定为 INCLUSIVE_WITH_COMMENTS , 表示在规范化 XML 内容的时候会将 XML 注释也包含在内。
至此,待签名的内容(<SignedInfo> 元素)已指定好,再只需要签名所使用的密钥就可以创建数字签名了。
4. 创建密钥对
XML 数字签名规范规定了多种在 <KeyInfo> 中指定验证密钥的方式,比如 <KeyName>,<KeyValue>,<X509Data>,<PGPData> 等等。这里使用 XML 数字签名规范规定必须实现的 <DSAKeyValue> 来指定验证签名所需的公共密钥。在程序中使用 java.security 包生成 DSA 密钥对。
首先创建密钥对:
1. KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DSA");
2. kpGen.initialize(512);
3. KeyPair keyPair = kpGen.generateKeyPair();
然后以公钥为参数创建 <KeyValue> 元素:
1. KeyInfoFactory keyInfoFac = fac.getKeyInfoFactory();
2. KeyValue keyValue = keyInfoFac.newKeyValue(keyPair.getPublic());
根据创建好的 <KeyValue> 元素创建 <KeyInfo> 元素:
1. KeyInfo keyInfo =
keyInfoFac.newKeyInfo(Collections.singletonList(keyValue));
这里创建的密钥对,其中的公钥已经用于创建 <KeyInfo> 元素并存放在其中,供签名验证使用,而其中的私钥则会在下一步被用于生成签名。
5. 创建 <Signature> 元素
前面已经创建好 <SignedInfo> 和 <KeyInfo> 元素,为了生成最终的数字签名,需要根据这两个元素先创建 <Signature> 元素,然后进行签名,创建出 <SignatureValue> 元素。
1. XMLSignature signature = fac.newXMLSignature(signedInfo, keyInfo);
XMLSignature 类中的 sign 方法用于对文档进行签名,在调用 sign 方法之前,还需要创建 DOMSignContext 对象,为方法调用提供上下文信息,包括签名所使用的私钥和最后生成的 <Signature> 元素所在的目标父元素:
1. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
2. dbf.setNamespaceAware(true);
3. Document doc =
dbf.newDocumentBuilder().parse(new FileInputStream(args[0]));
4. DOMSignContext dsc =
new DOMSignContext(keyPair.getPrivate(), doc.getDocumentElement());
这里首先使用 JAXP 的 DOM 接口将待签名文档解析,然后根据前面创建的私钥和待签名文档的根元素创建 DOMSignContext 对象。
请注意,到这里为止都只是创建各种生成签名所需数据的 XML 元素表示,并没有开始真正地生成数字签名。
6. 最后一步,生成签名
1. signature.sign(domSignCtx);
sign 方法会生成签名值,并作为元素值创建 <SignatureValue> 元素,然后将整个 <Signature> 元素加入为待签名文档根元素的直接子元素。
7. 输出签名后的文档
数字签名生成之后,使用 JAX P的 XML 转换接口将签名后的 XML 文档输出,查看签名结果:
1. Tr上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页
|