数字证书原理逻辑链条:html
问题就变成了:客户端如何拿到服务商的公钥? ==> 服务商的公钥如何安全的在网络上传输呢?==> 服务商不直接分发公钥,而是分发经CA私钥加密过的数字证书(包含公钥+服务商域名等信息)。客户端持有CA的公钥,解密后拿到服务商的公钥。java
从概念上来说,数字证书是用来验证网络通讯参与者的一个文件。这和学校颁发 给学生的毕业证书相似。在学校和学生之间,学校是可信第三方 CA,而学生是通讯 参与者。若是社会广泛信任一个学校的声誉的话,那么这个学校颁发的毕业证书,也 会获得社会承认。参与者证书和 CA 证书能够类比毕业证和学校的办学许可证。nginx
CA的公钥如何安全的在网络上传输呢?给CA 也颁发证书,而后你们都无条件信任root CA,在操做系统、浏览器发布的时候便嵌入了root CA。算法
就比如谍报战里的接头戏码浏览器
证书有什么,Chrome能够经过”settings ==> advanced setting ==> https/ssl ==> 管理证书” 查看证书内容。证书基本上是一个文本文件。安全
如何验证证书?我拥有ca的公钥,对证书上的信息作一个签名, 解密证书上的签名,比对。服务器
结论,证书是可信的,那么证书上的内容,尤为是服务商的公钥是可信的。就好像,毕业证上学校公章是可信的,那么能够相信这个学生的学历是可信的。网络
大多数时候,本地只要有经常使用的ca根证书,便可验证大部分服务商。证书被验证可信后,浏览器或操做系统会将证书存储在本地(证书有效期内),当用户在浏览器中键入https地址时,直接开始同服务端商定对称算法和密钥,从而省去证书的获取和验证过程。ssh
可是,当服务商证书不在Java 的 cacerts 文件中,或者没法经过ca证书链式推导,咱们也能够手动添加。工具
添加方式
浏览器保存了一个经常使用的 CA 证书列表,与此相似的,操做系统也同样保存有一份可信的证书列表。
证书的格式
CA 在发布证书时,经常使用 PEM 格式,这种格式的好处是纯文本,内容是 BASE64 编码的,另外还有比较经常使用的二进制 DER 格式,在 Windows 平台上较常使用的 PKCS#12 格式等等。固然,不一样格式的证书之间是能够相互转换的。
在 Java 平台下,证书经常被存储在 KeyStore 文件中,上面说的 cacerts 文件就是一个 KeyStore 文件(KeyStore 只是一种文件格式,java中使用keyStore文件存储加密相关的数据,证书是其中一种)。存储在 KeyStore 文件中的对象有三种类型:Certificate、PrivateKey 和 SecretKey 。
KeyStore 文件根据用途,也有不少种不一样的格式:JKS、JCEKS、PKCS十二、DKS 等等。
java中的keyStore文件根据用途,分为两类:keyStore、TrustStore,对应两个类 KeyManager 和 TrustManager。前者负责管理本身的私钥等数据,后者负责存储一些可信任的证书。能够想见,若是咱们改写 TrustManager 类,让其不管什么时候都返回true,便可绕过对证书的验证。
文件后缀 | 备注 | |
---|---|---|
证书签名请求(Certificate signing request) | *.csr |
包含域名、国家、城市、公司、邮箱等信息 |
私钥(Private Key) | *.key |
|
证书(Certificate) | *.cer ,*.crt |
CA 使用其私钥对 csr签名生成crt |
至于pem和der(少见)是编码方式,以上三类(Cert,Key,CSR)都可以使用这两种编码方式。
*.pem
- base64编码*.der
- 二进制编码基于OpenSSL自建CA和颁发SSL证书
假设本身的nginx 对外提供https支持
因此呢,有一个PKI(Public Key Infrastructure)的概念,中文称做公钥基础设施。它提供公钥加密和数字签名服务的系统或平台,好比ca系统,浏览器和操做系统内置一些经常使用ca证书。经过协议和机制的约定,实现公钥的可信分发,进而创建起一个安全的网络环境。而数字证书最多见的格式是 X.509 ,因此这种公钥基础设施又称之为 PKIX 。
而在大公司内部,一般会创建私有的ca和pki体系。
SSH原理与运用(一):远程登陆
密码登录
若是嫌每次登录输密码麻烦,能够公钥登录
SSL/TLS 四次握手
总结一下https设计到的一些加密知识
上文提到的都是单向非对称加密,对于安全性很高的场景(好比网银), 不只客户端要验证服务端的合法性,服务端也要验证每一个访问的客户端的合法性,对于这种场景,每每给每一个用户发一个U盘,里面装的就是客户端的公钥和私钥对,用于双向非对称加密。
相关阅读