数字证书简介

article/2025/10/4 12:53:10

学习笔记

数字证书


文章目录

      • 一、数字证书简介
      • 二、自己动手:自签名证书
      • 三、番外篇:
          • 1、Windows 如何查看自己电脑上的证书?
          • 2、macOS 如何查看自己电脑上的证书?
      • 附录:参考文章


一、数字证书简介

  1. 数字证书,digital certificate。一种集合了多种加密方式的安全标准,数字证书通常由【受到人们广泛信赖的组织】向第三方颁发,表明这个第三方也是一个值得信赖的对象。数字证书的使用可以防止中间人攻击,常用于服务器与客户端浏览器的交互,数字证书其实就是一个.crt文件。

  2. 数字证书中对各种加密算法的使用:

    • 摘要算法来确保数据没有被篡改。
    • 非对称加密算法对数据进行加解密。
    • 签名算法确保数据的完整性和抗否认性。
    • 对称加密算法负责后续的通信过程。
  3. CA:Certificate Authority,数字证书认证机构。

  4. 数字证书的颁发采用链式签名验证,通过**根证书(Root CA)**去签名下一级证书,层层签名,直到最终的用户证书。

  5. 根证书CA是**【自签名证书】**,存在于用户的操作系统或者浏览器中(默认内嵌),任何经过CA认证的数字证书都可以对其本身进行校验,确保证书本身不是伪造的,数字证书表示CA结构对证书持有者的认可。

  6. 证书申请者首先需要自生成公匙与私匙,然后向 CA 机构发送一个证书请求文件 .csr (Certificate Signing Request,证书签名请求),包含:

    • 公匙
    • 申请者信息
    • 域名

    CA 机构确认无误后用自身私匙给证书签名,然后将签名等其他信息塞入证书打包成 X.509 格式并返回数据,至此一份正式的证书生成。

    专用临时Demo

    申请数字证书

  7. 我们常听到的SSL/TSL、HTTPS是什么呢?

  • SSL Secure socket layer,网络安全层。现代 TLS 加密的前身、数字证书的一种,历史原因我们习惯统称 SSL 。
  • SSL证书部署在服务器上,由CA机构颁发,可以说它就是【数字证书】,只不过它是一种遵守 SSL 协议的数字证书。
  • HTTP + SSL/TSL = HTTPS。
  • Http端口:80
  • HTTPS端口:443

HTTP与HTTPS

  1. CA证书的种类(3种)

    ​ 安全证书主要分为DV、OV和EV三个种类,对应的安全等级分别为低、中、高。正常情况下,一个合法的数字证书需要经过CA签名,这需要认证域名并支付一定的费用,三者的审核过程、审核标准和对应的域名数量不同,价格在几百元到几万元不等。

    ​ 选择签发机构时,最好选择行业认可的全球范围内都可以使用的 CA 机构签发的证书。目前我们国内的证书能够符合标准的还不是特别多,主要原因是有一些证书不能够被国外的浏览器所认可,在使用的时候需要进行一定的额外操作。

    • DV SSL:只验证网站域名所有权的简易型(Class 1级)SSL证书,可10分钟快速颁发,能起到加密传输的作用,但无法向用户证明网站的真实身份。目前市面上的免费证书都是这个类型的,只是提供了对数据的加密,但是对提供证书的个人和机构的身份不做验证,只要你能向CA机构证明你拥有这个域名的管理权限就可以申请。
    • OV SSL:提供加密功能,对申请者做严格的身份审核验证。和DV SSL的区别在于,OV SSL 提供了对个人或者机构的审核,能确认对方的身份,安全性更高,但是收费。
    • EV SSL:最安全、最严格的 SSL 证书,遵循全球统一的严格身份验证标准,是目前业界安全级别最高的顶级(Class 4级)SSL证书。常用于金融证券、银行、第三方支付、网上商城等领域,重点强调网站安全、企业可信形象的网站,涉及交易支付、客户隐私信息和账号密码的传输。这部分的验证要求最高,申请费用也是最贵的。
  2. CA证书的类型(3种)

    • 单域名版:只保护一个域名。
    • 多域名版:可以保护多个域名。
    • 通配符版:保护同一个主域名下同一级的所有子域名,不限个数。通配符版只有 DV 和 OV 具有,EV 不具有通配符版本。
  3. 注意:数字证书存储的是公钥以及相关的证书链和算法信息,标准格式存入,标准格式取出。私钥必须严格保密,如果数字证书对应的私钥泄漏,那么该CA证书签发的所有证书将不可信,这会造成严重的安全威胁,数字证书服务商 DigiNotar 就发生过私钥泄漏导致公司破产的事故。

数字证书

(数字证书包含版本、发行方、过期时间、域名、公钥、证书签名等信息)

  1. 【客户端/服务器】数字证书验证过程,以HTTPS协议为例,浏览器和服务器建立安全连接的步骤如下(单向验证):

    1. 浏览器向服务器发起请求,服务器向浏览器发送自己的数字证书。
    2. 浏览器用操作系统内置的 Root CA 来验证服务器的证书是否有效,如果有效,就使用该证书加密一个随机的AES口令并发送给服务器。
    3. 服务器用自己的私钥解密获得AES口令,并在后续通讯中使用AES加密。

    数字证书验证模型

    数字证书

  2. 概念:【数字证书链条】

        什么是数字证书链条?我们在验证证书的有效性的时候,会逐级去寻找签发者的证书,直至找到根证书,因此数字证书的存在形式为链条。通过下图我们可以看到百度的数字链条为 3 层,顶层为根证书,底层为百度的证书,中间还存在一个【中间证书】。

        **那为什么会存在“中间证书”,直接用根证书授权不好吗?**其实中间证书的存在增加了根证书的安全性,有助于在发生安全事件时最小化损害;当安全事件发生时,不需要撤销根证书,只需撤销中间证书,使从该中间证书发出的证书组不受信任,从而达到最小化损害范围、保护根证书的作用,因此各大根证书厂商都不会直接向第三方签名,而是会通过“中间方”去签名。

    (H2由上一级生成,在你提交信息给CA的时候,CA用他的私钥和你信息摘要生成H2)

    数字证书链条

  3. 数字证书链条的运转模型(以3层为例):

    三级证书链条模型


二、自己动手:自签名证书

  1. 自签名证书存在两种:

    • 官方认可的根证书CA。
    • 我们自己定义的证书CA,官方不认可
  2. 本节主要讲述我们自己定义的证书CA,包括它的生成、使用等。这种证书可以正常开发调试,但不能对外作为服务使用,因为其他客户端并不认可未经CA签名的证书。

  3. 要使用数字证书,首先需要通过【命令行】创建证书,我们在这里以Java JDK的 keyTool 工具为例签发证书:

    keytool -storepass 123456 -genkeypair -keyalg RSA -keysize 1024 -sigalg SHA1withRSA -validity 3650 -alias mycert -keystore my.keystore -dname "CN=www.aaa.com, OU=aaa, O=aaa, L=BJ, ST=BJ, C=CN"
    

    各个参数含义如下

    • storepass:口令为123456。
    • keyalg:指定RSA加密算法。
    • sigalg:指定SHA1withRSA签名算法;
    • validity:指定证书有效期3650天;
    • alias:指定证书在程序中引用的名称;
    • dname:指定证书要授予的域名,必须跟要绑定的域名一致。

    执行完上述命令,JDK 会在当前目录创建一个my.keystore文件,并存储创建成功的一个私钥和一个证书,它的别名是mycert。

    image-20220814163434937

  4. 当然,每次都要记住这些参数很麻烦,因为我们可以利用在线工具自动生成语句,然后拷贝到服务器上运行即可(点击访问【CRS在线生成工具】)

CRS在线生成工具

  1. 有了key store存储的证书,我们就可以通过数字证书进行加解密和签名:

    • 私钥以PrivateKey实例表示,公钥则以X509Certificate表示
    • 读取证书并不需要口令,只有读取私钥才需要。
    • 如果部署到Web服务器上,例如Nginx,需要把私钥导出为Private Key格式,把证书导出为X509Certificate格式。
    public class test {public static void main(String[] args) throws Exception {byte[] message = "中文".getBytes("UTF-8");// TODO 读取KeyStore:KeyStore ks = loadKeyStore("/my.keystore", "123456");// 读取私钥:PrivateKey privateKey = (PrivateKey) ks.getKey("mycert", "123456".toCharArray());// 读取证书:X509Certificate certificate = (X509Certificate) ks.getCertificate("mycert");// TODO 加密:byte[] encrypted = encrypt(certificate, message);System.out.println(String.format("encrypted: %x", new BigInteger(1, encrypted)));// TODO 解密:byte[] decrypted = decrypt(privateKey, encrypted);System.out.println("decrypted: " + new String(decrypted, "UTF-8"));// TODO 签名:byte[] sign = sign(privateKey, certificate, message);System.out.println(String.format("signature: %x", new BigInteger(1, sign)));// TODO 验证签名:boolean verified = verify(certificate, message, sign);System.out.println("verify: " + verified);}static KeyStore loadKeyStore(String keyStoreFile, String password) {try (InputStream input = test.class.getResourceAsStream(keyStoreFile)) {if (input == null) {throw new RuntimeException("file not found in classpath: " + keyStoreFile);}KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());ks.load(input, password.toCharArray());return ks;} catch (Exception e) {throw new RuntimeException(e);}}static byte[] encrypt(X509Certificate certificate, byte[] message) throws GeneralSecurityException {Cipher cipher = Cipher.getInstance(certificate.getPublicKey().getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey());return cipher.doFinal(message);}static byte[] decrypt(PrivateKey privateKey, byte[] data) throws GeneralSecurityException {Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}static byte[] sign(PrivateKey privateKey, X509Certificate certificate, byte[] message)throws GeneralSecurityException {Signature signature = Signature.getInstance(certificate.getSigAlgName());signature.initSign(privateKey);signature.update(message);return signature.sign();}static boolean verify(X509Certificate certificate, byte[] message, byte[] sig) throws GeneralSecurityException {Signature signature = Signature.getInstance(certificate.getSigAlgName());signature.initVerify(certificate);signature.update(message);return signature.verify(sig);}
    }
    
  2. 生成了我们自己的证书之后,假如我们也想我们的电脑信任此证书,该如何操作呢?

    **答:**将自签名证书导入自己的操作系统或者浏览器之中即可,比如以前的12306网站就是如此操作。当然这么做存在潜藏风险,因为你一旦信任了该证书,那么你也会自动信任该证书签发的所有网站,当它们想要干点坏事的时候你就会防不胜防,因此最好不用此种方式或用完即删。


三、番外篇:

1、Windows 如何查看自己电脑上的证书?

按住 Windows + R 键调出运行栏,然后输入certmgr.msc回车运行即可。

Windows 如何查看自己电脑上的证书

2、macOS 如何查看自己电脑上的证书?

Mac用户搜索应用 “钥匙串” 即可看到自己电脑上被信任的所有根证书。

macOS 如何查看自己电脑上的证书


附录:参考文章

  1. 数字证书、签名到底是什么?

  2. 证书,证书链,CA的那些事


http://chatgpt.dhexx.cn/article/ZYO1UmAQ.shtml

相关文章

python有什么含金量高的证书排行_光环大数据分享18张含金量最高的大数据证书...

光环大数据人工智能培训认为,不管你是基础不牢固没有开发经验的小白,还是有工作经验还想不断提升自己的开发者们,对于想在这个行业有发展,并付诸了实际努力的人,在这样一个发展前景下,未来都是有无限可能的…

数据库相关认证证书

目前的数据库管理认证都有哪些呢?Oracle、DB2(Linux)、MS SQL、MySQL都分别有哪些认证呢??Oracle:认证有OCA、OCP、OCM。OCA(Oracle Certified Associate),是入门级别的资…

极力推荐|2021年,非常适合大数据从业者考的证书-DAMA

由于大数据技术的飞速发展,数字经济突飞猛进,数字的价值逐渐凸显。 2020年4月发布的《中共中央国务院关于构建更加完善的要素市场化配置管理机制的意见》(以下简称意见)中,首次将“数据”与土地、劳动力、资本、技术等…

大数据有哪些“学历”证书

如今,由于大数据的兴起与应用,数据科学家和数据分析师,以及具有大数据技术工作能力的工程师和开发人员得到了青睐,并获得良好的回报。那么,行业人士如何获得这样的一份工作?那就是获取大数据认证。 数据和大数据分析正在成为企业生命的血液。具有分析大数据所需技术的数…

大数据工程专业技术证书考试-数据分析与应用

大数据职称考试知识大纲–数据分析与应用(初级) 第一部分 基础知识模块 一、大数据法律法规、相关标准及职业道德 1.1 法律法规 1.1.1 《中华人民共和国民法典》中华人民共和国主席令第四十五号 (1)、了解隐私权和个人信息保…

18张含金量最高的大数据证书

这年头从事数据行业很不赖。用人需求量之大达到创记录的水平,薪资也水涨船高。几乎任何数据认证都会让你的薪资涨一涨。本文介绍了哪几大数据认证可以让你稳赚丰厚薪水。 顶级数据技能拿顶薪 你是不是在想:为获得那下一份数据认证付出的时间和费用是不是…

大数据方向可以考的证书有哪些。

目前最权威的大数据相关证书就是工信部教考中心发的二大类证书了。 职业编码2-02-10-11 目前全国有资质培训的培训单位一共31家,分布在全国各地。 如果你想考的话可以我v mumudawang2022

工信部认证的大数据工程师证书你有多了解?

面对面试官如何才能证明你的实力,如果是英语相关职位你可以出示自己的托福、雅思证书,可是大数据可以考取什么证书?大数据培训公司发放的证书真的不具备权威性吗?前些天在网络火爆的工信部认证的某大数据培训又是什么情况&#xf…

大数据培训怎么选?16张国际公认的大数据“学历”证书

如今,由于大数据的兴起与应用,数据科学家和数据分析师,以及具有大数据技术工作能力的工程师和开发人员得到了青睐,并获得良好的回报。那么,行业人士如何获得这样的一份工作?那就是获取大数据认证。 数据和大数据分析正在成为企业生命的血液。具有分析大数据所需技术的数…

数据结构 实验三 树的应用

一、实验内容: 1、以字符串输入形式创建一棵二叉树(提示:可以是简单的一个字符作为二叉树中一个结点;也可以是以学校管理层次体系或者族谱为蓝本,将表示该实际问题的树结构转换为对应的二叉树后,再以二叉树…

西工大NOJ数据结构实验——2.1稀疏矩阵转置

对稀疏矩阵进行转置操作,按照老师讲的,有两种办法。我用的是第一种最简单的,从上到下一行一行得走,虽然速度很慢,但是简单。 说实话这个题目很讨厌,我们定义的三元组里面mu表示的是行数,但是题…

[NOJ]数据结构实验3.1 哈夫曼编/译码器

[NOJ]数据结构实验3.1 哈夫曼编/译码器 #include<stdio.h> #include<stdlib.h> #include<string.h>typedef struct HTNode {int weight;int parent,lchild,rchild;char data; }HTNode; typedef struct HCNode {int bit[200];int start; }HCNode;HTNode ht[10…

数据结构实验报告(三)——图的操作和实现

实验目的 1&#xff0e;掌握图的基本概念、性质与应用问题 2&#xff0e;掌握图的邻接矩阵与邻接表存储方式; 3&#xff0e;掌握图的有关算法&#xff0c;如创建、遍历、连通分量、生成树/最小生成树算法&#xff08;如Prim、Kruskal算法&#xff09;等; 实验原理 1.建立与存储…

关于实验室数据结构实验错误本周总结。引用调用bug

因为学校的实验室本学期没人维护出现了很多bug&#xff0c;但是也有自己的原因。 下面是引用调用的错误。 #include<stdio.h> #include<stdlib.h>typedef struct {int *top;int *base;int sqsize;} Sq;void Init(Sq t){t.top(int*)malloc(sizeof(4*100));t.baset…

数据结构 实验4——拓扑排序

一、实验名称&#xff1a;拓扑排序 二、实验学时&#xff1a;6学时 三、实验目的 1.理解拓扑排序的特性和算法&#xff1b; 2.通过构造图的邻接表&#xff0c;掌握拓扑排序算法。 四、实验内容(步骤) 1.建立邻接表存储的图&#xff1b; 2.对图进行拓扑排序&#xff1b; …

【C语言】数据结构实验报告--单链表

实验内容 一.将单链表按基准划分&#xff0c;以单链表的首节点值x为基准将该单链表分割为两部分&#xff0c;使所有小于x的结点排在大于或等于x的结点之前。 #include<stdio.h> #include"linklist.cpp"void Split(LinkNode *&L) {LinkNode *pre,*p;if(L-&g…

数据结构实验报告(四)——查找和排序算法

实验目的 1. 掌握顺序查找技术和拆半查找技术以及部分排序算法的设计思想&#xff1b; 2. 掌握查找、部分排序算法的实现与执行过程。 实验原理 查找算法 1.顺序查找&#xff1a;从数组第一个元素开始逐个比较&#xff0c;找到后返回相应下标。 2.折半查找&#xff1a;从数组中…

数据结构实验--个人图书信息管理系统

数据结构实验 第一章 个人图书信息管理系统 第二章 停车场管理 第三章 哈夫曼编码 第一章 个人图书信息管理系统 数据结构实验前言一、需求分析二、概要设计三、详细设计1.全局变量、元素类型、结点类型和指针类型2.顺序表的基本操作3.主函数 总结 前言 线性表的顺序表示又称为…

【C语言】数据结构实验报告一

目录 题目1.1 求1~n的连续整数和。1.2 对于1到n的每个整数n&#xff0c;输出log2n&#xff0c;根号n&#xff0c;n ,nlog2n ,n^2 ,n^3 ,2^n ,n!的值。1.3 求1~n的素数的个数&#xff0c;并且计算出时间1.4 求1~n的连续整数阶乘的和。 题目 1.1 求1~n的连续整数和。 #include&…

数据结构实验:电话号码查询系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、问题描述二、问题描述&#xff08;1&#xff09;选用的散列函数&#xff08;2&#xff09;散列因子&#xff08;3&#xff09;解决冲突的方法 三、实验结果…