我意识到这个问题可能有点含糊,或者我可能使用了不正确的术语,那是因为我正试图掌握这些东西:)。
我需要使用 dsig:Signature 部分实现 XML 消息的数字签名。我想我理解这个过程;我将使用私钥对其进行签名,这将向收件人保证是我发送了消息并且没有人篡改过它。
这与实现 TLS 客户端证书不同但目标相同,我说得对吗? (因为 TLS 是传输级别的,对吗?)实现客户端证书会更容易吗?一个比另一个好吗?
非常感谢您的回复,
马丁
更新 1:
我认为另一个区别是,使用 TLS 客户端证书,整个消息将被加密,而使用数字签名,消息本身将是纯文本,包含签名部分。
最佳答案
您正在比较消息级安全性和传输级安全性。尽管它们有相似之处,但它们的目的不同。
使用 TLS 可以保护通信不被中间方看到和更改。服务器端的 X.509 证书保证发送给它的消息只能由具有该私钥的服务器读取,并且它发送的内容来自具有该私钥的服务器。这可以松散地被视为由服务器签名并使用 X.509 证书为服务器加密,尽管它实际上仅适用于 TLS 握手消息,而不适用于之后交换的应用程序数据。 (我忽略了这样一个事实,即无论任何一方是否提供了证书,您都会对 channel 进行对称加密;重要的是至少让服务器使用证书,以便客户端知道它正在与什么通信,而不是与潜在的中间人沟通)。 当您向其中添加客户端证书时,客户端还会对它在握手期间交换的 TLS 消息进行签名。
当您同时使用客户端和服务器证书时,您可以(小心地)用消息级安全进行类比,因为经过签名和加密的消息是用于建立 TLS channel 的 TLS 握手消息。
但是,消息级安全性(例如 XML-DSig 和 XML-Enc)存在很大差异。
首先,消息签名 (XML-DSig) 的功能之一是审计,这样您就可以记录所说过的内容。没有具体的时间限制。即使您已经记录了 TLS 数据包,这也很难做到。使用 SSL/TLS 中使用 DHE(Diffie-Hellman 短暂模式)的现代密码套件,即使您拥有服务器的私钥,如果您已经记录了所有数据包(没有进一步了解 DHE机制)。
其次,在实现方面,XML-DSig倾向于在应用程序层面完成,而TLS则倾向于由服务器连接器完成。根据部署条件的不同,差异可能会变得模糊,但 TLS 是关于与机器/容器而不是它们背后的应用程序进行通信。通常,TLS 证书将在 Java 容器或 WCF 级别设置,而用于 XML-DSig 的证书将由后面运行的 Web 应用程序/应用程序使用。那里可能有不同的人或程序负责。
(您也说对了,如果您使用的是不带 XML-Enc 的 XML-DSig,则不会加密数据。)
关于xml - 使用 dsig :Signature and TLS Client Certificate 签署 XML 消息的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4153568/