Http 和Https 简单分析

来源:互联网 发布:mac os x office 编辑:程序博客网 时间:2024/05/17 08:35

1.https 数据传递如何进行加密传递,如何解密。
2.http 三次握手,客户服务端在握手过程中进行那些交流
3.Https 如何进行配置
4.公钥/私钥/密钥/数字签名

转入正题:

一 OSI七层模型

OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型 ,是一个逻辑上的定义,一个规范,它把网络从逻辑上分为了7层。每一层都有相关、相对应的物理设备,比如路由器,交换机。OSI 七层模型是一种框架性的设计方法 ,建立七层模型的主要目的是为解决异种网络互连时所遇到的兼容性问题,其最主要的功能使就是帮助不同类型的主机实现数据传输。它的最大优点是将服务、接口和协议这三个概念明确地区分开来,通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯。

这里写图片描述

1.1 TCP/IP四层模型对应osi七层的关系

 ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。如图2-1所示,是TCP/IP参考模型和OSI参考模型的对比示意图。

对应关系

1.2  TCP/IP参考模型的层次结构 

  
  TCP/IP参考模型分为四个层次:应用层、传输层、网络互连层和主机到网络层。
  
对应关系

http://blog.csdn.net/superjunjin/article/details/7841099/

HTTP协议原理分析
http://blog.csdn.net/lmh12506/article/details/7794512
而我们关注的 Http 是应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。

1.3 在TCP/IP协议栈中的位置

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图所示:
这里写图片描述

我们都知道tcp/udp 属于传输层协议TCP(Transmission Control Protocol) 传输控制协议
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

6种标示:
SYN(synchronous建立联机)
ACK(acknowledgement 确认)
PSH(push传送)
FIN(finish结束)
RST(reset重置)
URG(urgent紧急)
Sequence number(顺序号码)
Acknowledge number(确认号码)

这里写图片描述

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;
第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。
完成三次握手,主机A与主机B开始传送数据。

而ssl/tsl的握手过程是客户端服务端双方进行数据加解密协商,双方身份认证的过程。
具体步骤比较繁琐,有兴趣的可以查看
http://www.cnblogs.com/zhuqil/archive/2012/10/06/ssl_detail.htm


二 ssl详解

而如何我们需要实现Https 请求服务器进行数据安全请求需要服务端和的客户端进行配合,只介绍客户端设置

SSLContext,负责证书管理和信任管理器的。

TrustManagerFactory 证书信任列表管理工厂

CertificateFactory 证书工厂

Pkcs The Public-Key Cryptography Standards (PKCS)

是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。

X.509证书

X.509 标准规定了证书可以包含什么信息,并说明了记录信息的方法(数据格式)

Https可以有证书也可以没有证书,我们来看这两种情况。

2.1 生成SSLContext对象

    SSLContext sslContext = SSLContext.getInstance("TLS");    // 从assets中加载证书    InputStream inStream = Application.getInstance().getAssets().open("srca.cer");    // 证书工厂    CertificateFactory cerFactory = CertificateFactory.getInstance("X.509");    Certificate cer = cerFactory.generateCertificate(inStream);    // 密钥库    KeyStore kStore = KeyStore.getInstance("PKCS12");    kStore.load(null, null);    kStore.setCertificateEntry("trust", cer);// 加载证书到密钥库中    // 密钥管理器    KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());    keyFactory.init(kStore, null);// 加载密钥库到管理器    // 信任管理器    TrustManagerFactory tFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tFactory.init(kStore);// 加载密钥库到信任管理器    // 初始化    sslContext.init(keyFactory.getKeyManagers(), tFactory.getTrustManagers(), new SecureRandom());return sslContext;

2.2 没有安全证书的SSLContext

  上面看到需要需要安全证书的生成SSLContext就可以了,然后不需要证书的请求,需要两个对象,一个是SSLContext(上面已经解释过了);另一个是HostnameVerifier,顾名思义就是主机名称匹配的意思,我们看代码。

public static SSLContext getSLLContext() {    SSLContext sslContext = null;    try {        sslContext = SSLContext.getInstance("TLS");        sslContext.init(null, new TrustManager[]{new X509TrustManager() {            @Override            public void checkClientTrusted(X509Certificate[] chain, String authType)  {}            @Override            public void checkServerTrusted(X509Certificate[] chain, String authType) {}            @Override            public X509Certificate[] getAcceptedIssuers() {                return new X509Certificate[0];            }        }}, new SecureRandom());    } catch (Exception e) {        e.printStackTrace();    }    return sslContext;}

 就这么简单,只需要传一个null证书管理器喝一个默认的信任管理器即可。
  下面再来看HostnameVerifier,既然是主机名称校验,那我们直接通过:

private static HostnameVerifier hostnameVerifier = new HostnameVerifier() {    @Override    public boolean verify(String hostname, SSLSession session) {        return true;}

 这个怎么用呢?Android原生代码用法中,获取SSLContext的方法名不一样,多了setHostnameVerifier,其它跟有安全证书的使用一致:

设置到请求的方法中(HttpClient 或者 HttpUrlConnection中) 如果要是使用的这两种方式请求的网络。

三 简单提一下公钥 私钥 密钥 数字签名

3.1 公钥和私钥

是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。
使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

3.2 密钥

密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥。
这里写图片描述

3.3 数字签名

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名是非对称密钥加密技术与数字摘要技术的应用。

0 0
原创粉丝点击