我们在Websphere Message Broker v.7(在Java 6上运行)中有一个消息流,它使用带有证书和私钥的给定密钥库来签署XML消息。
但是,在迁移到IIB v.9(在Java 7上运行)之后,它开始为同一XML消息创建不同的结果。唯一的区别是签名值字段。
结果,接收方说消息是以错误的方式签名的。
为什么会这样? 密钥库在两种环境中都是相同的。
以下是执行签名的代码片段:
XMLSignatureFactory sigFactory = XMLSignatureFactory.getInstance();
SignedInfo signedInfo = createSignedInfo(sigFactory, timestamp, timestampId, body, getBodyId(body));
.........
XMLSignature sig = sigFactory.newXMLSignature(signedInfo, keyInfo);
DOMSignContext sigContext = new DOMSignContext(privateKey, security);
.........
sig.sign(sigContext);
我们尝试在两种环境中比较java.security,但似乎是相同的。
我们使用RSA-SHA1:
private SignedInfo createSignedInfo(XMLSignatureFactory sigFactory, Element timestamp, String timesetampId, Element body, String bodyId) throws Exception {
ExcC14NParameterSpec spec = new ExcC14NParameterSpec(Arrays.asList(SOAP_SCHEMA.getPrefix()));
CanonicalizationMethod canonicalizationMethod = sigFactory.newCanonicalizationMethod(CanonicalizationMethod.EXCLUSIVE, spec);
List<Reference> references = createSignatureReferences(sigFactory, timestamp, timesetampId, body, bodyId);
return sigFactory.newSignedInfo(canonicalizationMethod, sigFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null), references);
}