简介

在PKI(public key infrastructure)公钥设施基础体系中,所有的一切操作都是围绕着证书和密钥的,它提供了创建、管理、分发、使用、存储和撤销数字证书以及管理公钥加密所需的一组角色、策略、硬件、软件和程序。

有了密钥,就可以根据密钥制作证书了。要想证书可以被广泛的使用,一个通用的标准肯定是少不了的,在PKI体系中,这个证书的标准就叫做X.509。

X.509 标准定义了公钥证书最常用的格式。

一个证书的例子

证书中最主要就是公钥信息,从证书中提取公钥,才能使用公钥去解密发送者使用私钥加密过的数据。公钥信息是证书的核心。

除了公钥之外,证书包含了很多其他的信息,比如包含了身份信息(主机名、组织或个人等)。

创建证书非常简单,我们先看一个使用openssl命令来创建证书的例子。

创建证书之前,首先需要创建证书依赖的公钥和私钥,x.509证书可以支持多种公钥私钥算法,比如RSA, DSA, ECDSA, ed25519等。

这里我们选择使用RSA算法,生成密钥对如下:

openssl genrsa -des3 -out ca.key 1024
Generating RSA private key, 1024 bit long modulus
...............++++++
.............................................++++++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:

输入pass, 我们可以得到ca.key,这是一个RSA PRIVATE KEY。

接下来就可以用这个ca.key来创建证书。

openssl req -new -x509 -days 20 -key ca.key -out ca.crt
Enter pass phrase for ca.key:
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) []:SH
State or Province Name (full name) []:SH
Locality Name (eg, city) []:SH
Organization Name (eg, company) []:HW
Organizational Unit Name (eg, section) []:HW
Common Name (eg, fully qualified host name) []:caserver
Email Address []:flydean@163.com

可以看到,在密钥的基础上,证书还需要提供例如Country Name,Province Name,Organization Name等额外信息。

最后,我们可以得到一个CA证书ca.crt。

如果想要查看证书的状态,可以使用下面的命令:

openssl x509 -noout -text -in ca.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 9511149647544559472 (0x83fe64365379a770)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=SH, ST=SH, L=SH, O=HW, OU=HW, CN=caserver/emailAddress=flydean@163.com
Validity
Not Before: Apr 27 06:33:16 2022 GMT
Not After : May 17 06:33:16 2022 GMT
Subject: C=SH, ST=SH, L=SH, O=HW, OU=HW, CN=caserver/emailAddress=flydean@163.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
00:9f:b4:ff:16:15:51:2a:de:2f:23:cd:7d:27:41:
3c:30:1f:f3:cb:bf:3f:7c:96:ba:c3:81:a8:eb:88:
be:11:31:03:6f:c3:1d:f1:dc:4c:ea:3d:da:15:24:
59:32:8b:7e:87:a0:0b:57:b9:79:e4:72:2f:4b:50:
9d:00:eb:ee:52:24:f3:e8:e9:92:1c:ec:47:d9:98:
8c:f9:0f:71:a6:91:b2:5b:c1:59:bf:1f:27:47:6b:
9c:ce:22:e7:9d:2c:4a:3a:83:72:43:47:5d:ee:9e:
64:78:cb:3c:48:af:27:08:c1:08:41:c0:e0:92:e9:
13:81:1c:c7:72:3c:2f:5f:f3
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
68:09:be:cb:89:c0:0d:27:d2:bb:b2:f0:fb:6e:e2:0a:19:86:
92:cf:e5:90:48:b7:99:02:f1:75:6a:6d:79:1e:18:c7:95:7c:
89:92:ed:a1:bf:ad:91:76:c6:63:59:bb:6d:31:1e:11:5a:5e:
32:86:12:89:00:69:d0:77:c6:d6:69:11:0a:f7:7b:61:6e:95:
f8:d6:6b:89:c0:6c:49:eb:38:d9:f5:82:43:32:6e:14:fb:a0:
fb:be:12:a5:dc:69:66:b8:1b:22:cb:0f:9f:56:52:40:6d:48:
b6:78:29:dc:67:aa:79:c5:00:e3:68:9a:65:9a:94:99:be:ce:
b0:d2

可以看到CA证书中包含了日期,序列号,签名算法,发行者,有效性等额外的信息。

上面生成的证书实际上是一个根证书,这个根证书可以对其他的证书请求进行签名,从而生成子证书,从而产生了证书的级联结构。

如果一个客户端想要向CA server请求一个新的证书该怎么做呢?

首先客户端也需要生成自己的密钥对。如果客户端是CA server自己,那么这个请求CA证书的过程叫做自签名。

要想请求证书,首先得生成一个请求csr,同样可以使用openssl命令来进行:

openssl req -new -key ca.key -out server.csr
Enter pass phrase for ca.key:
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) []:CN
State or Province Name (full name) []:SH
Locality Name (eg, city) []:SH
Organization Name (eg, company) []:citi
Organizational Unit Name (eg, section) []:org
Common Name (eg, fully qualified host name) []:client
Email Address []:flydean@163.com Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:

csr请求因为也是需要生成一个CA证书,所以也需要输入类似的信息。

最后我们生成了一个server.csr文件。

接下来使用这个csr文件去请求证书:

openssl x509 -req -days 20 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
Signature ok
subject=/C=CN/ST=SH/L=SH/O=citi/OU=org/CN=client/emailAddress=flydean@163.com
Getting CA Private Key
Enter pass phrase for ca.key:

上面命令的含义是CA server上的private key,根证书和刚刚生成的证书请求server.csr,生成使用CA server签名的自签名证书。

最后得到一个自签名server.csr证书文件。

同样使用openssl命令查看该证书状态:

openssl x509 -noout -text -in server.crt

Certificate:
Data:
Version: 1 (0x0)
Serial Number: 14663444799761243679 (0xcb7f055ae9515e1f)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=SH, ST=SH, L=SH, O=HW, OU=HW, CN=caserver/emailAddress=flydean@163.com
Validity
Not Before: Apr 27 07:28:08 2022 GMT
Not After : May 17 07:28:08 2022 GMT
Subject: C=CN, ST=SH, L=SH, O=citi, OU=org, CN=client/emailAddress=flydean@163.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
00:9f:b4:ff:16:15:51:2a:de:2f:23:cd:7d:27:41:
3c:30:1f:f3:cb:bf:3f:7c:96:ba:c3:81:a8:eb:88:
be:11:31:03:6f:c3:1d:f1:dc:4c:ea:3d:da:15:24:
59:32:8b:7e:87:a0:0b:57:b9:79:e4:72:2f:4b:50:
9d:00:eb:ee:52:24:f3:e8:e9:92:1c:ec:47:d9:98:
8c:f9:0f:71:a6:91:b2:5b:c1:59:bf:1f:27:47:6b:
9c:ce:22:e7:9d:2c:4a:3a:83:72:43:47:5d:ee:9e:
64:78:cb:3c:48:af:27:08:c1:08:41:c0:e0:92:e9:
13:81:1c:c7:72:3c:2f:5f:f3
Exponent: 65537 (0x10001)
Signature Algorithm: sha1WithRSAEncryption
31:2e:b6:d7:3e:2d:ae:f1:2e:44:b5:5e:73:42:91:39:80:9f:
a8:ed:9c:60:78:35:21:df:4a:45:b0:b1:d1:80:c1:ee:cb:30:
75:34:66:61:43:6c:0a:85:4f:a3:e5:09:9f:2b:07:62:6a:3a:
60:22:78:f0:7d:32:ef:2f:46:95:34:60:22:03:47:78:6f:0c:
7e:f1:85:ea:d6:4b:1e:45:b5:56:a1:d7:52:9c:19:ae:24:26:
3d:a7:0b:f2:94:c1:d3:e3:04:25:f8:ce:b8:cb:84:6a:d1:b4:
63:7c:df:87:f8:44:86:49:b5:96:dc:43:c7:7a:17:d3:82:c6:
6a:af

可以看到结构和root ca证书是一样的,这里的Subject是创建server.csr中输入的信息。

X.509证书的后缀

上面我们使用的证书后缀是crt,也就是certificate的缩写。

事实上X.509证书还支持其他几种类型的后缀。

.pem

pem的全称是Privacy-enhanced Electronic Mail,从名字可以看出,pem最初是为加密邮件准备的。

它是一种以DER+Base64进行编码的证书。PEM证书通常是文本格式,以"-----BEGIN CERTIFICATE-----"开头,并以"-----END CERTIFICATE-----"结束。

.cer, .crt, .der

这三个都是以DER进行编码的二进制证书,但有时候也会使用Base64进行编码,比如.pem。

.p7b, .p7c

是用 PKCS#7 进行签名的数据。

PKCS 全称是 Public-Key Cryptography Standards ,是由RSA实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准。

PKCS#7的全称叫做Cryptographic Message Syntax Standard。

.p12

是用PKCS#12签名的数据,可以同时包含证书和私钥。

.pfx

PKCS#12 的前身,通常包含 PKCS#12 格式的数据。

证书的层级结构和交叉认证

证书的层级结构应该很好理解了,证书的层级结构又叫做证书链。

从我们收到的最终证书开始,后面可以跟一个或者多个CA证书,最后一个证书是根证书。

比如现在证书的链式结构是A->B->C。

要想校验A证书的有效性,那么需要使用到B的公钥来验证,那么B的有效性,同样需要用到C的公钥来验证,这样层级验证一直到根证书为止。

什么是交叉认证呢?

假如现在有A->B和D->E这两条证书链。但是现在这两条链是独立的,假如A证书也想使用E来进行认证应该怎么处理呢?

先来考虑下A->B的含义,A->B意思是A证书使用B证书来签名的。更确切的说就是A证书是用B证书中的公钥来进行签名的。

如果我们使用E对B中的公钥进行签名得到一个证书C,那么B和C拥有相同的公钥,所以对于A来说,A->B和 A->C->E 都是有效的证书链。

如果使用B对E的公钥进行签名,得到证书F,那么对于D->E和 D->F->B 同样是两条有效的证书链。

这样的结构就叫做交叉认证。

交叉认证用在不同根CA链互相认证的场景,非常有用。

x.509证书的使用范围

x.509证书使用范围非常广泛,比如web访问中最常见的TLS/SSL 和 HTTPS 都是用的是x.509证书。

另外SMTP, POP, IMAP, LDAP, XMPP提供了对x.509证书的支持。

总结

以上就是x.509证书的使用和相关原理的介绍。

更多内容请参考 http://www.flydean.com/42-pki-x509/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

密码学系列之:PKI的证书格式表示X.509的更多相关文章

  1. openssl的证书格式转换

    证书转换 PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过 ...

  2. [转帖]公钥基础设施(PKI)/CFSSL证书生成工具的使用

    公钥基础设施(PKI)/CFSSL证书生成工具的使用 weilovepan520关注1人评论84344人阅读2018-05-26 12:22:20 https://blog.51cto.com/liu ...

  3. (备忘)openssl的证书格式转换

    PKCS 全称是Public-KeyCryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过15 个标准. ...

  4. 密码学系列之:PEM和PKCS7,PKCS8,PKCS12

    目录 简介 PEM PKCS7 PKCS8 PKCS12 总结 简介 PEM是一种常见的保存key或者证书的格式,PEM格式的文件一般来说后缀是以.pem结尾的.那么PEM到底是什么呢?它和常用的证书 ...

  5. 前端工程师技能之photoshop巧用系列第四篇——图片格式

    × 目录 [1]图片格式 [2]保存设置 前面的话 对于前端来说,图片格式是需要重要掌握的知识.本文是photoshop巧用系列第四篇——图片格式 图片格式 目前在前端的开发中常用的图片格式有jpg. ...

  6. 构建安全的Xml Web Service系列之wse之证书存储位置

    原文:构建安全的Xml Web Service系列之wse之证书存储位置 我们在前几天对xml web service的安全性提出了一些建议,大家可以通过以下地址访问: 构建安全的Xml Web Se ...

  7. elk系列3之通过json格式采集Nginx日志【转】

    转自 elk系列3之通过json格式采集Nginx日志 - 温柔易淡 - 博客园http://www.cnblogs.com/liaojiafa/p/6158245.html preface 公司采用 ...

  8. SSL 证书格式普及,PEM、CER、JKS、PKCS12

    根据不同的服务器以及服务器的版本,我们需要用到不同的证书格式,就市面上主流的服务器来说,大概有以下格式: .DER .CER,文件是二进制格式,只保存证书,不保存私钥. .PEM,一般是文本格式,可保 ...

  9. 基于OpenSSL的PKI的PKI数字证书系统实现

    本篇主要介绍了基于OpenSSL的PKI的PKI数字证书系统实现,利用OpenSSL建立一个CA中心的详细解决方案和建立的具体步骤. 1.PKI数字证书系统设计 PKI数字证书系统主要包括证书颁发机构 ...

随机推荐

  1. typora简单使用手册

    typora简单使用手册讲解`` 下载网站 网址:https://typoraio.cn/ 苹果电脑:https://typora.en.softonic.com/ 正版呢当然是收费 破解版自行百度 ...

  2. 使用Visual Studio 2019开发Qt程序

    安装Qt 如标题,你首先需要到 http://download.qt.io/ 去下载并安装Qt,并在引导下安装MSVC组件(这里不做过多解释) Visual Studio 2019 配置 打开VS20 ...

  3. 坐实大数据资源调度框架之王,Yarn为何这么牛

    摘要:Yarn的出现伴随着Hadoop的发展,使Hadoop从一个单一的大数据计算引擎,成为大数据的代名词. 本文分享自华为云社区<Yarn为何能坐实资源调度框架之王?>,作者: Java ...

  4. docker:registry

    存放docker镜像(mage)的地址,可供人上传下载镜像包: 下载 docker search whalesay --搜索whalesay镜像,该镜像用命令行的形式画了个鲸鱼并说了句话 docker ...

  5. 聊聊 node 如何优雅地获取 mac 系统版本

    背景 今天突然碰到了一个兼容性需求,需要根据不同 macOS 版本,进行不同的兼容性处理. 没想到看似简单的需求,中间也经历了一番波折,好在最后解决了问题. 在此记录一下解决问题的过程,也方便其他有类 ...

  6. 团队Beta演示

    组长博客 本组(组名)所有成员 短学号 姓名 2236 王耀鑫(组长) 2210 陈超颖 2209 陈湘怡 2228 许培荣 2204 滕佳 2205 何佳琳 2237 沈梓耀 2233 陈志荣 22 ...

  7. Django学习——分页器基本使用、分页器终极用法、forms组件之校验字段、forms组件之渲染标签、forms组件全局钩子,局部钩子

    内容 1 分页器基本使用 2 分页器终极用法 3 forms组件之校验字段 1 前端 <!DOCTYPE html> <html lang="en"> &l ...

  8. 三大特性,多个场景,Serverless 应用引擎 SAE 全面升级

    作者:营火 微服务能力大提升,更新增 Job.PHP 等场景,延展 Serverless 新边界 点击此处,获得阿里云 SAE 发布会直播 PPT! 企业的数字化随着互联网的普及发展越来越快,技术架构 ...

  9. 谈谈markdown

    谈谈markdown 欢迎关注我的博客,️点他即可. 最近一年开始学习有关编程的内容了. 迷上代码的我开始接触到一些好玩的东西,我发现很多事情都可以由代码来完成,甚至是ppt.同学就经常说我疯掉了,连 ...

  10. MOSFET, MOS管, 开关管笔记

    MOSFET, MOS管, 开关管 MOSFET, Metal-Oxide-Semiconductor Field-Effect Transistor, 金属氧化物半导体场效晶体管 常见封装 电路符号 ...