0x0A 基础
TCP 建立连接三次握手
三次握手(建立连接)
第一次:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次:服务器收到SYN包,向客户端返回ACK(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RCVD状态;
第三次:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,也就是ESTABLISHED状态。
三次握手保证了不会建立无效的连接,从而浪费资源。
TCP断开连接四次挥手
四次挥手(断开连接)
第一次: TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
第二次:服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
第三次:服务器关闭客户端的连接,发送一个FIN给客户端。
第四次:客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
HTTP建立连接过程
域名解析 –> 发起TCP的3次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) –> 浏览器对页面进行渲染呈现给用户
这一步的目标是为了获取到服务器的IP地址,如同打电话,要让通信信号定位到对方联系人,让消息传达至对方。
①浏览器会先解析我们输入的url地址,浏览器会先搜索自身的DNS缓存,看自身的缓存中是否有对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
②如果浏览器自身的缓存里面没有找到对应的条目,那么Chrome会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。
③如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。
④如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器发起域名解析请求直到获取至服务器的IP地址。
注:一般情况下是不会进行以下步骤的
如果经过以上的4个步骤,还没有解析成功,那么会进行如下步骤(以下是针对Windows操作系统):
⑤操作系统就会查找NetBIOS name Cache(NetBIOS名称缓存,就存在客户端电脑中的),那这个缓存有什么东西呢?凡是最近一段时间内和我成功通讯的计算机的计算机名和Ip地址,就都会存在这个缓存里面。什么情况下该步能解析成功呢?就是该名称正好是几分钟前和我成功通信过,那么这一步就可以成功解析。
⑥如果第5步也没有成功,那会查询WINS 服务器(是NETBIOS名称和IP地址对应的服务器)。
⑦如果第6步也没有查询成功,那么客户端就要进行广播查找。
⑧如果第7步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下,写法也一样)
如果第8步还没有解析成功,那么就宣告这次解析失败,那就无法跟目标计算机进行通信。只要这8步中有一步可以解析成功,那就可以成功和目标计算机进行通信。
拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)会以一个随机端口(1024 < 端口 < 65535)向服务器的WEB程序(常用的有httpd,nginx等)80端口发起TCP的连接请求。这个连接请求(原始的http请求经过TCP/IP4层模型的层层封包)到达服务器端后(这中间通过各种路由设备,局域网内除外),进入到网卡,然后是进入到内核的TCP/IP协议栈(用于识别该连接请求,解封包,一层一层的剥开),还有可能要经过Netfilter防火墙(属于内核的模块)的过滤,最终到达WEB程序,最终建立了TCP/IP的连接。
HTTP一般流程
1.域名解析
2.发起TCP的3次握手
3. Web浏览器向Web服务器发送http请求命令
一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。
4. Web浏览器发送http请求头信息
浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
5. Web服务器应答
客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
6. Web服务器发送应答头信息
正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
7. Web服务器向浏览器发送数据
Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
8. Web服务器关闭TCP连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
算法基础知识
对称加密算法
对称加密算法的特点是加密密钥和解密密钥是同一把密钥K,且加解密速度快,典型的对称加密算法有DES、AES等
非对称加密算法
非对称加密算法的特点是加密密钥K1和解密密钥K2是不一样的,他们是一对可互为加解密的密钥,一个可以公开,叫公钥;一个自己保留,不能让其他人知道,叫私钥。这样就能比较好的解决信息传递的安全性,相对来说加解密速度较慢,典型的非对称加密算法有RSA、DSA等。问题是如何保证加密用的接收者的公钥,即如何安全的传递公钥。
摘要算法、数字签名
F(M) = D E(D)=S
F是单向散列函数:即如果已知x,很容易计算F(x),但已知F(x),却很难算出x
数字签名就是用私钥将摘要加密的结果,这样能够保证数据的完整性、放篡改、以及不可抵赖性。
校验数据的完整性
乙方把接收到的发送方的明文用单向哈希函数取得摘要值与甲方的公钥解密甲方的数字签名而得到的摘要值进行比较,如果一样说明信息完整,未受篡改,如果不一样说明受到篡改
严密的数字加解密、数字签名与验证流程
在发送过程中首先将甲方的明文取摘要值,再将此摘要值用甲方的私钥加密得到甲方的签名,然后将甲的明文、数字签名和数字证书合在一起用甲方随机生成的对称密钥加密得到密文;第二步是将这一随机生成的对称密钥用乙方的公钥加密后得到数字信封;最后将密文和数字信封一起发送给乙方。
在乙方接收过程中,首先将收到数字信封用乙方的私钥解密,得到随机生成的对称密钥,第二步是解密得到的随机生成的对称密钥将密文解密,得到甲方的明文、数字签名和数字证书;第三步将甲方的明文取摘要值与甲方的数字签名用甲方的公钥解密得到的摘要进行比较,从而验证签名和检验数据的完整性。这一流程同时用到对称算法和非对称算法,是比较安全的流程
数字证书在这里起到的作用有:提供甲方的公钥,保证发送信息方的不可抵赖性。
** X.509证书**
为了保证证书的一致性,国际电信联盟设计了一套专门针对证书格式的标准X.509,其核心提供了一种描述证书的格式。
X.509数字证书不仅包括用户名和密码,而且还包含了与用户有关的其他信息,通过使用证书,CA可以为证书接收者提供一种方法,使他们不仅信任证书主体的公钥,而且还信任有关证书主体的其他信息
X.509证书有有效期限、证书在期满后就会失效。期间CA可能会出于某些原因吊销证书。要吊销证书,CA保存并分发一个吊销证书的列表,即证书吊销列表CRL。网络用户可以访问CRL以确定证书的有效性
目前, X.509标准已在编排公共密钥格式方面被广泛接受,用户许多网络安全的应用程序,其中包括Ipsec, SSL, SET, S/MIME(安全多媒体Internet邮件扩展)
HTTPS概念说明
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲就是HTTP的安全版。其实现是在HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
SSL协议位于TCP/IP协议与各种应用协议之间,是一种国际标准的加密及身份认证通信协议,为TCP提供一个可靠的端到端的安全服务,为两个通讯个体之间提供保密性和完整性。SSL层所处位置如下
SSL协议特点
①SSL协议可用于保护正常运行与TCP之上的任何应用协议,如HTTP、FTP、SMTP或Telent的通信,最常见的是用户SSL来保护HTTP通信
②SSL协议的优点在于它是应用层协议无关的。高层的应用协议能透明的建立于SSL协议之上
③SSL协议的应用层协议之前就完成加密算法、通信密钥的协商以及服务器的认证工作。在此之后应用层协议所传送的数据都会被加密。从而保证通信的安全性。
④SSL协议使用通信双方的客户证书以及CA根证书。允许客户/服务器应用以一种不能被偷听的方式通信,在通信双方建立起了一条安全的、可信任的通信通道。
⑤该协议使用密钥对传送数据加密,许多网站都是通过这种协议从客户端接收信用卡编号等保密信息。常用于交易过程
0x0B HTTPS建立连接
HTTP通信存在的问题
- 容易被监听
http通信都是明文,数据在客户端与服务器通信过程中,任何一点都可能被劫持。比如,发送了银行卡号和密码,hacker劫取到数据,就能看到卡号和密码,这是很危险的
- 被伪装
http通信时,无法保证通行双方是合法的,通信方可能是伪装的。比如你请求www.taobao.com,你怎么知道返回的数据就是来自淘宝,中间人可能返回数据伪装成淘宝。
- 被篡改
hacker中间篡改数据后,接收方并不知道数据已经被更改
HTTPS解决的问题
https很好的解决了http的三个缺点(被监听、被篡改、被伪装),https不是一种新的协议,它是http+SSL(TLS)的结合体,SSL是一种独立协议,所以其它协议比如smtp等也可以跟ssl结合。https改变了通信方式,它由以前的http—–>tcp,改为http——>SSL—–>tcp;https采用了共享密钥加密+公开密钥加密的方式
- 防监听
数据是加密的,所以监听得到的数据是密文,hacker看不懂。
- 防伪装
伪装分为客户端伪装和服务器伪装,通信双方携带证书,证书相当于身份证,有证书就认为合法,没有证书就认为非法,证书由第三方颁布,很难伪造
- 防篡改
https对数据做了摘要,篡改数据会被感知到。hacker即使从中改了数据也白搭。
建立HTTPS连接
- 在使用HTTPS是需要保证服务端配置正确了对应的安全证书
- 客户端发送请求到服务端
- 服务端返回公钥和证书到客户端
- 客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端
- 服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做私钥对需要发送的数据进行对称加密
- 客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户
- SSL加密建立
更详细的过程
【HTTPS连接的前几毫秒发生了什么】https://yq.aliyun.com/wenji/141352
0x0C HTTPS中间人攻击
工具ssltrip和burp使用原理,中间人抓包的工具
原理
https也不是绝对安全的,如下图所示为中间人劫持攻击,中间人可以获取到客户端与服务器之间所有的通信内容。
中间人截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。 通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。 使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。
案例
https://blog.csdn.net/f2006116/article/details/53494353
扩展阅读:
https://segmentfault.com/a/1190000013075736
https://www.jianshu.com/p/0d8575b132a8
https://blog.csdn.net/hbdatouerzi/article/details/71440206
https://www.jianshu.com/p/4682aecf162d?open_source=weibo_search [很好]
https://blog.csdn.net/ltx1130/article/details/78302459
0x0D HTTPS与CA
引用与参考:
https://www.cnblogs.com/liyuhui-Z/p/7844880.html
https://www.cnblogs.com/curo0119/p/8963545.html
https://www.cnblogs.com/engeng/articles/5959335.html
https://www.cnblogs.com/gordon0918/p/5237717.html
https://www.cnblogs.com/mddblog/p/6948980.html
阅读延伸
https://blog.csdn.net/xiaopang_yan/article/details/78709574