数字证书、签名究竟是什么?这篇文章讲得太好了

你们好,我是明哥。html

前段时间整理了关于数字证书和数字签名的一些内容,今天整理一下发出来。node

咱们都知道 HTTP 协议都是明文传输内容,为了保证数据传输的安全,HTTPS 协议就应运而生了,但它其实并非一个全新的协议,而是HTTP 协议基本之上 再加上SSL/TLS 协议。python

所以当你访问一个支持 https 的网站时,是须要先进行 SSL/TLS 握手创建链接的。算法

image.png

SSL/TLS 握手的目的是为了 安全 地协商出一份对称加密的密钥,有了这个密钥以后,后续的数据所有使用这个密钥进行加密。apache

这个过程其实挺有趣的,涉及到的知识点,专业名词也不少,好比对称加密,非对称加密,信息摘要,数字签名,数字证书,公钥和私钥。本篇文章,会详细地介绍这些极易混淆的专业名词。windows

在讲解以前,我先给你提出几个摸底问题,若是你已经还不可以熟练回答,那么本篇文章会给你答案:浏览器

一、 对称加密和非对称加密,各有什么优缺点?安全

二、对称加密和非对称加密,是排他关系吗?是否能够搭配使用?服务器

三、摘要和加密有什么区别?有了摘要算法为何还要有加密算法?网络

四、如何在通讯时同时作到保密性、高效性?

五、如何申请数字证书?证书分为哪几种?SSL 证书如何部署?

六、完整说下证书申请、证书签发、证书下发客户端、客户端验证证书、数据加密传输的整个流程?

1. 对称加密与非对称加密

对称加密

对称加密是通讯双方共同拥有一把密钥。

这把密钥能够把明文加密(encryption)成密文,也能够把密文解密(decryption)成明文。

常见的对称加密算法有AES、DES、RC4,其中最经常使用的是AES。

对称加密的优势是:速度快。

同时也有一个缺点,就是不那么安全,一旦你的密钥被别人窃取了,全部的数据就会在网络的世界里裸奔。

非对称加密

与 对称加密相对的是 非对称加密

通讯双方持有不一样的密钥。

服务端的密钥,称之为 私钥(private key),客户端的密钥,称之为 公钥(public key)。

他们两者的区别是:

一、私钥应仅在服务端保存,毫不可泄露。而公钥能够存在于任何的客户端,即便***拿到了也没有关系。

二、公钥加密的密文只有相对应的私钥才能解密

image.png

三、私钥加密的内容,全部与之相对应的公钥都能解密。

四、私钥一般用来生成签名,公钥用来验证签名。

image.png

五、公钥和私钥是相对的,二者自己并无规定哪个必须是公钥或私钥。这意味着,公钥只要不对外公开,那就能够作为私钥,私钥公开后也能够作为公钥。

典型的非对称加密算法有 RSA 。

非对称加密的优势,就是安全系数特别高。缺点就是速度会慢一些。

对称与非对称加密结合

当客户端收到的公钥是准确的时候,通讯就是安全的。

由于用正确公钥加密过的密文,只有服务端的私钥能解。

那么如何保证,客户端收到正确的公钥呢?

答案是:经过非对称加密来协商对称加密的密钥,服务端一旦把正确的公钥安全地送达到客户端后,后续的通讯,为了保证高效通讯,再采用对称加密来加密数据。

具体的过程,后面会更加详细的阐述这一过程。

2. 摘要、签名、证书是啥?

信息摘要

一段信息,通过摘要算法获得一串哈希值,就是摘要(dijest)。

常见的摘要算法有MD五、SHA一、SHA25六、SHA512等。

关于摘要,有几点须要你明白的:

一、摘要算法,是把任意长度的信息,映射成一个定长的字符串。

二、摘要算法,两个不一样的信息,是有可能算出同一个摘要值的。

三、摘要算法与加密算法不一样,不存在解密的过程。

四、摘要算法不用于数据的保密,而是用于数据的完整性校验。

数字签名

摘要通过私钥的加密后,便有了一个新的名字 -- 数字签名

签名 是在发送方,这是一个加密的过程。

验签 是在接收方,这是一个解密的过程。

那搞懂数字签名的意义是什么?只要回答下面两个问题便可。

第一个问题,有了信息摘要,为什么还要有数字签名?

答:信息摘要,虽然也不可逆,但却容易却被伪造。因此信息摘要只用于校验完整性,而要保证信息摘要的正确性,就要依靠数字签名啦。

数字签名的签名和验签是非对称加密,其余人除非拿到私钥,否则无法伪造。

第二个问题,为何不对内容直接加密,而是对摘要进行加密。

答:由上面咱们知道了非对称加密的速度很是慢,若是传输的数据量很是大,那这个加密再解密的时间要远比网络传输的时间来得长,这样反而会得不偿失。

若是咱们对传输的内容只有完整性要求,而安全性没有要求(意思是传输的内容被人知道了也不要紧)。那就能够对摘要进行加密,到客户端这里解密后获得摘要明文,再用这个摘要明文与传输的数据二次计算的摘要进行比较,若一致,则说明传输的内容是完整的,没有被篡改。

数字证书

在数字签名那里,不知道你有没有发现一个问题?

数字签名是非对称加密,服务端有一个私钥,客户端一个公钥,只有这两个对上了验签。

那假如说你(客户端)拿到的公钥并非服务端给的呢,而是***塞给你的呢?而你却把这个假公钥当成真的,那么当你使用这个假公钥加密一些敏感信息时,***就能够截取你的这段信息,因为这信息是用***本身的公钥加密的,这样一来,***拿本身的私钥就能解密获得你的敏感信息。

这就是问题所在。

要解决这个问题,其实只要保证『公钥』是可信的。只有服务端发给你的公钥你才能拿,而坏人给你的公钥,你要懂得识别并丢弃它。image.png

数字证书就应运而生了。

要理解数字证书,一样只要搞懂两个问题便可。

  1. 数字证书是什么东西?其实它就是一个 .crt 文件

  2. 数字证书是谁颁发的?由权威证书认证机构颁发,通常咱们简称为 CA 机构

  3. 数字证书如何申请的?或者说如何颁发的?

为了让你理解这一过程,我画了下面这张图:

image.png

一、在本身的服务器上生成一对公钥和私钥。而后将域名、申请者、公钥(注意不是私钥,私钥是不管如何也不能泄露的)等其余信息整合在一块儿,生成.csr 文件。

二、将这个 .csr 文件发给 CA 机构,CA 机构收到申请后,会经过各类手段验证申请者的组织信息和我的信息,如无异常(组织存在,企业合法,确实是域名的拥有者),CA 就会使用散列算法对.csr里的明文信息先作一个HASH,获得一个信息摘要,再用 CA 本身的私钥对这个信息摘要进行加密,生成一串密文,密文便是所说的 签名。签名 + .csr 明文信息,便是 证书。CA 把这个证书返回给申请人。

3. 数字证书(Certificate)

在HTTPS的传输过程当中,有一个很是关键的角色--数字证书,那什么是数字证书?又有什么做用呢?

所谓数字证书,是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥建立的签名请求文件作的签名(盖章),表示CA结构对证书持有者的承认。

3.1 数字证书拥有如下几个优势

  • 使用数字证书可以提升用户的可信度;

  • 数字证书中的公钥,可以与服务端的私钥配对使用,实现数据传输过程当中的加密和解密;

  • 在认证使用者身份期间,使用者的敏感我的数据并不会被传输至证书持有者的网络系统上;

2.2. 证书类型

x509的证书编码格式有两种:

  1. PEM(Privacy-enhanced Electronic Mail)是明文格式的,以 -----BEGIN CERTIFICATE-----开头,以-----END CERTIFICATE-----结尾。中间是通过base64编码的内容,apache须要的证书就是这类编码的证书.查看这类证书的信息的命令为: openssl x509 -noout -text -in server.pem。其实PEM就是把DER的内容进行了一次base64编码

  2. DER是二进制格式的证书,查看这类证书的信息的命令为: openssl x509 -noout -text -inform der -in server.der

2.3. 扩展名

  • .crt证书文件,能够是DER(二进制)编码的,也能够是PEM(ASCII (Base64))编码的),在类unix系统中比较常见;

  • .cer也是证书,常见于Windows系统。编码类型一样能够是DER或者PEM的,windows下有工具能够转换crt到cer;

  • .csr证书签名请求文件,通常是生成请求之后发送给CA,而后CA会给您签名并发回证书

  • .key通常公钥或者密钥都会用这种扩展名,能够是DER编码的或者是PEM编码的。查看DER编码的(公钥或者密钥)的文件的命令为: openssl rsa -inform DER -noout -text -in xxx.key。查看PEM编码的(公钥或者密钥)的文件的命令为: openssl rsa -inform PEM -noout -text -in xxx.key;

  • .p12证书文件,包含一个X509证书和一个被密码保护的私钥

2.4 证书的种类

安全证书主要分为DV、OV和EV三个种类,对应的安全等级为通常、较好和最高三个等级。三者的审核过程、审核标准和对应的域名数量也不一样,因此价格在一两百元到几万元不等。

DV SSL

DV SSL证书是只验证网站域名全部权的简易型(Class 1级)SSL证书,可10分钟快速颁发,能起到加密传输的做用,但没法向用户证实网站的真实身份。

目前市面上的免费证书都是这个类型的,只是提供了对数据的加密,可是对提供证书的我的和机构的身份不作验证。

OV SSL

OV SSL,提供加密功能,对申请者作严格的身份审核验证,提供可信×××明。

和DV SSL的区别在于,OV SSL 提供了对我的或者机构的审核,能确认对方的身份,安全性更高。

因此这部分的证书申请是收费的~

EV SSL

超安=EV=最安全、最严格 超安EV SSL证书遵循全球统一的严格身份验证标准,是目前业界安全级别最高的顶级 (Class 4级)SSL证书。

金融证券、银行、第三方支付、网上商城等,重点强调网站安全、企业可信形象的网站,涉及交易支付、客户隐私信息和帐号密码的传输。

这部分的验证要求最高,申请费用也是最贵的。

选择签发机构时,最好选择行业承认的全球范围内均可以使用的ca机构签发的证书。目前咱们国内的证书可以符合标准的还不是特别多,主要缘由是有一些证书不可以被国外的浏览器所承认,在使用的时候须要进行必定的额外操做。

根据保护域名的数量,SSL证书又分为:

单域名版:只保护一个域名,例如 www.abc.com 或者 login.abc.com 之类的单个域名

多域名版:一张证书能够保护多个域名,例如同时保护 www.abc.com , www.bcd.com, pay.efg.com 等

通配符版:一张证书保护同一个主域名下同一级的全部子域名,不限个数,形如 *.abc.com 。注意,通配符版只有 DVSSL 和 OVSSL 具备, EVSSL 不具备通配符版本。

2.5 证书在哪里

当你在下载并安装浏览器时,浏览器内部其实已经内嵌了全世界公认的根证书颁发机构的证书。

若一个网站的数字证书的证书颁发机构在浏览器中没有,则须要引导用户自行导入。

若是你想在 Chrome 中查看有哪些受信任的证书颁发机构,能够点击 设置 -> 隐私设置与安全性 -> 安全 -> 管理证书

image.png

2.6 证书里的信息

在上图的位置里,随便双击点开一个证书,就能够查看证书里的内容。

内容很是多,最主要的有

  • 证书是哪一个机构的?

  • 证书里的公钥是什么?

  • 证书有效期是何时?

  • 采用的哪一种加解密的算法?

2.7 证书吊销

证书是有生命周期的,若是证书的私钥泄漏了那这个证书就得吊销,通常有两种吊销方式:CRL和OCSP。

CRL( Certificate Revocation List)是CA机构维护的一个已经被吊销的证书序列号列表,浏览器须要定时更新这个列表,浏览器在验证证书合法性的时候也会在证书吊销列表中查询是否已经被吊销,若是被吊销了那这个证书也是不可信的。能够看出,这个列表随着被吊销证书的增长而增长,列表会愈来愈大,浏览器还须要定时更新,实时性也比较差。

因此,后来就有了 OCSP (Online Certificate Status Protocol)在线证书状态协议,这个协议就是解决了 CRL 列表愈来愈大和实时性差的问题而生的。有了这个协议,浏览器就能够不用按期更新CRL了,在验证证书的时候直接去CA服务器实时校验一下证书有没有被吊销就能够,是解决了CRL的问题,可是每次都要去CA服务器上校验也会很慢,在网络环境较差的时候或者跨国访问的时候,体验就很是差了,OCSP虽然解决了CRL的问题可是性能却不好。

若是你想了解更多关于证书的内容,能够前往华为云的公开文档进行学习:https://support.huaweicloud.com/scm_faq/scm_01_0020.html

4. 如何生成 CSR 文件

CSR是Certificate Signing Request的英文缩写,即证书签名请求文件。

当申请者申请数字证书时,CSP(加密服务提供者)生成私钥,同时也生成了CSR文件。申请者将CSR文件提交至Certificate Authority (CA)机构后,CA机构使用其根证书私钥签名,从而就生成了数字证书。

申请者经过CSR文件,向CA机构申请数字证书。获取证书后,就能证实申请者的网站是可信的,数据传输是加密的。

接下来来了解一下,CSR 文件是如何生成的?

使用 OpenSSL 生成

假设申请的域名为 python.iswbm.com,公司名称为派森时光科技,部门是IT部,公司在中国广东省深圳市。可经过运行下方命令行生成CSR文件:

$ openssl req -new –SHA256 -newkey rsa:2048 -nodes -keyout python.iswbm.com.key -out python.iswbm.com.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=派森时光科技/OU=IT/CN=python.iswbm.com"

此命令行表示:

  • req参数:表示证书请求request,用于生成CSR文件。

  • SHA256参数:表示CSR签名时用的摘要算法。

  • newkey参数:表示指定证书的算法。参数 2048:表示密钥对的长度。

  • nodes参数:表示不对私钥加密。

  • keyout参数:表示生成的私钥文件。名为iswbm.key的私钥文件,需自行保管,用于获取证书后的部署过程。

  • out参数:表示生成的 CSR 文件。名为iswbm.com.csr的CSR文件,用于提交至CA机构验证信息,从而获取证书。

  • subj参数:表示CSR信息,具体有哪些参数,能够继续往下看。

subj参数说明:

  • C:Country,表示国家,申请者或申请企业所在国家的英文或两位大写国家代码。如:CN

  • ST:State/Province,表示省份,申请者或申请企业所在地的省/市/自治区英文或拼音全称。如:Guangdong

  • L:Locality,表示城市,申请者或申请企业所在城市的英文或拼音全称。如:Shenzhen

  • O:Organization,表示申请者的姓名或申请企业的名称。

  • OU:Organizational Unit,表示申请人所在部门的英文或拼音全称。如:IT

  • CN:Common Name,表示你要为哪一个域名申请证书,但是单域名(好比 python.iswbm.com),也能够是泛域名(*.iswbm.com),也能够是为多个域名申请一个证书(具体我没操做过)。

上一条命令执行完后,会在你的本地目录下生成两文件

  • python.iswbm.com.csr:用于向CA机构申请证书

$ cat python.iswbm.com.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIC0TCCAbkCAQAwgYsxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ2Rvbmcx
ETAPBgNVBAcMCFNoZW56aGVuMS0wKwYDVQQKDCTDpsK0wr7DpsKjwq7DpsKXwrbD
...
7lgB4QC1aIFz8gi9TGMJU2LqTDJCj+tgM68LDBdMLeQ8XZ33C95Nl0qt7yG+zjlZ
01jBh+T882r8x9gKdwb7nZSWFQY4/YTq+sY++YW/QuCNRcJ2vbM18U/HlIRsZ3su
x6Neh08=
-----END CERTIFICATE REQUEST-----
  • python.iswbm.com.key:私钥,自行保存,不要外泄

$ cat python.iswbm.com.key
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC4OrcM9hTs9Hao
SzjsVJFX2Mmd+mToMG3u++o2Fd5yrPYq4COkT33lnL9kJNrDWqGp5TRkWqNwLaPl
...
a/lKBWLcvxE+IQ+mxNbN058kEJ3l8WAcAFCebLm5czUqmIVa3JR+cBDLvGFZVn6z
72AP5D/Evds4BOO+VzAiVLU6Ai78qhACuVExZNQCxdvJy4LxpeckUpCem9hAPiIY
LQfiTStBBU6t/+mnDyij+XreGQ==
-----END PRIVATE KEY-----

使用在线生成工具

使用 OpenSSL 工具生成 CSR 文件的方法当然简单,但使用时,须要你的了解代码中参数的意思。

若是你不想花心思去记这些,推荐你使用  CSR在线生成工具(https://myssl.com/csr_create.html)

你只需简单地输入以下信息,再点击 OpenSSL生成,你就能够得到一条 OpenSSL 命令,这下你不再用本身拼凑参数啦,真的太方便了。为何不点击 生成 让其直接生成 私钥文件 和 CSR文件 呢?固然是为了安全起见啦。

image.png

5. TLS/SSL 保证信息的安全

在信息安全性问题中,咱们经常要作到三点才能保证信息的安全:

  1. 信息的保密性

  2. 信息的完整性

  3. 身份识别

将这三者结合起来,就是 TLS/SSL 作的事情

image.png

一、客户端(浏览器)向服务端发出请求,服务端返回证书给客户端。

二、客户端拿到证书后,把证书里的签名与及明文信息分别取出来,而后会用自身携带的CA机构的公钥去解密签名,而后信息摘要1,而后再对明文信息进行HASH,获得一个信息摘要2,对比信息摘要1 和信息摘要2,若是同样,说明证书是合法的,也就是证书里的公钥是正确的。

以上采用的是非对称加密(CA的公钥和私钥),保证了客户端接收到服务端正确的公钥,有了服务端的公钥后,后面的信息加密均可以使用这个公钥,而用这个公钥加密事后的密文,只有服务端的私钥能解,就算***拿到了也无法解开。

相关文章
相关标签/搜索