简介

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

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

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

一个证书的例子

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

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

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

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

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

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

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

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

  1. openssl req -new -x509 -days 20 -key ca.key -out ca.crt
  2. Enter pass phrase for ca.key:
  3. You are about to be asked to enter information that will be incorporated
  4. into your certificate request.
  5. What you are about to enter is what is called a Distinguished Name or a DN.
  6. There are quite a few fields but you can leave some blank
  7. For some fields there will be a default value,
  8. If you enter '.', the field will be left blank.
  9. -----
  10. Country Name (2 letter code) []:SH
  11. State or Province Name (full name) []:SH
  12. Locality Name (eg, city) []:SH
  13. Organization Name (eg, company) []:HW
  14. Organizational Unit Name (eg, section) []:HW
  15. Common Name (eg, fully qualified host name) []:caserver
  16. Email Address []:flydean@163.com

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

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

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

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

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

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

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

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

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

  1. openssl req -new -key ca.key -out server.csr
  2. Enter pass phrase for ca.key:
  3. You are about to be asked to enter information that will be incorporated
  4. into your certificate request.
  5. What you are about to enter is what is called a Distinguished Name or a DN.
  6. There are quite a few fields but you can leave some blank
  7. For some fields there will be a default value,
  8. If you enter '.', the field will be left blank.
  9. -----
  10. Country Name (2 letter code) []:CN
  11. State or Province Name (full name) []:SH
  12. Locality Name (eg, city) []:SH
  13. Organization Name (eg, company) []:citi
  14. Organizational Unit Name (eg, section) []:org
  15. Common Name (eg, fully qualified host name) []:client
  16. Email Address []:flydean@163.com
  17. Please enter the following 'extra' attributes
  18. to be sent with your certificate request
  19. A challenge password []:

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

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

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

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

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

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

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

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

    //修改系统配置 cd /etc/profile //末尾加如下代码 export LC_ALL="zh_CN.GBK"export LANG="zh_CN.GBK&qu ...

  2. Bootstrap Blazor 组件库 Row 布局组件(栅格系统)

    原文链接:https://www.cnblogs.com/ysmc/p/16133351.html 在 Bootstrap 中,栅格相信大家都很熟悉,简直就是布局神器啊,Bootstrap Blazo ...

  3. XCTF练习题---MISC---Cephalopod

    XCTF练习题---MISC---Cephalopod flag:HITB{95700d8aefdc1648b90a92f3a8460a2c} 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是 ...

  4. Dockerfile 中对常用命令详解

    说明 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 在Dockerfile 中命令书写对先后顺序及表示其执行对顺序,在书写时需注意. 约定 命令不 ...

  5. Nessus简单介绍与安装

    1.Nessus简单介绍与安装 1.Nessus简介 Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它.该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库.Ne ...

  6. [AcWing 796] 子矩阵的和

    点击查看代码 #include<iostream> using namespace std; const int N = 1e3 + 10; int a[N][N], s[N][N]; i ...

  7. clion 预编译文件的查看

    看了一圈网上也没有我能一下就能看的懂的配置教程 我就手打一篇给在用clion的同学来参考一下 本文适用于g++编译 cmake Ninja生成器 clion 默认使用的是CMAKE来构建程序 生成器用 ...

  8. Linux vs Unix - Linux与Unix到底有什么不同?

    来自:Linux迷链接:https://www.linuxmi.com/linux-vs-unix.html Linux和Unix这两个术语可以互换地用来指同一操作系统.这在很大程度上是由于他们惊人的 ...

  9. DOM0级同DOM2级

    DOM0级分为两个:一是写在标签内的onclick事件: <button id="btn" onclick="alert('happy')">按钮& ...

  10. 关于background-*的一些属性

    1.盒模型 盒模型从外到内一次为:margin-box.border-box.padding-box.content-box. 2.一些属性设置的相对位置 ⑴background-position的属 ...