2

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

  • 服务器生成 XML 的摘要并将摘要发送给客户端
  • 客户端使用客户端的私钥对摘要/哈希进行签名并将其发送到服务器
  • 服务器将签名的哈希与 XML 文件合并以获取签名的 XML。

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

4

1 回答 1

0

您可以自己构建它,但我建议您像为 PDF 所做的那样使用库(XML 签名非常复杂)

检查esig-dss和这个示例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 接口的服务器

于 2019-10-30T10:19:10.853 回答