如何使用客户端的私钥在服务器上对 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 发送给客户端。
事件顺序将如下所示:
- 服务器生成XML的摘要并将摘要发送给客户端
- 客户端用客户端的私钥签署 digest/hash 并将其发送到服务器
- 服务器将签名的散列与 XML 文件合并以获得签名的 XML.
以前,我使用客户端私钥对服务器上的 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 接口的服务器
我需要在服务器上生成 XML 但在客户端使用客户端私钥对其进行签名。 但是,出于带宽消耗和一些安全问题,我们不想将整个 xml 从服务器发送到客户端进行签名。我们只想将 XML 的 hash/digest 发送给客户端。 事件顺序将如下所示:
- 服务器生成XML的摘要并将摘要发送给客户端
- 客户端用客户端的私钥签署 digest/hash 并将其发送到服务器
- 服务器将签名的散列与 XML 文件合并以获得签名的 XML.
以前,我使用客户端私钥对服务器上的 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 接口的服务器