安全的Web服务:REST over HTTPS与SOAP + WS-Security相比,哪个更好?

183

虽然我不是安全专家,但我更喜欢创建REST风格的 Web 服务。

我们正在创建一个需要保护传输数据安全的新服务,并且就哪种方法更安全进行了辩论 - 是使用带有HTTPS的REST还是使用带有WS-Security的SOAP WS。

我认为我们可以在所有Web服务调用中使用HTTPS,这种方法是安全的。 我的看法是:“如果HTTPS足以让银行和金融网站放心使用,那么对于我而言也足够好。” 再次强调,我不是这个领域的专家,但我认为这些人已经非常深入地思考了这个问题,并且对于HTTPS感到满意。

但我的一位同事持不同意见,认为只能使用 SOAP 和 WS-Security。

网络上似乎对此存在各种不同的观点。

也许社区里的人可以权衡一下每种方法的优缺点?谢谢!


9
基本上是在传输层安全和消息层安全之间做出选择。 - flash
只是补充一下.. http://www.iseebug.com/category/web-service/ - Vaibs
11个回答

137

HTTPS保护了信息在网络上传输并为客户提供了有关服务器身份的一些保证。这对于您的银行或在线股票经纪人非常重要。他们对客户的身份验证不在计算机身份上,而在于您的身份。因此,用于验证您的是卡号、用户名、密码等。然后通常采取一些预防措施以确保提交内容没有被篡改,但总体来说,会话中发生的所有事情都被视为由您发起。

WS-Security从消息创建到消费提供机密性和完整性保护。因此,它不仅确保通信内容只能被正确的服务器读取,也确保只能由服务器上的正确进程读取。它不再假定安全启动的会话中的所有通信都来自经过身份验证的用户,而是必须对每个通信进行签名。

这里有一个有趣的关于裸露骑摩托车的解释:

https://learn.microsoft.com/archive/blogs/vbertocci/end-to-end-security-or-why-you-shouldnt-drive-your-motorcycle-naked

因此,WS-Security 提供的保护比 HTTPS 更多,而 SOAP 则比 REST 提供更丰富的 API。我的观点是,除非您真正需要附加功能或保护,否则应跳过 SOAP 和 WS-Security 的开销。我知道这有点回避问题,但实际上应该由那些对问题非常了解的人来决定所需的保护程度(而不仅仅是构建起来很酷的东西)。


一个额外的要点 - 传输安全需要对传输发起者进行身份验证。例如,如果每个人都知道密码,那么使用SSH没有用处。在分布式应用程序中,多层安全性非常重要。考虑身份、完整性和责任。 - Aiden Bell
21
我前几天看到一个有趣的组合。我们的一个大型F500客户正在使用REST和SOAP混合(REST用于只读数据访问,SOAP用于其他功能),并为避免使用不同的安全方案,决定同时使用WS-Sec。他们通过将WS-Sec头信息放入REST调用的HTTP头中来实现这一点。他们的安全中间件知道如何从任何位置提取信息以进行检查。这是我第一次看到这种方法。 - sfitts

69

REST的安全性取决于传输方式,而SOAP的安全性则不取决于传输方式。

REST从基础传输中继承了安全措施,而SOAP通过WS-Security定义了自己的安全措施。

当我们谈论REST时,使用HTTP时所有应用于HTTP的安全措施都是继承的,这被称为传输级别安全性。

传输级别安全性仅在消息在传输过程中进行保护-一旦消息离开传输通道,消息就不再受到保护。

但是,使用WS-Security,它是消息级别安全性——即使消息离开传输通道,它仍将受到保护。此外,使用消息级别安全性,您可以部分加密消息[不是整个消息,只能加密需要的部分]-但是使用传输级别安全性无法实现。

WS-Security具有身份验证、完整性、机密性和不可否认等措施,而SSL不支持不可否认[但在2-legged OAuth中支持]。

就性能而言,SSL比WS-Security快得多。

谢谢...


1
抱歉,但我需要纠正一下。请查看REST的维基百科:REST最初是在HTTP的上下文中描述的,但它不仅限于该协议。SOAP与WS-Security无关,而且REST / SOAP实现在某种程度上都依赖于底层传输。SOAP基于XML,在其中WS-Security被后续作为应用程序数据安全实现进行了分层。除此之外,信息很好。 - Darrell Teague
13
如上所述,REST不依赖于特定的传输方式-尽管大多数情况下都是在HTTP的背景下解释的。但是,REST不涉及任何安全问题。它完全依赖于底层传输的安全性-无论是HTTP还是其他任何传输方式。在SOAP中,它明确定义了一种不依赖于传输方式的安全标准。WS-Security是为SOAP设计的。如果您想在SOAP中使用传输层安全性,则没有问题,您可以使用它。而REST是一种架构模式,它并不涉及安全问题。 - Prabath Siriwardena
超级Prabath!谢谢,这很有用。 - sunleo

22

从技术上讲,按照您的措辞,两者都不正确,因为SOAP方法的通信不安全,而REST方法没有提到验证合法用户的身份。

HTTPS防止攻击者窃听两个系统之间的通信。它还验证主机系统(服务器)是否确实是用户打算访问的主机系统。

WS-Security防止未经授权的应用程序(用户)访问系统。

如果RESTful系统有一种验证用户身份的方式,并且使用WS-Security的SOAP应用程序正在使用HTTPS,则两者都是安全的。这只是一种呈现和访问数据的不同方式。


20

参见维基百科文章:

在点对点的情况下,可以通过使用传输层安全性(TLS)来强制执行Web服务的机密性和数据完整性,例如通过https发送消息。

然而,WS-Security解决了更广泛的问题,即在从起始节点发送消息之后维护消息的完整性和机密性,提供所谓的端到端安全性。

也就是说:

  • HTTPS是一种传输层(点对点)安全机制。
  • WS-Security是一种应用层(端到端)安全机制。

15

就像你所说的,REST对于银行来说已经足够好了,所以对于你来说也应该足够好。

安全性有两个主要方面:1)加密和2)身份认证。

通过SSL / HTTPS传输可以提供数据传输加密。但您还需要确保两个服务器能够确认它们正在交流的对象是谁。这可以通过SSL客户端证书、共享密码等方式实现。

我相信某些人可能会认为SOAP更加“安全”,但可能没有任何显著的方式。裸体赛摩托车手的比喻很可爱,但如果准确的话,那就意味着整个互联网都不安全。


13

我还没有足够的声望来添加评论,不然我就会在Bell的答案中添加这个。我认为Bell很好地总结了两种方法的顶级优缺点。以下是您可能要考虑的其他因素:

1)您的客户端和服务之间的请求是否需要通过需要访问有效载荷的中间件进行处理?如果是,则WS-Security可能更合适。

2)实际上可以使用SSL使用名为互相认证的功能为服务器提供有关客户端身份的保证。但是,由于配置复杂,这在某些非常专业的场景之外并没有得到广泛应用。因此,Bell是正确的,WS-Sec在这里更加合适。

3)总体上,即使在较简单的配置中,设置和维护SSL也可能有些麻烦,这主要归因于证书管理问题。拥有知道如何为您的平台执行此操作的人将是一个巨大的优势。

4)如果您可能需要执行某种形式的凭据映射或身份联合,则使用WS-Sec可能值得额外开销。并不是说您不能使用REST执行此操作,只是您拥有较少的结构可帮助您。

5)将所有WS-Security混乱的内容放入事物的客户端端可能比您想象的更加痛苦。

尽管如此,最终结果确实取决于我们不太可能知道的许多事情。对于大多数情况,我会说这两种方法都足够安全,因此这不应该是主要决定因素。


银行业是那种在“大多数”情况下不属于的行业之一。 - Bryan Bryce

11
Brace yourself, here there's another coming :-)

今天我不得不向我的女朋友解释WS-Security和HTTPS表达能力的区别。她是一名计算机科学家,所以即使她不知道所有的XML术语,她也理解(也许比我更好)加密或签名的含义。然而,我想要一个强有力的形象,可以让她真正理解事物的有用性,而不是它们是如何实现的(稍后再说,她没有逃脱这个问题:-))。
就像这样。假设你赤裸着身体,必须驾驶摩托车前往某个目的地。 在(A)情况下,你通过透明隧道:你唯一的希望是没有人看到你的淫秽行为,这并不是你可以想出的最安全策略...(注意男人额头上的汗珠:-))。这相当于明文POST,当我说“相当”时,我的意思是这样。 在(B)情况下,你的情况会更好一些。隧道是不透明的,因此只要你进入隧道,你的公共记录就是安全的。但是,这仍然不是最好的情况。你仍然需要离开家,并到达隧道入口,一旦离开隧道,你可能还需要步行到某个地方...这也适用于HTTPS。确实,当你跨越最大的鸿沟时,你的消息是安全的:但是一旦你将其传递到另一侧,你并不真正知道它要经过多少阶段才能到达数据将被处理的真正点。当然,所有这些阶段都可能使用与HTTP不同的东西:例如缓冲无法立即提供服务的请求的经典MSMQ。如果有人在预处理的中间状态下窥视您的数据会发生什么?嗯。(将此“嗯”读作Morpheus在句子“你认为你呼吸的是空气吗?”结尾发出的声音)。 这个比喻中的完整解决方案(c)非常琐碎:给自己穿上衣服,特别是在骑摩托车时戴上头盔!这样,你就可以安全地四处走动,而不必依赖于环境的不透明性。这个比喻希望是清楚的:衣服随你身边,不管是什么方式或周围的基础设施,就像消息级安全性一样。此外,你可以决定覆盖一部分但揭示另一部分(你可以根据个人情况做到这一点:机场安全人员可以让你脱下夹克和鞋子,而你的医生可能有更高的访问级别),但请记住,短袖衬衫是不好的做法,即使你为自己的二头肌感到自豪:-)(最好是polo衫或T恤)。
我很高兴说她明白了!我必须说,衣服的比喻非常有力量:我曾经想过用它来介绍政策的概念(迪斯科俱乐部不会让你穿运动鞋进去;你不能在银行裸体取款,而这是在冲浪时平衡自己的完全可以接受的形象;等等),但我想对于一个下午来说

参考来源:http://blogs.msdn.com/b/vbertocci/archive/2005/04/25/end-to-end-security-or-why-you-shouldn-t-drive-your-motorcycle-naked.aspx

在IT技术中,最重要的一点就是保证安全性。就像骑摩托车时需要穿上防护服一样,我们也需要采取措施来保护我们的数据和系统。


1
你提供了一个很好且简单的比喻来区分https和ws-security。但在现实互联网中,我们大部分时间都是裸奔骑摩托车 :D 并且到处应用WS-security会对性能和成本造成过度负担。因此,我们可以通过考虑需要穿衣服和不必要穿衣服的情况来改进这个比喻。 - shashankaholic

9

我每天都在这个领域工作,所以我想总结一下关于此问题的好评论,以期关闭这个话题:

SSL(HTTP/s)只是确保以下一层内容:

  1. 连接的服务器提供证书证明其身份(尽管这可以通过DNS欺骗来欺骗)。
  2. 通信层是加密的(没有窃听)。

WS-Security和相关标准/实现使用PKI来:

  1. 证明客户端的身份。
  2. 证明消息在传输过程中未被修改(MITM)。
  3. 允许服务器对客户端进行身份验证/授权。

最后一点对于服务请求非常重要,因为了解调用方的身份是否应该被授权从服务接收此类数据是至关重要的。 标准SSL是单向(服务器)认证,对于识别客户端无济于事。


5
答案实际上取决于您的具体要求。
例如,您需要保护您的网络消息还是不需要保密性,只需验证终端方并确保消息完整性? 如果是这种情况 - 并且在Web服务中经常出现 - HTTPS可能是错误的工具。
然而 - 根据我的经验 - 不要忽视您正在构建的系统的复杂性。不仅HTTPS更容易正确地部署,而且依赖传输层安全性的应用程序更易于调试(而不是使用纯HTTP)。
祝你好运。

5

只要 API 提供者在服务器端实现授权,使用 HTTPS 进行 REST 就可以作为一种安全方法。对于 Web 应用程序而言,我们也是通过 HTTPS 和某些身份验证/授权来访问 Web 应用程序的。传统上,Web 应用程序没有安全问题,那么 Restful API 也可以轻松避免安全问题!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接