PKI 体系

2018-08-31  本文已影响0人  鱼_乐

原文链接: https://blog.wangriyu.wang/2018/04-http-pki.html

中间人攻击和信息抵赖

没有身份验证的情况下,在非对称加密中实现身份验证和密钥协商时,比如常用的 RSA 算法无法确保服务器身份的合法性,因为公钥并不包含服务器的信息。可能出现如下两种情况:

image

此时需要一种认证体系以确保通信者是安全可靠的。

PKI - 互联网公钥基础设施

PKI 的目标就是实现不同成员在不见面的情况下进行安全通信,当前采用的模型是基于可信的第三方机构,也就是 证书颁发机构 (certification authority,CA) 签发的证书。
PKI 通过数字证书认证机构 (CA) 将用户的个人身份跟公开密钥链接在一起。对每个证书中心用户的身份必须是唯一的。链接关系由注册和发布过程确定,取决于担保级别,链接关系可能由 CA 的各种软件或在人为监督下完成。

image image

一个具体实例: https://zh.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%87%91%E9%91%B0%E8%AA%8D%E8%AD%89#%E7%94%B3%E9%A0%98%E5%8F%8A%E4%BD%BF%E7%94%A8

证书

证书大致分为三类

其他的还可以细分为中介证书、终端实体证书、授权证书、TLS 服务器证书、通配符证书、TLS 客户端证书

审核级别 (担保级别)

证书结构

image image

证书链

CA 根证书和服务器实体证书中间增加一层证书机构,即中介证书,证书的产生和验证原理不变,只是增加一层验证,只要最后能够被任何信任的 CA 根证书验证合法即可

  1. 服务器证书 server.pem 的签发者为中间证书机构 inter,inter 根据证书 inter.pem 验证 server.pem 确实为自己签发的有效证书;
  2. 中间证书 inter.pem 的签发 CA 为 root,root 根据证书 root.pem 验证 inter.pem 为自己签发的合法证书;
  3. 客户端内置信任 CA 的 root.pem 证书,因此服务器证书 server.pem 被信任。
certificate-chain ssllabs-certificate-chain

具体例子可以看维基百科的例子: https://zh.wikipedia.org/wiki/%E4%BF%A1%E4%BB%BB%E9%8F%88#%E8%88%89%E4%BE%8B

点击浏览器地址栏的绿色小锁可以查看网站的证书链:

chrome-certificate-chain

二级证书结构存在的优势:

服务器一般提供一条证书链,但也有多条路径的可能。以 交叉证书 为例,一条可信路径可以一直到 CA 的主要根证书,另外一条则是到可选根证书上。
CA 有时候会为同样的密钥签发多张证书,例如现在最常使用的签名算法是 SHA1,因为安全原因正在逐步迁移到 SHA256, CA 可以使用同样的密钥签发出不同签名的新证书。如果信赖方恰好有两张这样的证书,那么就可以构建出两条不同的可信路径。

身份验证

再回过头来看中间人攻击,需要身份验证后中间人与 Server 通信时接收服务器的证书实现身份验证,但与客户端通信时无法向用户提供可信任的证书。

image

除非伪造一份证书 (很困难),或者骗取客户端信任,比如在客户机操作系统上添加中间人证书的完全信任,以此实现用户的信任和身份验证。

举个栗子:

使用抓包工具 Charles 时,如果想抓取 HTTPS 的内容,就需要安装其提供的证书并添加信任

image

没有信任时,抓取的 HTTPS 内容无法解析

image

取得信任后,抓取的 HTTPS 请求可以和 HTTP 请求一样直接读取

image

在这个过程中 Charles 就是一个中间人,而且可以完全获取 HTTPS 信息,因为用户安装并信任它的证书,也就可以做到身份验证。

可以看到加密协议下所有连接都是 Connect 形式,这涉及到 隧道协议 - Tunneling Protocol 的概念

使用隧道的原因是在不兼容的网络上传输数据,或在不安全网络上提供一个安全路径。

隧道通信的机制如下:

The client asks an HTTP Proxy server to tunnel the TCP connection to the desired destination.
The server then proceeds to make the connection on behalf of the client. Once the connection has been established by the server,
the Proxy server continues to proxy the TCP stream to and from the client.The client is now being proxied to the remote host.
Any data sent to the proxy server is now forwarded, unmodified, to the remote host and the client can communicate using any protocol accepted by the remote host

Proxy servers may also limit connections by only allowing connections to the default HTTPS port 443, whitelisting hosts, or blocking traffic which doesn't appear to be SSL.

客户端先请求一个代理服务器去建立和目标服务器之间的 tcp tunnel,目标服务器尝试连接客户端 (实际是代理服务器),如果连接成功建立,代理服务器会给客户端返回 200 ok 并继续代理客户端和目标服务器之间的 tcp 流。
任何发送给代理服务器的数据都会不加修改地被转发,远程主机和客户端可以通过任何协议 (TLS、SSH、SOCKS、PPTP...) 进行后续交互。

代理服务器也可以通过端口限制 (443)、host 白名单、阻止非 SSL 的数据流来限制连接

一些代理服务器需要认证信息来建立 tunnel. 常见的是 Proxy-Authorization 头域:

CONNECT server.example.com:80 HTTP/1.1
Host: server.example.com:80
Proxy-Authorization: basic aGVsbG86d29ybGQ=

关于这个中间代理的详细信息见 https://en.wikipedia.org/wiki/DMZ_(computing)

题外话

讲到 Charles,不得不提另一个抓包工具 Wireshark。这两个工具的抓包原理不同,Charles 是通过代理过滤抓取本机的网络请求,主要抓 HTTP、HTTPS 的请求;
Wireshark 则是使用了 网卡混杂模式 - promiscuous mode,可以抓取指定网卡上所有流过的包,可以抓取应用层、传输层、网络层的各种封包,但是正常情况下不能解析 HTTPS 的内容 (可以通过配置浏览器提供的对称协商密钥或者服务器的私钥来解密 TLS 内容)。

开启混杂模式时除了可以看到自己电脑上的网络封包,还可以看到目标地址不是本机的网络包 (如果路由器没有做网络分发的工作的话,完全有可能接收到其他电脑的网络包),还可以看到局域网内的广播等等。我看了一篇于此相关的网络攻击手段 - ARP 攻击

ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标 IP 对应的 MAC 地址,如图

image

而 ARP 攻击者可以通过两种方式实现抓取监听局域网内全部或者想要的目标的网络数据:

References

上一篇 下一篇

猜你喜欢

热点阅读