Https 协议解析

1 概述
1.1 HTTPS
    使用SSL协议,对HTTP协议通信过程中的明文数据加密,这就是HTTPS。网络分层结构如下:

    SSL协议负责数据加密,解密,位于HTPP协议和TCP协议之间。
    客户端和服务器端使用HTTPS通信的时候,分为两个阶段:SSL握手阶段和HTTPS正式通信阶段。
1.2 对称加密
    对称加密只有一个密匙,使用该密匙加密和解密数据。
    客户端和服务器端,在使用HTTPS协议通信阶段,数据使用对称加密算法。
    流行的对称加密算法包括:DES,RC2,RC4,Triple-DES。
1.3 非对称加密
    非对称加密有两个密匙,分别是私匙和公匙。公钥与私钥是一对,如果用公钥对数据进行加密,只有使用对应的私钥才能解密;如果使用私钥对数据进行加密,只有使用对应的公钥才能解密。
    客户端和服务器端,在HTTPS协议的SSL握手阶段,使用非对称加密算法。
    流行的非对称加密算法包括:RSA,DSA,ECC/ECDH/ECDSA等。
2 HTTPS交互过程
    HTTPS的交互过程分为两个阶段:SSL握手阶段,和正式通信阶段。过程如下:

    当客户端与服务器端第一次通信的时候,浏览器将它支持的加密算法列表发送给服务器。服务器在加密算法列表中选择一个加密算法,然后将服务器自己的证书,以及一个hash算法返回给浏览器。
浏览器收到服务器的证书以后,需要执行证书验证。如果通过证书验证,表示证书合法;如果没有通过证书验证,那么会弹出一个对话框,提示该网址的根证书不受信任,有安全问题。
如果证书验证通过,或者用户选择信任该网站的证书,那么浏览器会生成一个随机数(该随机数将作为HTTPS通信阶段,对称加密的密匙)。然后使用证书中包含的公匙加密该随机数。使用随机数加密握手信息,使用服务器指定的hash算法hash握手信息。然后将这三部分信息传递给服务器。
服务器收到浏览器的信息后,使用私匙解密随机数;使用随机数解密握手信息,然后hash握手信息。最后对比浏览器传递过来的hash(握手信息)以及自己生成的hash(握手信息),如果两者相同。服务器将给浏览器返回如下两种信息:使用随机数加密的握手信息,以及hash(握手信息)。
浏览器收到服务器的信息后,使用随机数解密握手信息,然后对握手信息执行hash,最后与服务器传递过来的hash(握手信息)对比,如果两者相同,那么认为SSL握手成功。
当SSL握手成功后,使用上面生成的随机数,作为对称加密的密匙,双方可是通信。
浏览器和服务器互发加密的握手信息并验证的目的是保证双发获取到的密码一致,并可正常加密,解密。为后续真正的数据传输作一次测试。
整个HTTPS协议的过程中,使用了非对称加密算法和对称加密算法。非对称加密算法的目的就是为对称加密算法生成密匙。
3 CA及证书
    在SSL握手阶段,一个重要的要素就是公匙。通过使用证书,可确保加密传输数据的公匙不被篡改。证书用来证明公钥拥有者身份的凭证。
CA是颁发证书的组织结构,是可信机构,CA保证了由它所颁发的证书是没有被篡改过的。
证书分多级,包括:根证书,中级证书,以及三级证书。相应的CA结构也分多级,包括:RootCA,intermediates CAs。它们之间的关系如下图:

    Root CA颁发根证书,Insermediates CA颁发中级证书和三级证书。根证书用来保证中级证书没有被篡改;中级证书用来保证三级证书没有被篡改;三级证书用来保证,SSL握手过程中传递的公匙没有被篡改。
    在操作系统中,一般会内置多个根证书和中级证书,并根据需要安装三级证书。多级证书形成链式结构。
3.1 证书的内容
    当使用证书生成工具,如:keytool工具,或者openssl工具,会生成两个文件。xxx.keystore密码文件和xxx.cer证书文件。xxx.keystore文件中含有私钥,需要将其配置到服务器端;xxx.cer文件持有公钥,需要将其安装到客户端。
    在xxx.cer证书文件中,一般会包含如下内容:

  • 证书颁发机构名称,信息;
  • 证书有效期;
  • 证书所绑定的域名;
  • 证书所有者的名称,信息;
  • 证书所有者的公钥。

    在windows系统中,打开证书文件后,其内容如下图:

    证书签名的生成规则如下:
    对证书的明文信息执行hash,生成摘要信息;
    使用私钥加密摘要信息,生成证书的签名。
    如果证书是根证书,那么该证书的签名是自签名。即:使用自己的私钥加密摘要信息。如果证书是中级证书,或者三级证书,那么使用该证书的上级证书的私钥加密摘要信息,形成签名。
3.2 证书的颁发
    Root CA机构负责为Intermediates CA机构颁发证书,为Intermediates CA机构颁发的证书是中级证书。也就是说Intermediates CA机构持有中级证书。
在为Intermediates CA机构颁发中级证书之前,Root CA机构必须有自己的根证书。Root CA机构的证书是自签名证书。
在给Intermediates CA机构颁发证书的时候,Root CA机构会将自己的组织名称写入到中级证书中,并且用根证书的私钥中级证书的摘要信息,形成签名,也写入中级证书中。
Intermediates CA机构给下级Intermediates CA结构颁发证书的流程也是如此:将自己的组织机构名称写入下级证书;用自己的私钥加密下级证书的摘要信息,作为下级证书的签名。
    其关系如下图所示:

    由上图可见,下级证书持有上级证书的名称,并持有由上级证书生成的签名。

3.3 证书验证
    当SSL握手的时候,服务器端会将自己的证书传递给浏览器,浏览器需要验证证书的有效性,其流程如下:

    整个验证过程分两部分:查找上级证书和逐级向下验证两个过程。在第一过程中,根据当前证书持有的上级CA机构的名称,在操作系统的证书链中,查找上级CA机构的证书。一直递归该过程,直到找到根证书。
    当找到根证书后,用根证书的私钥解密下级证书的签名,形成摘要信息。同时使用hash算法,将下级证书的明文信息作hash处理,生成另外一份摘要信息。对比两份摘要信息,如果相同,那么证明该下级证书有效,可信。
    当验证完证书链中所有的证书后,就可证明服务器传递过来的三级证书是有效,可信的。使用该三级证书的公钥加密浏览器生成的随机数,作为对称加密的密码,再次传递到服务器端。服务器端使用私钥解密该随机数,获得对称加密的密码。通过这个过程,客户端、服务器端就持有了对称加密的密码,可使用该密码正式通信。
3.5 生成证书
    可使用jdk的工具KeyTool生成证书。生成证书分两步:创建证书,导出证书。由此方式生成证书是自签名的根证书。
3.5.1 创建证书
    执行如下命令,会创建证书:
    

keytool -genkey -alias lifeng -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore d:/tomcat.keystore -storepass 123456

    各参数解释如下:
        -genkey 表示要生成一个证书,该证书包含私匙。创建方自己使用,一般配置大tomcat服务器上。
        -alias 给证书起别名,随意
        -keypass 访问证书内条目的时候所需要的密码;
        -storepass 访问证书文件所需要的秒;
        -keyalg 生成证书的算法
        -keysize 证书密码的大小
        -keystore 生成的证书文件名称,以及保存位置。
    当执行该命令后,会有一些列交互,分别如下:

    当完成该命令后,会在指定的路径生成一个名为tomcat.keystore的证书文件,该文件持有公钥和私钥。需要将该文件配置到服务器上。

3.5.2 导出证书
    需要从前面生成tomcat.keystore文件中,将公钥导出,形成证书。执行如下命令,会导出证书:

keytool -export -keystore d:/tomcat.keystore -file d:/server.cer -storepass 123456 -keypass 123456 -alias lifeng

    该命令执行成功后,会在指定的位置,生成一个名称为server.cer的证书文件。将该文件导入到客户端浏览器即可。

4 证书安装
4.1 服务器端证书安装
    在tomcat的<connector>配置节,执行如下配置:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile="你的keystore路径" keystorePass="生成证书时的口令" />

    配置属性解释如下:
clientAuth 如果设为true,表示Tomcat要求所有的SSL客户出示安全证书,对SSL客户进行身份验证
keystoreFile 指定keystore文件的存放位置,可以指定绝对路径,也可以指定相对于 (Tomcat安装目录)环境变量的相对路径。如果此项没有设定,默认情况下,Tomcat将从当前操作系统用户的用户目录下读取名为 “.keystore”的文件。
    keystorePass 密钥库密码,指定keystore的密码。(如果申请证书时有填写私钥密码,密钥库密码即私钥密码,否则填写密钥库密码文件中的密码)
sslProtocol 指定套接字(Socket)使用的加密/解密协议,默认值为TLS
4.2 客户端证书安装
    在windows系统中,点击证书文件,打开如下图所示的界面:

    点击“安装证书”按钮,将打开证书导入向导对话框,一路下一步操作,直到完成。
在使用HTTPS通信的时候,如果客户端没有安装证书,或者证书不可信,会弹出告警信息。根据实际情况,可选择信任此证书,继续通信;或者终止通信。
5 SSL卸载
    由于非对称加密会损耗大量服务器性能,所以提供了单独的硬件设备,用来处理SSL握手,以及http通信加密,解密。将密文的https数据转换成明文的http过程,被称为SSL卸载。如下图所示:

    SSLGW是特定的加密,解密设备,将https协议转换为http协议。SSLGW后面对应的是企业私网,可保证通信安全。
6 其他
6.1 证书的分类
    证书有多重类型,负责HTTPS通信的服务器证书只是其中一种。证书的主要类型包括:个人身份证书、企业或机构身份证书、支付网关证书、服务器证书、安全电子邮件证书、个人代码签名证书,这些数字证书特点各有不同。
    个人身份证书
    符合 X.509 标准的数字安全证书,证书中包含个人身份信息和个人的公钥,用于标识证书持有人的个人身份。数字安全证书和对应的私钥存储于 E-key 中,用于个人在网上进行合同签定、定单、录入审核、操作权限、支付信息等活动中标明身份。
    企业或机构身份证书
    符合 X.509 标准的数字安全证书,证书中包含企业信息和企业的公钥,用于标识证书持有企业的身份。数字安全证书和对应的私钥存储于 E-key 或 IC 卡中,可以用于企业在电子商务方面的对外活动,如合同签定、网上证券交易、交易支付信息等方面。
    支付网关证书
    支付网关证书是证书签发中心针对支付网关签发的数字证书,是支付网关实现数据加解密的主要工具,用于数字签名和信息加密。支付网关证书仅用于支付网关提供的服务(Internet 上各种安全协议与银行现有网络数据格式的转换)。支付网关证书只能在有效状态下使用。支付网关证书不可被申请者转让。
    服务器证书
    符合 X.509 标准的数字安全证书,证书中包含服务器信息和服务器的公钥,在网络通讯中用于标识和验证服务器的身份。数字安全证书和对应的私钥存储于 E-key 中。服务器软件利用证书机制保证与其他服务器或客户端通信时双方身份的真实性、安全性、可信任度等。
企业或机构签发给软件提供商的数字证书,包含软件提供商的身份信息、公钥及 CA 的签名。软件提代码签名证书

    安全电子邮件证书
符合 X.509 标准的数字安全证书,通过 IE 或 Netscape 申请,用 IE 申请的证书存储于 WINDOWS 的注册表中,用 NETSCAPE 申请的存储于个人用户目录下的文件中。用于安全电子邮件或向需要客户验证的 WEB 服务器(https 服务) 表明身份。
    个人代码签名证书
    个人代码签名证书是 CA 中心签发给软件提供人的数字证书,包含软件提供个人的身份信息、公钥及 CA 的签名。软件提供人使用代码签名证书对软件进行签名后放到 Internet 上,当用户在 Internet 上下载该软件时,将会得到提示,从而可以确信:软件的来源;软件自签名后到下载前,没有遭到修改或破坏。代码签名证书可以对 32-bit .exe 、 .cab 、 .ocx 、 .class 等程序和文件进行签名。
从数字证书的技术角度分,CA中心发放的证书分为两类:SSL证书和SET证书。一般地说,SSL 证书(安全套接层)是服务于银行对企业或企业对企业的电子商务活动的;而SET(安全电子交易)证书则服务于持卡消费、网上购物。虽然它们都是用于识别身份和数字签名的证书,但它们的信任体系完全不同,而且所符合的标准也不一样。

原文地址:https://www.cnblogs.com/wolf-lifeng/p/11159100.html