2014-09-12 92 views
0

我最近被同事告知,HTTPS GET请求的查询字符串对第三方可见,我开始证明他错了。但是找到URL解析的任何明确描述都很困难。URL如何转换为TCP/IP请求?

我的理解是,URL只是零散地发送,域传递到IP头部,端口传递到TCP头部等等。在HTTPS GET的特定情况下,这将意味着查询字符串只会驻留在HTTP头中,而HTTP头又驻留在TLS主体中,这是端对端加密的,因此是安全的。

我的问题,那么,是双重的:

  • 首先,我说的对大约一个HTTPS GET查询字符串的具体情况?
  • 其次,任何人都可以提供给我一个URL的一般解剖,并着眼于它的部分如何转换成TCP/IP请求?

回答

2

首先,您在使用HTTPS时在传输过程中被保护的查询字符串是正确的。关于这方面已经有很多问题,例如this one。本质上,HTTPS是基于SSL/TLS的HTTP,所以SSL/TLS连接在任何HTTPS流量发送之前设置。 (可能看到的是主机名称,无论是在TLS的服务器名称指示扩展中,还是可能由DNS请求泄漏)。

其次,当您向https://host.example:port/something?blabla=1发出GET请求时,这是会发生什么情况:

  • 您的浏览器在该端口上建立到host.example的TCP连接。
  • 由于它是一个https:// URL,所以建立了SSL/TLS连接。 SSL/TLS堆栈应该验证证书并且它与您之后的主机名相匹配。
  • 在此SSL的顶部/ TLS连接(这将直接使用普通HTTP时,是在TCP连接的顶部),您的浏览器将是这样的:

    GET /something?blabla=1 HTTP/1.1 
    Host: host.example:port 
    .... (other headers) 
    

    这一切是通过SSL发送/ TLS。请注意,严格来说,查询参数是URL的组成部分,并发送到in the Request-Line, not headers

您可以找到有关RFC 2616 HTTP细节(最近取代)和有关HTTPS在RFC 2818

-1

IP头将不会使用URL或域或类似的东西,他们封装的TCP会。在这种情况下,封装的所有东西都会被加密。

我认为这是值得指出的是,尽管你可能看不到太大的给定HTTPS消息,消息如

GET https://example.com/query?q=text 

我相信,你会看到一个DNS请求“示例”中明确;其他所有内容都将在HTTPS中加密。所有这些都说在主机解决步骤中不要忘记加密。它不在IP头部,这是IP地址的用途。但是我们已经通过DNS获取这些地址。