https安全传输建立过程学习
简单过程
以chrome和bilibili网站通信为例:
前提:bilibili向CA机构申请证书
首先是bilibili将自己的信息和公钥放置到证书,然后向CA提交申请,CA核实确实bilibili身份后用自己的私钥对证书进行签名
使用chrome向bilibili发起请求
- 浏览器向服务器发起请求
- 服务器响应请求,将CA证书发给浏览器
- 浏览器获取内置的CA公钥对证书上的签名进行验证,证明服务器的身份(即验证公钥是不是bilibili的),验证成功后获取证书上的公钥
- 浏览器生成一段随机数,并使用服务器公钥进行加密(只有bilibili服务器私钥才能解开),发送给服务器
- 服务器收到信息后用自己的私钥解密,获得随机数,之后使用这一串随机数作为堆成密钥和浏览器进行对称加密传输(对称密钥只有浏览器和服务器知道)
详细过程
1. 身份认证
- 浏览器向服务器发起请求,带上一个随机数
client Random
- 服务器响应请求,将一个随机数
server Random
和CA证书
发给浏览器 - 浏览器获取
内置的CA公钥
对证书上的签名
进行验证,证明服务器的身份(即验证公钥是不是bilibili的),验证成功后获取证书上的公钥serverPublicKey
2. 密钥协商
- 服务器生成
服务器DH参数
,并且使用自己的私钥签名,发给客户端 - 客户端收到后使用服务器公钥
serverPublicKey
验证签名,获取服务器DH参数
- 客户端生成
客户端DH参数
,发给服务端 - 服务端收到
客户端DH参数
3. 对称加密传输
- 服务端和客户端此时均有
client Random
、server Random
、客户端DH参数
、服务器DH参数
,将四者进行结合生成对称密钥,然后通过对称密钥进行加密传输
补充
1. TLS/SSL
2. RSA非对称加密原理
/* p,q为两个质数 */
let p = 3, q = 11;
let fN = (p - 1) * (q - 1);
/* 公钥 {e,N} */
let e = 7;
let N = p * q;//33
let publicKey = { e, N };
/* 私钥{d,N} */
let d = 1;
while (e * d % fN !== 1) d++;
console.log(d);//3
let privateKey = { d, N };
/* ------------ 测试 ------------ */
/* 公钥加密 */
let m = 5;
let c = Math.pow(m, publicKey.e) % publicKey.N;//c = m^e % N
console.log('c = ' + c);//c=14
/* 私钥解密 */
let origin = Math.pow(c, privateKey.d) % privateKey.N;//m = c^d % N
console.log(origin);//5
3. Diffie-Heliman原理
/* 公共部分 */
let p = 5, N = 23;
/* A,B各自的密钥 */
let secretA = 6, secretB = 15;
/* A加密 */
let A = Math.pow(p, secretA) % N;
console.log("A = " + A);
/* B加密 */
let B = Math.pow(p, secretB) % N;
console.log("B = " + B);
/* A将A给B,B将B给A */
//A解密
console.log(Math.pow(B, secretA) % N);//2
//B解密
console.log(Math.pow(A, secretB) % N)//2