一文了解数字签名、数字证书、自签证书
参考
关于自签SSL证书的一些小知识汇总
对于ssl中的pem文件和key 文件的理解
openssl 生成证书 ca.pem client.pem server.pem
SSL:证书文件
数字证书原理
数字签名是什么?
数字签名和数字证书的原理解读(图文)
数字签名和数字证书有哪些区别与联系?
HTTPS 详解一:附带最精美详尽的 HTTPS 原理图
HTTPS详解二:SSL / TLS 工作原理和详细握手过程
密码学专题 序列号文件
一、数字证书与数字签名
通俗理解:
- 数字证书相当于【身份证】 —— 确认你是谁
- 依照《电子签名法》的规定,从事电子认证业务需要行政许可,经许可的第三方认证机构即为通常所称的CA机构,而经CA机构认证并与当事人主体相关联的字符串,就是“数字证书”,电子认证的过程也就是数字证书的申请与颁发过程。
- 用于确认身份
- 数字签名相当于【持身份证进行签名】—— 作用对消息内容进行确认,确认的确是某人自愿签名,或是确实是某人发的消息
- 使用数字证书的签名也就是数字签名,根据全国人大《电子签名法释义》第十六条的解释,数字签名是指通过使用非对称密码加密系统对电子记录进行加密、解密变换来实现的一种电子签名。
- 可用于确认内容的可靠性,或用于确认签名的自愿性
1. 数字证书
数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。简单地说,数字证书是一段包含用户身份信息、用户公钥信息以及份验证机构数字签名的数据。
它主要包含:
证书的版本信息;
证书的序列号,每个证书都有一个唯一的证书序列号;
证书所使用的签名算法;
证书的发行机构名称;
证书的有效期;
证书所有人的名称;
证书所有人的密钥对;
证书发行者对证书的签名。
2. 数字签名的原理
数字签名是基于非对称密钥加密技术与数字摘要技术的应用,是一个包含电子文件信息以及发送者身份,并能够鉴别发送者身份以及发送信息是否被篡改的一段数字串。一段数字签名数字串,包含了电子文件经过Hash编码后产生的数字摘要,即一个Hash函数值以及发送者的公钥和私钥三部分内容。发送方通过私钥加密后发送给接收方,接收方使用公钥解密,通过对比解密后的Hash函数值确定数据电文是否被篡改。
3. 数字签名和数字证书的关系
数字签名和数字证书的目的:
- 数字签名保证内容是真实的,没有被篡改
- 数字证书验证【内容的签署者】是否是【证书的登记者】
以场景为例:用户A向用户B发送一段内容,但不想被窃取或篡改
- 首先用户A对此内容进行 hash 运算【提取出摘要(hash值,就是一字符串)】,之后对此 hash 值用【自己的私钥】进行加密 —— 形成了数字签名
- 之后用户A 将【数字签名(加密的内容hash值)】和【内容原文】一起发送给用户 B
- 用户B通过之前用户A发送过来的证书 —— 获取【用户A的公钥】
- 此处证书的真伪,通过【公证机构CA】来辨别,每台机器上会【内置CA机构的证书,用来验证用户传来的证书】
- 此处证书确保了【用户A的公钥正确性,也就是用户A的身份真实性】
- 用户B通过【证书中的公钥】,解开【数字签名(加密的内容hash值)】,获得【未加密的内容hash值】
- 用户B通过与用户A相同的 hash 函数对【内容原文】进行hash运算,得到【摘要(hash值,就是一字符串)】,与步骤4中获取的【未加密的内容hash值】进行比较,从而判别内容是否被篡改
其中涉及的 hash 函数、证书等,都是通过 https TLS协商阶段传递的
TLS 握手详细过程
下面来看 TLS 握手的详细过程 (注:此图与HTTPS详解一中的 HTTPS 原理图的流程大致相同,不同的是此图把重点放在了TLS握手的相关概念上):
SSL / TLS 握手详细过程
- **"client hello"消息:**客户端通过发送"client hello"消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个"client random"随机字符串。
- **"server hello"消息:**服务器发送"server hello"消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和"server random"随机字符串。
- **验证:**客户端对服务器发来的证书进行验证,确保对方的合法身份,验证过程可以细化为以下几个步骤:
- 检查数字签名
- 验证证书链 (这个概念下面会进行说明)
- 检查证书的有效期
- 检查证书的撤回状态 (撤回代表证书已失效)
- **“premaster secret"字符串:**客户端向服务器发送另一个随机字符串"premaster secret (预主密钥)”,这个字符串是经过服务器的公钥加密过的,只有对应的私钥才能解密。
- **使用私钥:**服务器使用私钥解密"premaster secret"。
- 生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY。
- **客户端就绪:**客户端发送经过共享密钥 KEY加密过的"finished"信号。
- **服务器就绪:**服务器发送经过共享密钥 KEY加密过的"finished"信号。
- **达成安全通信:**握手完成,双方使用对称加密进行安全通信。
二、证书
1. 证书相关文件格式
证书相关文件有多种格式,常见格式:.crt
,.key
,.req
,.csr
,.pem
,.der
。
证书类型 | ||
---|---|---|
xx.crt 、xx.cert
|
证书文件 | CA认证后的证书文件,包含公钥,签名和其他需要认证的信息,比如主机名称(IP)等 |
xx.key
|
私钥文件 | 通常是rsa算法,分带口令和不带口令的版本 |
xx.csr 、xx.req
|
证书请求文件 |
里面包含公钥和其他信息,通过签名后就可以生成证书; 用于向证书颁发机构申请crt证书时使用,服务器配置时不会用到; 在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥; |
证书保存格式 | ||
xx.pem
|
文本格式 | 里面一般包含私钥和证书的信息 |
xx.der 、xx.cer
|
二进制格式 | 只含有证书信息,不包含私钥 |
xx.PFX 、 xx.P12
|
二进制格式 | 同时包含证书和私钥,且一般有密码保护 |
备注 | ||
根证书文件(ca.crt )和根证书对应的私钥文件(ca.key )
|
由 CA(证书授权中心,国际认可)生成和保管,用于验证其他证书的合法性 |
实际上,上述文件的扩展名可以随意命名。只是为了容易理解文件的功能而选择大家都认识的命名方式。但是,上述文件是有格式的,只能是 pem
格式或者 der
格式。使用什么格式的文件取决于需求。
pem
格式的文件为文本文件,内容分别为:
下面几种类型文件,主要是首尾命名不同
证书文件:
-----BEGIN CERTIFICATE-----
MIIFjzCCBHegAwIBAgIQDHZBMYiVhBUfylD2vwLBETANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzEwHhcNMTgxMTExMDAwMDAwWhcNMTkxMTExMTIwMDAwWjA
-----END CERTIFICATE-----
私钥文件:
-----BEGIN RSA PRIVATE KEY-----
MIIFjzCCBHegAwIBAgIQDHZBMYiVhBUfylD2vwLBETANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzEwHhcNMTgxMTExMDAwMDAwWhcNMTkxMTExMTIwMDAwWjA
-----END RSA PRIVATE KEY-----
请求文件:
-----BEGIN CERTIFICATE REQUEST-----
MIIFjzCCBHegAwIBAgIQDHZBMYiVhBUfylD2vwLBETANBgkqhkiG9w0BAQsFADBu
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
RFYgVExTIENBIC0gRzEwHhcNMTgxMTExMDAwMDAwWhcNMTkxMTExMTIwMDAwWjA
-----END CERTIFICATE REQUEST-----
2. 证书种类
证书分为根证书、服务器证书、客户端证书。根证书文件(ca.crt
)和根证书对应的私钥文件(ca.key
)由 CA(证书授权中心,国际认可)生成和保管。那么服务器如何获得证书呢?向 CA 申请!步骤如下:
- 服务器生成自己的公钥(
server.pub
)和私钥(server.key
)。后续通信过程中,客户端使用该公钥加密通信数据,服务端使用对应的私钥解密接收到的客户端的数据; - 服务器使用公钥生成请求文件(
server.req
),请求文件中包含服务器的相关信息,比如域名、公钥、组织机构等; - 服务器将
server.req
发送给 CA。CA 验证服务器合法后,使用ca.key
和server.req
生成证书文件(server.crt
)——使用私钥生成证书的签名数据; - CA 将证书文件(
server.crt
)发送给服务器。
由于ca.key
和 ca.crt
是一对,ca.crt
文件中包含公钥,因此 ca.crt
可以验证 server.crt
是否合法——使用公钥验证证书的签名。
3. 验证方式
验证方式分为单向验证和双向验证。
3.1 单向验证
单向验证是指通信双方中一方验证另一方是否合法。通常是指客户端验证服务器。
客户端需要:ca.crt
服务器需要:server.crt
,server.key
PS:我们平时使用 PC 上网时使用的就是单向验证的方式。即,我们验证我们要访问的网站的合法性。PC 中的浏览器(火狐、IE、chrome等)已经包含了很多 CA 的根证书(ca.crt
)。当我们访问某个网站(比如:https://www.baidu.com)时,网站会将其证书(server.crt
)发送给浏览器,浏览器会使用 ca.crt
验证 server.crt
是否合法。如果发现访问的是不合法网站,浏览器会给出提示。
现实中,有的公司会使用自签发证书,即公司自己生成根证书(ca.crt
)。如果我们信任此网站,那么需要手动将其证书添加到系统中。
3.2 双向验证
双向验证是指通信双方需要互相验证对方是否合法。服务器验证客户端,客户端验证服务器。
客户端需要:ca.crt
,client.crt
,client.key
服务器需要:ca.crt
,server.crt
,server.key
双向验证通常用于支付系统中,比如支付宝。我们在使用支付宝时必须下载数字证书,该证书就是支付宝颁发给针对我们这台机器的证书,我们只能使用这台机器访问支付宝。如果换了机器,那么需要重新申请证书。
三、Linux 自签名生成证书
x509证书通常会用到三类文:key,csr,crt
*.key:密钥文件,一般是SSL中的私钥,通常是rsa算法,分带口令和不带口令的版本;
*.csr:证书请求文件,里面包含公钥和其他信息,通过签名后就可以生成证书;用于向证书颁发机构申请crt证书时使用,服务器配置时不会用到;在制作csr文件的时,必须使用自己的私钥来签署申,还可以设定一个密钥;
*.crt, *.cert:CA认证后的证书文件,包含公钥,签名和其他需要认证的信息,比如主机名称(IP)等;
*.pem:里面一般包含私钥和证书的信息;
我们自签名证书配置,虚拟主机需要的是 .crt
证书,和不带口令的SSL Key的.key文件;
0. keytool / openssl
keytool
和 openssl
是俩个证书管理工具,keytool
是java JDK
自带的证书管理工具,使用keytool
可以生成密钥,创立证书。只需装了jdk,并正确设置了环境变量,即可以之间通过命令行执行keytool
命令来管理证书。 openssl
则是一个开源的安全套接字层密码库,功能比keytool
更加丰富。
1. 生成 key
[root@VM-1-14-centos key]# openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...........+++
....+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
[root@VM-1-14-centos key]# ls
server.key
复制代码
这样是生成rsa私钥,des3算法,openssl格式,2048位强度。server.key是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。
可以通过以下方法生成没有密码的key:
[root@VM-1-14-centos key]# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:
writing RSA key
[root@VM-1-14-centos key]# ls
server.key
复制代码
server.key 就是没有密码的版本了。
2. 生成CA的crt
[root@VM-1-14-centos key]# openssl req -new -x509 -key server.key -out ca.crt -days 3650
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
[root@VM-1-14-centos key]# ls
ca.crt server.key
生成的 ca.crt 文件是用来签署下面的 server.csr 文件。
3. 生成csr
[root@VM-1-14-centos key]# openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
# 填写证书请求文件的信息
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shaanxi
Locality Name (eg, city) [Default City]:Xi'an
Organization Name (eg, company) [Default Company Ltd]:cloudcared
Organizational Unit Name (eg, section) []:section
Common Name (eg, your name or your server's hostname) []:www.ssltest.com # 注意此处,该证书作用在此域名上
Email Address []:honest1y@cloudcared.cn Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@VM-1-14-centos key]# ls
ca.crt server.csr server.key
须要依次输入国家,地区,组织,Email。最重要的是common name,能够写你的名字或者域名。
若是为了https申请,这个必须和域名吻合,不然会引起浏览器警报。生成的 csr 文件交给 CA签名 后造成服务端本身的证书。
4. 生成crt
CSR文件必须有CA的签名才可形成证书,可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢。
[root@VM-1-14-centos key]# openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
Signature ok
subject=/C=CN/ST=Shaanxi/L=Xi'an/O=cloudcared/OU=section/CN=www.ssltest.com/emailAddress=honest1y@cloudcared.cn
Getting CA Private Key
[root@VM-1-14-centos key]# ls
ca.crt ca.srl server.crt server.csr server.key
输入key的密钥后,完成证书生成。
-CA
选项指明用于被签名的csr证书
-CAkey
选项指明用于签名的密钥
-CAserial
指明序列号文件,序列号文件是ca指令签发证书的时候的依据文件之一,它从该文件读取当前签发的证书的序列号并将序列号文件中的序列号加1,这样,就可以确保证书的序论号是递增的,不会重复。
-CAcreateserial
指明文件不存在时自动生成
最后生成了私用密钥:server.key和本身认证的SSL证书:server.crt
证书合并:
cat server.key server.crt > server.pem
一文了解数字签名、数字证书、自签证书相关推荐
- nginx配置https双向验证(ca机构证书+自签证书)
nginx配置https双向验证 服务端验证(ca机构证书) 客户端验证(服务器自签证书) 本文用的阿里云签发的免费证书实验,下载nginx安装ssl,文件夹有两个文件 这两个文件用于做服务器http ...
- 网络安全--数字签名/数字证书
对称加密: 未加密的信息+秘钥 --> 加密的黑盒子 --> 加密后的信息 加密后的信息+秘钥 --> 解密的黑盒子 --> 未加密的信息 非对称加密: 未加密的信息+公钥 - ...
- 什么是 数字签名 数字证书 数字信封
1,数字签名 数字证书 数字信封 当A和B进行通信时,将A发送的消息的hash值先用A的私钥进行加密(数字签名),B存储A的公钥,B收到信息之后利用公钥进行解密,保证信息的完整性和保密性来自于A 存在 ...
- SSL数字证书之CA根证书、CA中间证书和SSL证书
[前言] 说一下大背景吧,我们的一个后台服务需要部署在一个没法上外网的环境,但是我们的后台服务需要访问七牛云进行对象存储,于是乎,需要一个代理来完成这个访问,我门采用nginx七层来做这个代理,因为七 ...
- 一款可查看和验证电子发票、电子合同、电子公文等PDF文档数字签名的 免费 桌面应用。
[软件名称] SigReader 签名文档阅读器 [应用平台] Windows / macOS(coming soom) [一句简介] 一款可查看和验证电子发票.电子合同.电子公文等PDF文档数字签名 ...
- 如何实现文档数字签名?文档签名有什么好处?
文档数字签名被认为是最安全的电子签名类型,原因在于数字签名具有法律约束力,并且对每个签名者都是独一无二的.除此之外,文档签名验证发送者身份,显示签名时间戳,这也能作为文件被篡改的标志,提醒用户自签署后 ...
- Nginx 颁发自签证书
不想看介绍直接跳到nginx颁发自签证书. 信息.摘要.数字签名.数字证书.对称加密.非对称加密到底是什么? 简述 我们都知道 HTTP 协议都是明文传输内容,为了保证数据传输的安全,HTTPS 协议 ...
- 密码技术--证书及go语言生成自签证书
证书类似身份证,里面记录了某人的姓名.年龄.地址等个人信息,还包括这个人的公钥(身份证号码),并由认证机构(类似派出所)进行数字签名后发放,只要我们看到该证书就可以知道认证机构认定了该公钥(身份证号码 ...
- 基于 OpenSSL 生成自签名证书,数字签名,泛域名证书,ca证书,PKI等
基于 OpenSSL 生成自签名证书_qhh0205-CSDN博客_openssl自签名证书 windows 下 nginx 双向认证自签名证书配置 windows 下 nginx 双向认证自签名证书 ...
最新文章
- Java项目:干活管理系统(java+SSM+Jsp+Mysql)
- Spring AOP小记
- 实事求实来看综合布线网络
- java面试时候算法题多吗,Java面试必问算法题
- html5手机签名,html5手写签名
- java技术分享主题_Java开发入门:适合新手练手的Java项目(附源码下载)
- C++编程笔记:C++用new与不用new创建对象的区别
- 【Elasticsearch】Elasticsearch之集群角色类型
- LINUX系统配置相关
- JavaScript-预解析(变量提升)
- Fresco几处不太好的地方
- javascript 视频进度条制作
- 西瓜书之误差逆传播公式推导、源码解读及各种易混淆概念
- explain mysql语句_使用 explain 查看 MySQL 中 SQL 语句的执行情况 - 文章
- ecshop模板支持php,ecshop模板支持php数据运算的代码实例
- 有何特长及英语计算机水平怎么写,熟悉专业有何特长填写(范文篇).doc
- QT5 OpenGL (四, 绘制立体图形)
- 微信开放JS SDK,再次给浏览器们上了一课
- 收藏本站和设为主页代码(HTML)
- ORB-SLAM3相对于ORB-SLAM2有哪些优势?
热门文章
- 计算机算法设计与分析期末试题,算法设计与分析期末考试试卷(D卷)(含答案).doc...
- 图片链接转base64
- 搞事情?Spring Boot今天一口气发布三个版本
- 对于多曲面模型如何转换钣金并展开
- 应用程序正常初始化(0xc00000ba)失败的解决方法
- 【混得好的都有这 5 种特质】优秀的年轻人都有这 5 大特质
- openstack-nova
- 以太坊客户端Ethereum Wallet与Geth区别简介
- linux配置jdk环境_linux配置jdk环境变量显示不识别的标志符
- 二元牛顿迭代法matlab,2-8牛顿迭代法matlab