GET 数据也是用 HTTPS 加密的吗?

当你得到

Https://encrypted.google.com/search?q=%s

%s查询是加密的? 还是仅仅是响应? 如果不是这样,那么谷歌为什么还要为其公开内容提供加密服务呢?

83314 次浏览

整个请求被加密,包括 URL,甚至命令(GET)。中介方(如代理服务器)能够收集的唯一信息是目标地址和端口。

然而,请注意,TLS 握手的 Client Hello 数据包可以通过 < em > SNI 扩展部分以明文形式宣传完全限定的域名(多谢@hafichuk) ,所有现代主流浏览器都使用 < em > SNI 扩展部分,尽管有些只在较新的操作系统上使用。

编辑: (因为这个给了我一个“正确答案”徽章,我想我应该回答整个问题...)

整个响应也是加密的; 代理无法拦截其中的任何部分。

Google 通过 https 提供搜索和其他内容,因为并非所有内容都是公开的,而且您可能还希望从 麻省理工学院中隐藏一些公开内容。在任何情况下,最好让谷歌 为自己辩护

在传输请求之前对连接进行加密。因此,是的,请求也是加密的,包括查询字符串。

所有内容都是加密的,但是您需要记住,您的查询将保留在服务器的日志中,并且可以被各种日志分析器访问(POST 请求通常不是这种情况)。

SSL 在头解析之前发生,这意味着:

Client creates Request
Request gets encrypted
Encrypted request gets transmitted to the Server
Server decrypts the Request
Request gets parsed

请求看起来像这样(不记得确切的语法,但是应该足够接近) :

GET /search?q=qwerty HTTP/1.1
Host: www.google.de

这也是为什么对于同一 IP 上的多个主机使用不同的 SSL 证书是有问题的,所请求的主机名在解密之前是不知道的。

是的,它是安全的。 SSL 加密一切。

请求摘录:

POST /foo HTTP/1.1
... some other headers

GET 请求摘录:

GET /foo?a=b HTTP/1.1
... some other headers

在这两种情况下,套接字上发送的任何内容都是加密的。在 GET 请求期间,客户端 看见了参数在他的浏览器中的事实并不意味着中间的人也会看到同样的情况。

在任何 HTTP 数据之前建立基础 SSL 连接 这样可以确保所有 URL 数据(除了 用于建立连接的主机名) 在这个加密的连接,并保护 中间人攻击的方式与任何 HTTPS 数据的方式相同。

以上是谷歌问答中非常全面的答案的一部分,位于这里:

Http://answers.google.com/answers/threadview/id/758002.html#answer

GET 请求在使用 HTTPS 时是加密的——事实上,这就是为什么安全网站需要一个唯一的 IP 地址——在解密之前,没有办法从请求中获得预期的主机名(或虚拟目录)。

URL 本身是经过加密的,因此查询字符串中的参数不会在线路中以普通方式传输。

然而,请记住,包括 GET 数据在内的 URL 经常被 webserver 记录,而 POST 数据很少被记录。因此,如果您计划执行类似于 /login/?username=john&password=doe的操作,那么不要这样做; 而是使用 POST。

安全地发送主机名后面的 URL 部分。

比如说, Https://somewhere.com/index.php?name=field

/index.php?NAME=FIELD加密了,而 somewhere.com没有。

我只是通过 HTTPS 连接到一个网站,并传递了一堆 GET 参数。然后,我使用 wireshark 来嗅探网络。使用 HTTP,URL 是未加密发送的,这意味着我可以很容易地看到 URL 中的所有 GET 参数。使用 HTTPS,一切都是加密的,我甚至看不到哪个数据包是 GET 命令,更不用说它的内容了!

上面有一点混乱:

  1. 尽管如此,它不再需要有唯一的 IP 地址,因为 SNI 字段告诉服务器使用哪个证书
  2. 除了 SNI 请求之外,所有东西都是加密的,而 SNI 请求是非常早的。这告诉服务器使用哪个 Name,因此使用哪个证书。也就是说,服务器名称指示符 IS 未经加密发送,以便服务器和客户端可以建立并使用安全连接来处理其他所有事情。

所以,回答最初的问题。除了主机名(和我猜想的端口)之外,所有东西都是双向安全的。