mTLS: TLS/CA/证书 简介

TLS

传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。

SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。

TLS协议采用主从式架构模型,用于在两个应用程序间透过网络创建起安全的连接,防止在交换数据时受到窃听及篡改。

TLS协议的优势是与高层的应用层协议(如HTTP、FTP、Telnet等)无耦合。应用层协议能透明地运行在TLS协议之上,由TLS协议进行创建加密通道需要的协商和认证。应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。

客户端和服务通过使用一个握手过程协商出一个有状态的连接以传输数据,通过握手,客户端和服务器协商各种参数用于创建安全连接:

  • 当客户端连接到支持TLS协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和散列算法),握手开始;
  • 服务器从该列表中决定加密算法和散列算法,并通知客户端;
  • 服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥;
  • 客户端验证其收到的服务器证书的有效性;
  • 为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密;
  • 利用随机数,双方生成用于加密和解密的对称密钥。

以上就是TLS协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS握手过程就会失败,并且断开所有的连接。

CA 和证书

术语介绍

网络安全与数字证书领域的专业术语

简称英文全称中文全称
CACertificate Authority / Certification Authority证书颁发机构
PCAPrivate Certificate Authority私有证书颁发机构,又名私有 CA
SSLSecure Sockets Layer安全套接字层协议
TLSTransport Layer Security传输层安全性协议
HTTPHypertext Transfer Protocol超文本传输协议
HTTPSHypertext Transfer Protocol Secure超文本传输安全协议
EV SSLExtended Validation SSL CertificatesEV 证书,又名扩展验证证书
OV SSLOrganization Validated SSL CertificatesOV 证书,又名组织验证证书
DV SSLDomain Validated SSL Certificates DV证书,又名域验证证书
Wildcard SSLWildcard SSL Certificate通配符证书
MDCMulti-Domain Certificates多域 SSL 证书
UCCUnified Communications Certificate统一通信证书
TLDTop-level domain顶级域
PKIPublic key infrastructure公钥基础设施
OCSPOnline Certificate Status Protocol在线证书状态协议
CSPCryptographic Service Provider加密服务提供商
-Public key公钥
-Private key私钥
X.509-密码学里的公钥证书格式标准
CSRCertificate signing request证书签名请求

证书

证书能够对传输的数据进行签名和认证,签名有双重作用:

  • 作用一:保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改;
  • 作用二:防止数据的发布者否认其发布了该数据。

签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。
例如场景:
比如开放平台中最常见open api的签名就是将参数进行字典序排序,将参数名和参数值拼接成字符串,拼接后的字符串就相当于摘要,然后将摘要用平台密钥加密或者签名。接收者接受到数据后,先使用发布者的公钥进行验证,或者解密得到原数据的摘要,同时对接收到的数据使用相同的方法计算摘要,如果两个摘要相同,则说明数据没有被篡改。

数据提供者的私钥是不公开的,接收者通过提供者的公钥能成功对数据进行解密,则说明该数据一定来源于该提供者。
那么如果确定公钥是否属于数据提供者呢?这就需要证书了。证书由认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由认证机构使用它的私钥进行签名。信息的提供者在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书只能自签名。

SSL 证书链

证书包含的内容可以概述为三部分,用户的信息、用户的公钥、还有CA中心对该证书里面的信息的签名。在验证证书的有效性的时候,会逐级去寻找签发者的证书,直至根证书为结束,然后通过公钥一级一级验证数字签名的正确性。这里一系列的证书,便是证书链。

从组织结构来看,证书链是从终端用户证书到其后跟着的一系列 CA 证书,而通常最后一个(即根证书)是自签名证书,并且有如下关系:

  • 在证书链上除最后一个证书外,证书颁发者等于其后一个证书的主题。
  • 除了最后一个证书,每个证书都是由其后的一个证书签名的。
  • 最后的证书一般由操作系统直接内置,可以直接信任。

证书链可以用于检查目标证书(证书链里的第一个证书)里的公钥及其它数据是否属于其主题。
检查是这么做的:用证书链中的后一个证书的公钥来验证它的签名,一直检查到证书链的尾端,如果所有验证都成功通过,那个这个证书就是可信的。

在此过程中,涉及到的证书包含如下几类:

  1. 叶子证书
    即最终的实体证书。

  2. 中间证书
    全称为中间证书颁发机构,是证书颁发机构(CA)为了自我隔离而颁发的证书。
    其作用是通过中间证书的私钥来签署最终用户 SSL 证书,通过中间根对另一个中间根进行签名,然后 CA 使用它来对证书进行签名。

  3. 根证书
    证书颁发机构的自签名根证书。它的颁发者和主题是相同的,可以用自身的公钥进行合法认证。证书认证过程也将在此终止。

交叉证书

交叉证书的应用场景是这样的:假如现在小白成为一个新的根CA机构,那小白签发的证书想要浏览器信任的话,小白的根证书就需要内置在各大操作系统和浏览器中,这需要较长时间的部署,那在没有完全部署完成之前,小白签发的证书怎么才能让浏览器信任呢,这就需要用到交叉证书了。

简单来说,交叉证书会利用已有根 CA 的来为新 CA 签发一个交叉证书,在这个交叉证书里主题是新 CA 根证书信息,但是签发者是已有的根 CA。

这部分的内容可以参照 Let’s Encrypt 的证书链示意图,或者参考文章: Cross-Signing and Alternate Trust Paths; How They Work
在这里插入图片描述

证书相关格式和文件扩展名

证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL 、OCSP、SCEP等。

证书文件格式[Certificate]:
格式扩展名描述特点
DER.cer/.crt/.rsa【ASN .1 DER】用于存放证书。
辨别编码规则 (Distinguished Encoding Rules) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。
打开看是二进制格式,不可读。
查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
不含私钥、二进制
Java和Windows服务器偏向于使用这种编码格式.
PEM.pem【Printable Encoded Message】 该编码格式在RFC1421中定义,其实PEM是【Privacy-Enhanced Mail】的简写,但也同样广泛运用于密钥管理
ASCII文件,一般基于base 64编码
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
可以直接用文本编辑器打开查看
Apache和NGINX服务器偏向于使用这种编码格式
Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:
1.内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。
2.头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。
3.信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。
PKCS7.p7b/.p7r【PKCS #7】加密信息语法标准1、p7b以树状展示证书链,不含私钥
2、p7r为CA对证书请求签名的回复,只能用于导入
PKCS10.p10/.csr【PKCS #10】公钥加密标准【Certificate Signing Request】1、证书签名请求文件
2、ASCII文件
3、CA签名后以p7r文件回复
CMS.p7c/.p7m/.p7s【Cryptographic Message Syntax】1、p7c只保存证书
2、p7m:signature with enveloped data
3、p7s:时间戳签名文件
SPC.pvk/.spc【Software Publishing Certificate】微软公司特有的双证书文件格式,经常用于代码签名,其中
1、pvk用于保存私钥
2、spc用于保存公钥
相关的文件扩展名
扩展名名称描述示例
CRTcertificate - 证书常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码
CERcertificate - 证书常见于Windows系统,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.证书中没有私钥,DER 编码二进制格式的证书文件
KEY密钥通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER查看KEY的办法:openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der
CSRCertificate Signing Request,即证书签名请求它并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好查看的办法:openssl req -noout -text -in my.csr
如果是DER格式的话照旧加上-inform der: openssl req -noout -inform der -text -in my.csr
PFX/P12predecessor of PKCS#12包含公钥和私钥的二进制格式证书
对nginx服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个"提取密码",你想把里面的东西读取出来的话,它就要求你提供提取密码
PFX使用的时DER编码,把PFX转换为PEM编码:openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
这个时候会提示要求输入提取代码
for-iis.pem就是可读的文本.。
生成pfx的命令类似这样:openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx
其中CACert.crt是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去。这么看来,PFX其实是个证书密钥库。
p7b-以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。
JKSJava Key Storage这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫"keytool"的工具,可以将PFX转为JKS,keytool也能直接生成JKS
证书编码的转换
  • PEM转为DER:
    操作命令:
    • openssl x509 -in cert.crt -outform der -out cert.der
  • DER转为PEM:
    操作命令:
    • openssl x509 -in cert.crt -inform der -outform pem -out cert.pem

(提示:要转换KEY文件也类似,不过把x509换成rsa,要转CSR的话,把x509换成req…)

  • 从pfx导出crt和key:
    操作命令:

    • openssl pkcs12 -in example.cn.ssl.pfx -nocerts -nodes -out example.key
    • openssl pkcs12 -in example.cn.ssl.pfx -clcerts -nokeys -out example.crt
  • 将crt和key合并出pfx:
    操作命令:

    • openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx
密钥库文件格式[Keystore] :
格式扩展名描述特点
JKS.jks/.ks【Java Keystore】密钥库的Java实现版本,provider为SUN密钥库和私钥用不同的密码进行保护
JCEKS.jce【JCE Keystore】密钥库的JCE实现版本,provider为SUN JCE相对于JKS安全级别更高,保护Keystore私钥时采用TripleDES
PKCS12.p12/.pfx【PKCS #12】个人信息交换语法标准1、包含私钥、公钥及其证书
2、密钥库和私钥用相同密码进行保护
BKS.bks【Bouncycastle Keystore】密钥库的BC实现版本,provider为BC基于JCE实现
UBER.ubr【Bouncycastle UBER Keystore】密钥库的BC更安全实现版本,provider为BC

证书内容

证书文件可以使用记事本直接打开,内容如下:

-----BEGIN CERTIFICATE-----
MIIDdDCCAlygAwIBAgIBAjANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBoxOTIu
MTY4LjMuMzUtY2FAMTcwOTEzMTkyNjAeFw0yNDAyMjgxMzUyMDZaFw0yNTAyMjcx
MzUyMDZaMCIxIDAeBgNVBAMMFzE5Mi4xNjguMy4zNUAxNzA5MTMxOTI2MIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvykrt9bSqJpu5eWnuZbiocOagUqR
t6K7zn6OMoj1Tk8N1wscbPnKarWL4WyuVBoL16ux+cPeNZxuMhyw091EbgXEJiQe
oGlIeGpIyZpEvlWIpAQUWnUb0dKtrd1g2rF84CAnjw3RJW221QanB5RhD4twp2/Q
2AKlw8bDTN++Xxs6i9/cSYgRRZh//r8UGcj4q9dHovkNntTWD7QjUeOZThLr7Gn6
AojnX5h3afxnnNMuHWHmlM0G+ARWbYwTZaSAwkkpzpgrm9T7f5NKvX9LNtHQKmVj
6MafYSPqxNa/Z8iX4XsDhP8LPPdVPHW1zWAUlF54qygdQqvnNp45hDeQ2QIDAQAB
o4GxMIGuMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNV
HRMBAf8EAjAAMB8GA1UdIwQYMBaAFCluT2OyAu9sjfyV4H5qRmlLzHFPMFgGA1Ud
EQRRME+CFmt1YmVybmV0ZXMuZGVmYXVsdC5zdmOCEmt1YmVybmV0ZXMuZGVmYXVs
dIIKa3ViZXJuZXRlc4IJbG9jYWxob3N0hwTAqAMjhwQK/gABMA0GCSqGSIb3DQEB
CwUAA4IBAQCMjz/IWqlKkrZVzGpHzDl8KNcbTaCwcJUIeb8WPxDFjJ42Eb0eBogM
VLG5xiHRssavqJFgaWipPVdRgLyjqq7xxEzhfIz/mqhah0eYOrNYqBoHn4e6IgBG
G2Dev4qtlCtZnkX7NMI1lAGZFXKx/HZRJwnCkG1QiZFBH24Ks283PGRXSwvJL2gw
a0uvDAtrT97MwZTwYlwJ6Yxg7v0ir4EY9s8Uz4di5ylJgoTlR336Myt3BT3bUM4l
UHz8s5c9EyV2ugQCdP6P94SZH9gDN3jEw+Fo7fu0XWzZ8ET749xmlEmOZd1ZITta
R1j5w237fI3ZdQDm5b0wC2+741VKPL1v
-----END CERTIFICATE-----

证书申请流程

受信任的数字证书需要向受信任的证书颁发机构(CA)申请,流程如下:
在这里插入图片描述
但是受信任的证书颁发机构(CA)颁分的受信任数字证书通常是商业行为,需要商业付费(当然目前也是有免费的)。

如果不想用商业数字证书,也可以自建PCA,或者使用openssl创建CA证书。

参考

网络安全科普:奇妙的 SSL/TLS 证书(基础篇)
局域网内搭建浏览器可信任的SSL证书
Java 证书已经证书管理(keytool实例),jks\crt\cet\ketstore
der pem cer crt key pfx等概念及区别
手动实现CA数字认证(java)
java编程方式生成CA证书



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/504113.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软考】UML中的图之通信图

目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点,然后把连接这些对象的链表示为图的弧,最后用对象发送和接收的消…

Tomcat 部署和优化 (一)---------安装Oracle jdk 、tomcat

自 2017 年 11 月编程语言排行榜 Java 占比 13%,高居榜首,Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性被深受喜爱。本章主要学习如何部署 Tomcat 服务,根据生产环境实现多个虚拟主机的配置,最后…

24款奔驰C260L升级原厂360全景影像 高清环绕的视野

360全景影像影像系统提升行车时的便利,不管是新手或是老司机都将是一个不错的配置,无论是在倒车,挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况,避免盲区事故发生,提升行车出入安全性。星骏汇小许Xjh15863 3…

人工智能基础——模型部分:模型介绍、模型训练和模型微调 !!

文章目录 前言 一、什么是模型 二、什么是模型训练 三、什么是模型微调 前言 本文将从什么是模型?什么是模型训练?什么是模型微调?三个问题,来展开介绍人工智能基础的模型部分。 模型族谱 一、什么是模型 模型是一个函数&#x…

SpringBoot整合JdbcTemplate

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot整合JdbcTemplate 📚个人知识库: Leo知识库,欢迎大家访问 目录 …

Linux中systemv共享内存

目录 1.原理 2.接口 1.shmget(share_memory_get获得共享内存) 2.ftok 3.shmat(share_memory_attaintion挂接到物理内存上) 4.key和shmid的区别 5.ipc 指令 6.shmdt函数(share_memory_detach取消挂接) 7.shmctl函数(share_memory_cont…

电子科技大学《数据库原理及应用》(持续更新)

前言 电子科技大学的数据库课程缩减了部分的课时,因此,可能并不适合所有要学习数据库的宝子们,但是,本人尽量将所有数据库的内容写出来。本文章适用于本科生的期中和期末的复习,电子科技大学的考生请在复习前先看必读…

JS:原型与原型链(附带图解与代码)

一、原型 写在前面: 任何对象都有原型。 函数也是对象,所以函数也有原型。 1.什么是原型 在 JavaScript 中,对象有一个特殊的隐藏属性 [[Prototype]],它要么为 null,要么就是对另一个对象的引用,该对象…

什么是人才储备?如何做人才储备?

很多小伙伴都会有企业面试被拒的情况,然后HR会告诉你,虽然没有录用你,但是你进入了他们的人才储备库,那么这个储备库有什么作用和特点呢?我们如何应用人才测评系统完善人才储备库呢? 人才储备一般有以下三…

[物联网] OneNet 多协议TCP透传

[物联网] OneNet 多协议TCP透传 STM32物联网–ONENET云平台的多协议接入产品创建 : https://blog.csdn.net/qq_44942724/article/details/134492924 Onenet tcp 透传 : https://blog.csdn.net/flyme2010/article/details/107086001 tcp服务端测试工具 : http://tcp.xnkiot.com/…

剑指offer刷题记录Day 1 03.数组中重复的数字 ---> 06.从尾到头打印链表

名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 0、关于核心代码模式该怎么刷题?1、…

mysql学习笔记3——授权操作

利用select查询数据库数据时,可以在后面加上参数 意为限制显示条数 对数据库进行远程操作时,为了避免不同用户操作混乱,要设置不同用户的权限,可以使用 具体格式为 其中*代表任意均可 ,这里用户创建采用与授权同时进…