什么是Https、数字签名、数字证书

一、Http和Https

1、HTTP和HTTPS的基本概念
  HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

  HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

  HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

2、HTTP与HTTPS有什么区别?

  HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

  HTTPS和HTTP的区别主要如下:

  1)https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

  2)http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

  3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  
  4)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
  
3、TLS/SSL特点
  1)HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。
  2)TLS/SSL中使用了非对称加密,对称加密以及HASH算法。其中非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性。
  3)TLS握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。

4、OSI七层协议模型和TCP/IP四层模型
这里写图片描述

二、基本概念

1、公钥和私钥

公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

2、RSA简介

RSA密码体制是一种公钥密码体制,公钥公开,私钥保密,它的加密解密算法是公开的。 由公钥加密的内容可以并且只能由私钥进行解密,并且由私钥加密的内容可以并且只能由公钥进行解密。也就是说,RSA的这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容可以由并且只能由对方进行解密。

3、数字签名

可以参考这个链接,通俗易懂:http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

  1. 原理
    这里写图片描述
    签名就是在信息的后面再加上一段内容,一般是对信息做一个hash计算得到一个hash
    值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。

  2. 验证流程
    发送者:将报文通过hash算法生成摘要,用私钥加密生成签名。
    接收者:使用公钥解密数字签名,得到摘要A,再对报文进行Hash算法得到摘要B,比较A和B,一致则表示没有被修改。

  3. 问题
    小明把自己的公钥给了小李,和小李按照上面的流程进行通信。此时第三人小赵,偷偷把自己的公钥替换小明给小李的公钥,小赵用自己私钥加密报文,发信息给小李,小李还以为是小明在给他发信息,造成了无法识别发信人的身份问题。此时如果有个中间人进行监督,验证发信的身份,可以解决以上问题,也就是下面说的数字证书。

4、数字证书

数字证书则是由证书认证机构(CA, Certificate Authority)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。
数字证书主要包含了CA认证过的公钥和拥有者的基本信息

数字证书:
这里写图片描述
最终邮件形式:
这里写图片描述

流程:
用户A给用户B发邮件,B收到后,先用CA公钥解密数字证书,拿到A的公钥,再解密数字签名,得到摘要,对明文进行Hash算法,得到摘要,再进行对比。

5、Https通信流程

HTTPS通信过程的时序图如下:
这里写图片描述

文字简述:客户端A和服务器B之间的交互

  1. A与B通过TCP建立链接,初始化SSL层。
  2. 进行SSL握手,A发送https请求,传送客户端SSL协议版本号、支持的加密算法、随机数等。
  3. 服务器B把CA证书(包含B的公钥),把自己支持的加密算法、随机数等回传给A。
  4. A接收到CA证书,验证证书有效性。
  5. 校验通过,客户端随机产生一个字符串作为与B通信的对称密钥,通过CA证书解出服务器B的公钥,对其加密,发送给服务器。
  6. B用私钥解开信息,得到随机的字符串(对称密钥),利用这个密钥作为之后的通信密钥。
  7. 客户端向服务器发出信息,指明后面的数据使用该对称密钥进行加密,同时通知服务器SSL握手结束。
  8. 服务器接收到信息,使用对称密钥通信,通知握手接收。
  9. SSL握手结束,使用对称密钥加密数据。

6、证书标准和编码格式

X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容,其详情可以参考RFC5280,SSL使用的就是这种证书标准。
同样的X.509证书,可能有不同的编码格式,目前有以下两种编码格式:
1)PEM - Privacy Enhanced Mail,打开看文本格式,以”—–BEGIN…”开头, “—–END…”结尾,内容是BASE64编码。
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
Apache和*NIX服务器偏向于使用这种编码格式.
2)DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.
查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式。

7、文件扩展名

1)CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,大多数应该是PEM编码。
2)CER - 还是certificate,还是证书,常见于Windows系统,大多数应该是DER编码。
3)KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样可能是PEM,也可能是DER。
查看KEY的办法:openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der
4)CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息)。
5)PFX/P12 - predecessor of PKCS#12,对*nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个”提取密码”,你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX使用的时DER编码。
6)JKS - 即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫”keytool”的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS。

8、获得证书

1)向权威证书颁发机构申请证书(例如:CA)
把csr交给权威证书颁发机构,权威证书颁发机构对此进行签名,完成.保留好csr,当权威证书颁发机构颁发的证书过期的时候,你还可以用同样的csr来申请新的证书,key保持不变。
2)生成自签名的证书
利用openssl 或keytool工具都可以生成自签名,后面会讲如何使用keytool生成自签名证书。

三、自签名数字证书获取流程

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请(CA收费)。
Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件(也叫:密钥库或证书库)中。

1.先制作一个根证书(用于签发服务证书)
这里写图片描述

keytool -genkey -v -alias tomcat -keyalg RSA -keystore E:\tomcat.keystore -validity 36500

命令解析:生成一对RSA非对称密钥和一个自签名证书。以别名tomcat存储在tomcat.keystore中,“E:\tomcat.keystore”含义是将根证书文件的保存路径,证书文件名称是tomcat.keystore;“-validity 36500”含义是证书有效期,36500表示100年,默认值是90天;“tomcat”为自定义证书名称。

2.生成一个CSR文件
如果需要向CA等机构申请证书,就需要生成CSR文件,并将此文件提交给相应CA机构申请CA证书。

keytool -certReq -alias tomcat -keystore E:\tomcat.keystore -file E:\ca.csr -storepass 123456

命令解析:在tomcat.keystore文件中从别名为tomcat 中取出公钥和持有者信息生成证书请求,并写入到ca.csr文件中。然后使用这个csr文件向CA结构申请数字证书,CA会使用CA私钥加密CSR文件中的公钥和一些相关信息一起加密,生成”数字证书”。如图

3.生成CER文件

keytool -export -alias tomcat -keystore E:\tomcat.keystore -file E:\tomcat.cer -storepass 123456

命令解析:在tomcat.keystore文件中从别名为tomcat 中取出公钥和持有者信息生成证书请求,并写入到ca.cer文件中。这就是一个自签名证书。
因为生成的证书使用keytool生成的,没有经过操作系统可信任的CA机构颁发,所以当用浏览器访问时,会出现不信任证书警告,我们手工将cer文件(服务端公钥)导入浏览器的证书列表,让其信任。

四、总结

https请求过程:
1)服务器 用RSA生成公钥和私钥
2)把公钥放在证书里发送给客户端,私钥自己保存
3)客户端首先向一个权威的服务器检查证书的合法性,如果证书合法,客户端产生一段随机数,这个随机数就作为通信的密钥,我们称之为对称密钥,用公钥加密这段随机数,然后发送到服务器
4)服务器用私钥解密获取对称密钥,然后,双方就已对称密钥进行加密解密通信了

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值