http和https的区别
谈到区别,我们不得不分别说一下http和https分别是什么,以其其是怎么实现连接的。
HTTP
1、建立tcp连接
2、client发送请求包给server(请求包包括请求行、请求头、请求内容)
3、server发送相应包给client(响应包包括响应行、响应头、响应内容)
4、close
HTTPS如何发起请求
1)客户端发起https请求,连接到服务端的443端口,发送SSL 协议的版本号,以及其他服务器和客户端之间通讯所需要的各种信息。
2)服务器向客户端传送 SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的数字签名、文件(未加密的)。这里也要发送数字签名:首先对要发送的文件和公钥使用hash函数生文件哈希值,然后用CA私钥加密文件哈希值,发送过去。
3)客户利用服务器传过来的信息验证服务器的合法性,怎么证明:首先把数字签名用CA公钥解密,生出文件哈希值,然后把文件经过hash算法算出文件哈希值,进行对比,看是不是一致,一致进行下面操作。
4)认证是服务器后,用服务器公钥加密随机值传到服务器
5)服务器使用私钥对其进行非对称解密后,得到客户端的随机值,然后把内容通过该随机值进行对称加密
6)服务端将对称加密后的信息发给客户端
7)客户端用之前的生成的随机值来进行对称解密,获取内容明文
数字签名:
(1).对要发送的内容使用hash函数生内容的文件哈希值
(2).使用自己的私钥对文件哈希值加密,就获得了自己的数字签名.
(3).将数字签名放到要发送的内容里面,一同发送.
(4).对方收到内容后,先用发送者的公钥(公钥在互联网上)对内容里的数字签名解密,得到内容的文件哈希值,
(5).然后对内容使用hash函数生成内容的文件哈希值.
(6).如果两个摘要一致,就证明内容没被修改过.
上面过程如下图:
如果文件被篡改,得到的文件哈希值就不一样。
这时候又出现一个问题,我们用公钥解开数据签名,怎么证明公钥就是服务器的呢?如果是黑客的公钥和数字证书算出来的文件哈希值也是一样的。
因此我们有了证书,如何使用数据证书呢?首先在服务器端我们用CA机构的私钥对服务器文件和公钥(是一个文件)生成的文件哈希值进行数字签名
,然后发文件和公钥(是一个文件)和 数字签名
客户端,此时我客户端用根证书(这个是在操作系统里面的,不经过网络传输所以不会被篡改),然后用根证书里面CA公钥解锁数字签名
,得到文件哈希值,然后再通过文件和公钥(是一个文件)
单向散列算法得到文件哈希值,对比两个哈希值是不是一样的, 不一样就说明被更改了。
数字签名和数字证书到底是什么
首先数字签名是用在非对称加密时侯确认内容被修改过没有,下面是没被修改的。
但是文件一旦被修改得到的文件哈希值肯定就不一样,因为:
服务器:
文件 ——> 文件哈希值(经过散列算法,是无法逆序还原的) ——> 数字签名(服务器私钥加密)
如上是服务器生成数字签名的过程,他将把数字签名、文件、公钥一起发送给客户端
但是,当中途被黑客劫持,把文件内容修改了,那么我客户端验证的时侯就会出错。
客户端:
数字证书 ——> 文件哈希值(服务器公钥解密)
文件 ——> 文件哈希值(散列算法)
然后客户端比较二者区别,如果被修改,文件哈希值会不一样。
但是这个时侯我黑客不直接篡改文件内容,而是冒充第三者,自己生成公钥和数字签名发给客户端,那么我客户端就不知道这个到底是谁发送的数据了。所以由此产生了数字证书(经过CA机构认证)。
首先在服务器端我们用CA机构的私钥对服务器文件和公钥(是一个文件)生成的文件哈希值进行数字签名,然后发文件和公钥(是一个文件)和 数字签名客户端,(这个是在操作系统里面的,不经过网络传输所以不会被篡改),然后用根证书里面CA公钥解锁数字签名,得到文件哈希值,然后再通过文件和公钥(是一个文件)单向散列算法得到文件哈希值,对比两个哈希值是不是一样的, 不一样就说明被更改了。
服务器:
文件 ——> 文件哈希值(经过散列算法,是无法逆序还原的) ——> 数字证签名(CA私钥加密)
将公钥、文件、数字签名放入数字证书中发给客户端
客户端:
首先解析证书,得到数字签名和文件
数字签名 ——> 文件哈希值(使用CA公钥(在根证书里))
文件——> 文件哈希值(哈希算法)
然后比较二者,看是否相同,相同就没有被篡改。
以上过程就证明了双方东西是不是被窃听了。就可以进行下面的传输操作了。
openssl
enc:通用加密程序,可以使用不同的加密组合完成加密,输入及输出可以通过Base64编码转换。
dgst:通用邮件文摘,使用f md2, md5, sha (sha-0 or sha-1)或者mdc2等算法。
rsa:操纵RSA 私钥。
dsa:操纵DSA 私钥。
dh:操纵Diffie-Hellman参数文件。
crt2pkcs7:产生包括了一个crl和证书的pkcs7对象。
x509:操纵x509证书, “自签”证书。
req:操纵PKCS#10证书需求,并且产生证书请求。
genrsa:产生一个任意大小的RSA 私钥。
genrsa:产生了一组Diffie-Hellman参数。
ca:从PKCS#10 证书请求产生一个证书,该程序同时维护着所颁发的证书的数据库。
verify:检测x509证书的签名