ssl证书是什么东西

栏目: 编程工具 · 发布时间: 7年前

内容简介:ssl证书是什么东西

简介

Java 和 HTTP 的那些事(四) HTTPS 和 证书

加密

总结一下https设计到的一些加密知识

  1. 哈希,将任意长度的数据转化为固定长度的,验证数据是否被篡改
  2. 对称加密,加密和解密使用同一个密钥,对称加密的优点是速度快,缺点是密钥管理不方便,必须共享密钥
  3. 非对称加密,缺点是速度慢,优点是密钥管理很方便
  4. 数字证书,提供可信的服务商公钥

安全的通信有以下要求

  1. 通信双方可信
  2. 内容不被篡改
  3. 内容不可见

证书

数字证书原理

私钥 公钥
ca 一般浏览器安装时就有,存在ca根证书中
服务商 浏览器验证服务商证书有效后,从服务商证书中拿到服务商公钥
  1. 证书有什么,Chrome可以通过”settings ==> advanced setting ==> https/ssl ==> 管理证书” 查看证书内容。证书基本上是一个文本文件。

    • 服务商的公钥
    • 服务商的信息
    • 对上述信息算一个签名,用ca自己的私钥加密一下
  2. 我如何验证证书?我拥有ca的公钥,对证书上的信息做一个签名, 解密证书上的签名,比对。

    • 如果两个签名一样,签名一样,说明证书没被篡改
    • 签名可以用ca公钥正确解密,说明是用ca私钥加密的,即证书是ca颁发的

    结论,证书是可信的,那么证书上的内容,尤其是服务商的公钥是可信的。

逻辑链条:

  1. 首先,我要知道服务商是不是可信的
  2. 为了验证服务商的身份,要知道服务商的公钥。服务商发来的数据用公钥可以解密,说明服务商是可信的。前提:服务商私钥没泄漏;拿到的服务商公钥是可信的。
  3. 需要一个可信的服务商公钥,找服务商要么?
  4. 本地存有ca的公钥(绝对可惜),服务商那有ca给的证明,那服务商别给我公钥了(我也不知道真的假的),给我ca的证明吧(里面有服务商的公钥)。 这个ca的证明,就是为了提供可信的服务商公钥。
  5. 浏览器会尝试查CRL(证书吊销列表)和OCSP(在线证书检查),后者是前者的替代,即直接询问ca证书是否可信及在有效期内。但ca都在国外, 因为证书不可篡改,所以谁给都一样 (这一步待确认)
  6. 服务商可信了,但服务商的公钥谁都可以得到,服务商给我发的消息,别人虽然不能改,但也可以截获并解密。
  7. 我另搞一套对称加密,加密算法和密钥用服务商公钥加密,发给服务商,只有服务商的私钥才可以解密
  8. 大家从此用对称加密交流

证书的存储

浏览器保存了一个常用的 CA 证书列表,与此类似的,操作系统也一样保存有一份可信的证书列表。Java 在 JRE 的安装目录下也保存了一份默认可信的证书列表,可以使用 JRE 自带的 keytool 工具.

/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/jre/lib/security
---	cacerts

证书的格式

CA 在发布证书时,常常使用 PEM 格式,这种格式的好处是纯文本,内容是 BASE64 编码的,另外还有比较常用的二进制 DER 格式,在 Windows 平台上较常使用的 PKCS#12 格式等等。当然,不同格式的证书之间是可以相互转换的。

Java 平台下,证书常常被存储在 KeyStore 文件中,上面说的 cacerts 文件就是一个 KeyStore 文件(KeyStore 只是一种文件格式,java中使用keyStore文件存储加密相关的数据,证书是其中一种)。存储在 KeyStore 文件中的对象有三种类型:Certificate、PrivateKey 和 SecretKey 。Certificate 就是证书,PrivateKey 是非对称加密中的私钥,SecretKey 用于对称加密,是对称加密中的密钥。

KeyStore 文件根据用途,也有很多种不同的格式:JKS、JCEKS、PKCS12、DKS 等等。

java中的keyStore文件根据用途,分为两类:keyStore、TrustStore,对应两个类 KeyManager 和 TrustManager。前者负责管理自己的私钥等数据,后者负责存储一些可信任的证书。可以想见,如果我们改写 TrustManager 类,让其无论何时都返回true,即可绕过对证书的验证。

动态加载证书

大多数时候,本地只要有常用的ca根证书,即可验证大部分服务商。证书被验证可信后,浏览器或操作系统会将证书存储在本地(证书有效期内),当用户在浏览器中键入https地址时,直接开始同服务端商定对称算法和密钥,从而省去证书的获取和验证过程。

但是,当服务商证书不在Java 的 cacerts 文件中,或者无法通过ca证书链式推导,我们也可以手动添加。

  1. 12306之类的网站,证书基本可信,但不是向ca申请的
  2. 内部通信,证书自己生成,自己确认可信

添加方式

  1. 使用java keytool工具添加。有时候不具备权限,或要添加的机器过多
  2. 程序加载

这就是一些应用在使用时,要指定证书地址的缘故了。

  1. 应用作为服务端,client索要证书时,提供给client
  2. 应用作为客户端,直接加载服务端证书,以省去证书验证过程

ca和pki

所以呢,有一个PKI(Public Key Infrastructure)的概念,中文称作公钥基础设施。它提供公钥加密和数字签名服务的系统或平台,比如ca系统,浏览器和操作系统内置一些常用ca证书。通过协议和机制的约定,实现公钥的可信分发,进而建立起一个安全的网络环境。而数字证书最常见的格式是 X.509 ,所以这种公钥基础设施又称之为 PKIX 。

而在大公司内部,通常会建立私有的ca和pki体系。

根据tls的通信流程,如果内网的节点要彼此tls访问,且需双向验证,则

  1. 有一个私有的ca服务器
  2. 生成一对儿ca公钥私钥对,根据ca公钥生成一个ca证书
  3. 为每一个节点,生成公钥私钥对,基于ca证书生成对应节点证书
  4. 每个节点保有一份儿ca证书

tls通信过程中,节点作为服务端,则会分发自己的证书。作为客户端,则会索要服务端证书,并基于本机的ca证书进行验证。还有一种方案,每个节点不保有ca证书,而是直接保有其它节点的ca证书。实例参见 Docker Swarm中使用TLS

安装过hadoop的同学都知道,有一个过程是,将所有slave节点的公钥交给master节点,这里slave节点类似于服务端,master节点类似于客户端。只是hadoop分发的是公钥,tls分发的是证书(分发证书也是为了分发公钥)。


以上所述就是小编给大家介绍的《ssl证书是什么东西》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Docker——容器与容器云

Docker——容器与容器云

浙江大学SEL实验室 / 人民邮电出版社 / 2015-9-1 / 89.00元

本书从实践者的角度,在讲解Docker高级实践技巧的同时,深入到源代码层次,为读者梳理出Docker容器技术和基于Docker的容器云技术(如Kubernetes)的实现方法和设计思路,帮助读者理解如何在实际场景中利用Docker解决问题并启发新的思考。全书包括两部分,第一部分深入解读Docker容器技术,包括Docker入门、架构总览、Docker容器核心原理解读,以及Docker高级实践技巧;......一起来看看 《Docker——容器与容器云》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具