前面讲的基础验证和摘要认证都满足不了现实需要,所以才有了HTTPS,这一章详细介绍了和HTTPS相关的知识
14.1 HTTP安全
-
HTTPS的设计要求
- 服务器认证
- 客户端认证
- 防止伪造身份钓鱼攻击
- 完整性
- 防止数据被篡改
- 加密
- 防止通信被窃听
- 效率
- 加密/解密速度要够快
- 普适性
- 支持所有客户端和服务器
- 扩展性
- 适应性
- 能够支持流行的加密方法
- 可行性
-
HTTPS的作用
- 在HTTP发往TCP之前
- 用SSL把所有数据加密一下
14.2 密码学
-
什么是明文
- 加密前的报文
-
什么是密文
- 加密后的报文
-
什么是密码学
- 对报文进行加密/解密的学科
-
密码学的历史
- 凯撒的三位字符循环密码
- 很容易被聪明人破解
- 二战时的密码机
- 比人肉更加复杂的加密机制
- 机器可能会落入坏人之手
- 使得了密钥的密码机
- 不同的号盘可以改变加密方式
- 知道了机器设计原理可能会被破解
- 数字加密
- 没有机械设备的速度限制
- 可以使用越长密钥
- 也会被超高速计算机枚举破解
- 凯撒的三位字符循环密码
14.3 对称加密
-
常见的对称加密方法
- DES
- Triple-DES
- RC2
- RC4
-
什么是枚举攻击
- 暴力方式尝试每一个密钥值
-
共享密钥的不足
- DES加密80密钥超算下面很快就会被破解,估计128位的密钥在量子计算机下也会很快被破解
- 通信时需要为不同的连接维护不同的密钥,上亿访问的连接无法管理
14.4 公开加密
- 设计公开加密的前提
- 要让坏人知道如下3个东西后,还是没办法破解
- 公开密钥
- 拦截的密文
- 一条报文与之相关的密文
- 要让坏人知道如下3个东西后,还是没办法破解
14.5 数字签名
-
什么是签名
- 用加密系统对报文进行签名
- 说明是谁编写的报文
- 并证明报文未被篡改
-
签名的步骤
- 客户端将报文提取为摘要(见摘要算法,简单的说就是MD5报文)
- 客户端用私钥加密摘要后得到签名
- 将签名放在报文末尾发给服务器
- 服务器有公钥解密签名得到客户端的摘要
- 服务器计算报文的摘要
- 对比2边的摘要是否一样,即可判断数据是否被篡改或发送端是否有正确的私钥
14.6 数字证书
数字证书就相当于现实生活中的身份证和名片,用来证明你是谁的.名片和身份证的区别,就是权威CA和自建CA的区别
-
数字证书的主要内容
- 证书格式版本号
- 证书序列号
- 证书签名算法
- 证书颁发机构
- 有效期
- 对象名称
- 对象的公开密钥
- 其他扩展信息
- 以及对上面信息进行的签名
-
通用的数字签名证书版本
- X.509 v3证书
-
什么时候验证服务器证书
- SSL握手成功之后
-
验证证书有效性的步骤
- 日期检测
- 过期的证书直接PASS
- CA机构检测
- 小CA直接PASS,除非用户自己把根证书添加到浏览器里面
- 签名检测
- 公钥加密证书签名发给CA验证
- 验证通过说明证书未被篡改
- 站点身份检测
- 证书上的URI和请求中的URI是否一致
- 日期检测
-
虚拟主机存在的问题
- 一台服务器一般只存在一个证书
- 虚拟主机上多个域名无法共用一个证书
14.7 HTTPS
-
什么是HTTPS
- 在安全传输层上发送的HTTP
- 安全层是由SSL实现的
-
HTTPS连接和HTTP连接的区别
| HTTPS | HTTP |
|---|---|
| 会先打开443的一条TCP连接 | 打开80端口 |
| 客户端和服务器开始初始化SSL层,然后HTTP数据发往SSL层,再发向TCP | HTTP数据直接发向TCP |
| 断开连接时先关闭SSL再关闭TCP | 直接关闭TCP |
-
SSL握手过程
- 参考图解HTTP第7章
-
SSL在代理中存在的问题
- 因为SSL是把所有报文信息加密了,所以代理收到后看不见请求头,不知道转发给谁,就会连接失败
-
如何解决代理中的问题
- 客户端和代理之间先建议普通的HTTP连接
- 代理和服务器之间建立HTTPS连接
- 客户端再把SSL数据发给代理
- 代理盲转发SSL数据
14.8 OpenSSL
自己构建一个SSL,跳过了.如果以后需要的话再回来看吧P346