当你拿到时
https://encrypted.google.com/search?q=%s
查询是否%s
加密?还是只是回应?如果不是,为什么 Google 还要通过加密来提供其公共内容?
整个请求都是加密的,包括 URL,甚至是命令 ( GET
)。代理服务器等干预方唯一可以收集的信息是目标地址和端口。
但是请注意,TLS 握手的 Client Hello 数据包可以通过SNI扩展(感谢@hafichuk)以纯文本形式公布完全限定域名,所有现代主流浏览器都使用该扩展,尽管有些仅在较新的操作系统上使用。
编辑:(因为这只是给我一个“好答案”徽章,我想我应该回答整个问题......)
整个响应也被加密;代理不能拦截它的任何部分。
Google 通过 https 提供搜索和其他内容,因为并非所有内容都是公开的,而且您可能还希望对MITM隐藏一些公开内容。无论如何,最好让谷歌自己回答。
URL 本身是加密的,因此查询字符串中的参数不会通过网络传输。
但是,请记住,包含 GET 数据的 URL 通常由 Web 服务器记录,而 POST 数据很少记录。因此,如果您打算做类似的事情/login/?username=john&password=doe
,那就不要;改用 POST。
HTTPS 在传输任何 HTTP 数据之前建立基础 SSL 连接。这可确保所有 URL 数据(除了用于建立连接的主机名)仅在此加密连接中传输,并像任何 HTTPS 数据一样受到保护,免受中间人攻击。
以上是位于此处的 Google Answers 非常全面的答案的一部分:
http://answers.google.com/answers/threadview/id/758002.html#answer
安全发送主机名之后的 URL 部分。
例如, https://somewhere.com/index.php?NAME=FIELD
该/index.php?NAME=FIELD
部分已加密。somewhere.com
不是。
一切都是加密的,但您需要记住,您的查询将保留在服务器的日志中,并且可以被各种日志分析器等访问(这通常不是 POST 请求的情况)。
在传输请求之前,连接会被加密。所以是的,请求也被加密了,包括查询字符串。
我刚刚通过 HTTPS 连接到一个网站并传递了一堆 GET 参数。然后我用wireshark嗅探网络。使用 HTTP,URL 是不加密发送的,这意味着我可以很容易地看到 URL 中的所有 GET 参数。使用 HTTPS,一切都被加密了,我什至看不到哪个数据包是 GET 命令,更不用说它的内容了!
是的,它是安全的。SSL 加密一切。
POST请求的摘录:
POST /foo HTTP/1.1
... some other headers
GET 请求的摘录:
GET /foo?a=b HTTP/1.1
... some other headers
在这两种情况下,在套接字上发送的任何内容都是加密的。客户端在 GET 请求期间在其浏览器中看到参数这一事实并不意味着中间人会看到相同的参数。
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 证书是有问题的,所请求的主机名在解密之前是未知的。
GET 请求在使用 HTTPS 时被加密——事实上这就是为什么受保护的网站需要有一个唯一的 IP 地址——在解密之前无法从请求中获取预期的主机名(或虚拟目录)。
上面有一点混乱:
所以,回答原来的问题。除了主机名(我猜是端口)之外的所有内容都在两个方向上都是安全的。