您正在将消息级安全性与传输级安全性进行比较。尽管它们有相似之处,但它们有不同的目的。
使用 TLS 可以保护通信不被中间方看到和更改。服务器端的 X.509 证书保证发送给它的消息只能由具有此私钥的服务器读取,并且它发送的内容来自具有此私钥的服务器。这可以松散地被认为是由服务器签名并使用 X.509 证书为服务器加密,尽管它实际上仅适用于 TLS 握手消息,而不适用于之后交换的应用程序数据。(我忽略了这样一个事实,即无论是否有任何一方提供了证书,您都会获得通道的对称加密;重要的是至少让服务器使用证书,以便客户端知道它正在与什么通信,而不是与潜在的中间人沟通)。当您向其中添加客户端证书时,客户端还会对它在握手期间交换的 TLS 消息进行签名。
当您同时使用客户端和服务器证书时,您可以(小心地)与消息级安全性进行类比,因为签名和加密的消息是用于建立 TLS 通道的 TLS 握手消息。
但是,消息级安全性(例如 XML-DSig 和 XML-Enc)存在很大差异。
首先,消息签名 (XML-DSig) 的功能之一是审计,因此您可以记录所说的内容。它没有特别的时间限制。即使您记录了 TLS 数据包,这也很难做到。使用使用 DHE(Diffie-Hellman 临时模式)的 SSL/TLS 中的现代密码套件,即使您拥有服务器的私钥,如果您已经记录了所有数据包,您也不一定能破译通道(无需进一步了解 DHE机制)。
其次,在实现方面,XML-DSig 倾向于在应用程序级别完成,而 TLS 倾向于由服务器连接器完成。根据部署条件,差异可能会变得模糊,但 TLS 是关于与机器/容器而不是它们背后的应用程序进行通信。通常,TLS 证书将设置在 Java 容器或 WCF 级别,而用于 XML-DSig 的证书将由后面运行的 webapp/应用程序使用。那里可能有不同的人或程序负责。
(你说得对,如果你使用没有 XML-Enc 的 XML-DSig,你就没有加密数据。)