为需要SSL/TLS的请求发送的正确HTTP响应是什么

gtd*_*gtd 45 rest ssl https http httpresponse

我正在设计一个RESTful API,其中一些调用是通过HTTP公开的,有些需要API密钥和HTTPS加密.我正在考虑如果HTTP请求被发送到其中一个私有资源,应该发送什么响应代码.到目前为止,跳出来的唯一一个是412 - Precondition Failed,但是标准表明前提是由请求者而不是服务器强加的.

对于这种情况是否有适当的响应代码,或者我只需要放弃并执行400

Mic*_*icE 28

我不能说这是否被HTTP客户端广泛接受,但严格来说是RFC,服务器应该响应:

HTTP/1.1 426 Upgrade Required
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade
Run Code Online (Sandbox Code Playgroud)

资料来源:http:
//tools.ietf.org/html/rfc2817#section-4.2

  • @SripathiKrishnan即使您的服务器会丢弃http请求,仍然可以进行中间人/拦截攻击.实际上,除非客户端使用https,否则无法保证他们获得的任何响应都不会被破坏. (7认同)
  • 我们知道`https`广泛知道它在RFC 2818(HTTP over TLS)中指定.RFC 2817几乎从未使用过.@ dasil003,注意IETF规范调用TLS"TLS",因为它是IETF标准(SSL不是):你可以用"SSL"来轻松读取所有这些(除了它确实会引用早期版本).RFC 2817不是关于从SSLv3升级到TLS(1.x),而是关于在同一连接上从普通HTTP升级到SSL/TLS. (5认同)
  • 有趣.RFC和OWASP的建议不同.我更喜欢OWASP的版本 - 不响应请求而只丢弃数据包.使用RFC方法,中间人可以拦截响应(因为它还不是https)并重定向到欺骗性网站. (3认同)
  • 绝对认为MITM讨论正在过度思考它.在您丢弃数据包之前,MITM可以拦截.如果客户端尝试http,则完成契约.426的目的是告诉客户的开发人员修改他们的darn代码. (3认同)

NER*_*808 7

返回带有原因短语“需要 HTTPS ”的403似乎是一个实用的选择,也是我所使用的。

请参阅https://en.wikipedia.org/wiki/HTTP_403

重定向 REST Api 并不是一个好主意,特别是因为您可能不知道如何或什么正在消耗您的服务。


mdb*_*mdb 6

要返回的相应错误代码类似于403.4 - 需要SSL.

虽然RFC 1.1中没有明确记录,但此行为符合其中列出的要求:

服务器理解请求,但拒绝履行请求.授权无效,请求不应重复.如果请求方法不是HEAD并且服务器希望公开为什么请求没有得到满足,那么它应该描述实体中拒绝的原因.如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到).

添加自己的子代码(与SSL示例一样)在某些情况下可能会有所帮助,但由于此子代码对第三方没有意义,我建议不要使用它.

因此,您的最终错误消息将类似于"403 - 私有资源".请注意,即使在缺少API密钥的情况下,也不应使用"401 - 未授权",除非您的API密钥实际上可以在WWW-Authenticate头字段中传输.

  • 请注意,IIS状态代码是虚假的.HTTP状态代码仅由数字组成(精确到3).请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1.1另请注意,403的原因短语是"禁止",并且不作修改.任何进一步的解释都应该进入响应*body*. (4认同)
  • 我同意其他评论者不应该使用子代码,但是可以针对普通403做出一个案例.例如,这就是Twitter用于其API的内容.请参阅https://dev.twitter.com/docs/security/using-ssl (4认同)

Bri*_*zel 6

强制HTTP客户端使用HTTPS的最安全方法是HTTP严格传输安全性.

以前一个常见的建议是放弃连接,但这种做法已被删除,有利于HSTS(OWASP网站).

  • 1. HSTS草案已移至IETF(http://tools.ietf.org/id/draft-ietf-websec-strict-transport-sec).阅读它实际上并没有给出OP的问题一个很好的答案. (6认同)
  • HSTS在<b>整个</ b>网站上强制执行HTTPS.上面的海报希望通过HTTP获得一些资源,而其他资源只能通过HTTPS获得.因此,HSTS无法使用,因为它适用于所有资源. (2认同)
  • 这不符合OP的问题.他询问当客户端通过http连接时要做什么,而不是HSTS标头,只有当用户通过https连接时才会生效. (2认同)