如何使用客户端的私钥在服务器上对 XML 进行外部签名(仅发送散列,而不是完整的 xml)

How to externally sign a XML on server, using client`s privatekey ( sending only hash, instead of the full xml)

我需要在服务器上生成 XML 但在客户端使用客户端私钥对其进行签名。 但是,出于带宽消耗和一些安全问题,我们不想将整个 xml 从服务器发送到客户端进行签名。我们只想将 XML 的 hash/digest 发送给客户端。 事件顺序将如下所示:

以前,我使用客户端私钥对服务器上的 pdf 签名进行了类似的分离 - 我为此使用了 itext 库。但是,发现很难使用 Oracles XML 签名库为 XML 签名做类似的事情。 可用于签名 xml 的众所周知的 API 似乎不提供这种在外部签名 xml 的功能(将散列和签名部分解耦)。 所以我的问题是,如何使用客户端的私钥(仅发送哈希,而不是完整的 xml)在服务器上对 XML 进行外部签名?

您可以自己构建它,但我建议您像处理 PDF 一样使用库(XML 签名非常复杂)

勾选esig-dss and this sample SignXmlXadesBTest.java

 //SERVER SIDE.
 // Get the SignedInfo XML segment that need to be signed.
 ToBeSigned dataToSign = service.getDataToSign(toSignDocument, parameters);

//CLIENT SIDE
// This function obtains the signature value for signed information using the
// private key and specified algorithm
SignatureValue signatureValue = signingToken.sign(dataToSign, parameters.getDigestAlgorithm(), privateKey);

// SERVER SIDE
// We invoke the service to sign the document with the signature value obtained in
// the previous step.
DSSDocument signedDocument = service.signDocument(toSignDocument, parameters, signatureValue);

在客户端,signingToken.sign()只是用私钥对服务器准备的摘要(字节数组)进行签名。如果您不使用 java,则不必使用 DSS,因为它是一种在大多数编程语言中都可用的简单加密操作

另请注意,DSS 可用作库或具有 REST 或 SOAP 接口的服务器