xml - 使用 dsig :Signature and TLS Client Certificate 签署 XML 消息的区别

标签 xml security ssl digital-signature xml-signature

我意识到这个问题可能有点含糊,或者我可能使用了不正确的术语,那是因为我正试图掌握这些东西:)。

我需要使用 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/

相关文章:

元素之间的Android布局间距

c - 为什么我的 mprotect 函数使用 5 个参数调用?

PHP:允许为用户上传 .php 文件,如何阻止它们运行?

php - IE6、SSL 和 Zend 框架的问题

java - 获取一个dom节点的属性

python - 在Python的另一个类ElementTree中继续解析

python - 属性错误 : object has no attribute

security - 使用真正的随机盐或用户名盐加胡椒进行密码哈希?

c#-4.0 - 客户端和服务器之间不支持 TLS 1.0

ssl - 服务器如何在 HTTPS 通信中验证客户端(没有客户端证书)的身份?