目录
文章目录
-
- 目录
- CA 认证原理浅析
- 基本概念
- PKI
- CA 认证中心(证书签发)
- X.509 标准
- 证书
- 证书的签发过程
- 自建 CA 签发证书并认证 HTTPS 网站的过程
- 使用 OpenSSL 自建 CA 并签发证书
CA 认证原理浅析
下面给出一个形象的例子来理解 CA 认证的原理与兴起的缘由。
普通的介绍信:
假设 A 公司的张三先生要到 B 公司去拜访,但是 B 公司的所有人都不认识他,他咋办捏?常用的办法是带公司开的一张介绍信,在信中说:“兹有张三先生前往贵公司办理业务,请给予接洽…云云”。然后在信上敲上A公司的公章。
张三先生到了 B 公司后,把介绍信递给 B 公司的前台李四小姐。李小姐一看介绍信上有 A 公司的公章,而且 A 公司是经常和 B 公司有业务往来的,这位李小姐就相信张先生不是歹人了。
引入中介机构的介绍信:
回到刚才的话题。如果和 B 公司有业务往来的公司很多,每个公司的公章都不同,那么前台就要懂得分辨各种公章,非常麻烦。所以,有某中介公司 C 发现了这个商机。C 公司专门开设了一项 “代理公章” 的业务。
今后,A 公司的业务员去 B 公司,需要带 2 个介绍信:
-
介绍信 1:含有 C 公司的公章及 A 公司的公章。并且特地注明:C 公司信任 A 公司。
-
介绍信 2:仅含有 A 公司的公章,然后写上:“兹有张三先生前往贵公司办理业务,请给予接洽…云云”。
你可能会问了,这样不是增加麻烦了吗?有啥好处捏?
主要的好处在于,对于接待公司的前台,就不需要记住各个公司的公章分别是啥样子的;他/她只要记住中介公司 C 的公章即可。当他/她拿到两份介绍信之后,先对介绍信 1 的 C 公章,验明正身;确认无误之后,再比对介绍信 1 和介绍信 2 的两个 A 公章是否一致。如果是一样的,那就可以证明介绍信 2 是可以信任的了。再者,即使是非对称加密系统,也不能保证公钥的分发是可靠的。为了防范公钥分发过程中的中间人攻击,需要一个可信的 “始祖” 公证人,这就是 CA 机构存在的意义。
基本概念
PKI
PKI(Public Key Infrastructure,公钥基础设施),是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系。简单来说,PKI 就是利用公钥理论和技术建立的提供安全服务的基础设施。PKI 技术是信息安全技术的核心,也是电子商务的关键和基础技术。PKI 既不是一个协议,也不是一个软件,它是一个标准,在这个标准之下发展出的为了实现安全基础服务目的的技术统称为 PKI。
CA 认证中心(证书签发)
CA(Certificate Authority,证书授权中心)是 PKI 的 “核心”,负责管理和签发证书的第三方机构。一般来说,CA 必须是所有行业和所有公众都信任的、认可的。它负责管理 PKI 下的所有用户(包括各种应用程序)的证书,把用户的公钥和用户的其他信息捆绑在一起,并在网上验证用户身份。除此之外,CA 还要负责用户证书的黑名单登记和黑名单发布。简单来说,CA 的核心功能就是 “发放” 和 “管理” 数字证书。
X.509 标准
X.509 定义了公钥证书的基本(信息,数据)结构,是国际电信联盟-电信(ITU-T)部分标准和国际标准化组织(ISO)证书格式标准。作为 ITU-ISO 目录服务系列标准的一部分,X.509 是定义了公钥证书结构的基本标准。1988 年首次发布,1993 年和 1996 年两次修订。当前使用的版本是 X.509 V3,它加入了扩展字段支持,这极大地增进了证书的灵活性。X.509 V3 证书包括一组按预定义顺序排列的强制字段,还有可选扩展字段,即使在强制字段中,X.509 证书也允许很大的灵活性,因为它为大多数字段提供了多种编码方案。X.509 V4 版已经推出。
X.509 标准在 PKI 中起到了举足轻重的作用,PKI 由小变大,由原来网络封闭环境到分布式开放环境,X.509 起了很大作用,可以说 X.509 标准是 PKI 的雏形。
PKI 是在 X.509 标准基础上发展起来的:
- SSL 公钥证书
- 证书废除列表 CRL(Certificate revocation lists,证书黑名单)
证书
PKI 的目的是使用公钥机制加密技术来保护通信的安全,而公钥算法涉及到很多的加密参数,同时 PKI 机制中还有对用户身份的识别的功能。为了满足这些需求,“证书” 就很自然的出现了。证书本质上是一个 ASCII 文本文件,它仅是将整个公钥机制中需要用到的各种数据都打包到一起,进行统一管理和分发。
SSL 公钥证书结构:
1. 证书版本号(Version)
版本号指明X.509证书的格式版本,现在的值可以为:
1) 0: v1
2) 1: v2
3) 2: v3
也为将来的版本进行了预定义
2. 证书序列号(Serial Number)
序列号指定由CA分配给证书的唯一的"数字型标识符"。当证书被取消时,实际上是将此证书的序列号放入由CA签发的CRL中,这也是序列号唯一的原因。
3. 签名算法标识符(Signature Algorithm)
签名算法标识用来指定由CA签发证书时所使用的"签名算法"。算法标识符用来指定CA签发证书时所使用的:
1) 公开密钥算法
2) hash算法
example: sha1WithRSAEncryption
须向国际知名标准组织(如ISO)注册
4. 签发机构名(Issuer)
此域用来标识签发证书的CA的X.500 DN(DN-Distinguished Name)名字。包括:
1) 国家(C)
2) 省市(ST)
3) 地区(L)
4) 组织机构(O)
5) 单位部门(OU)
6) 通用名(CN)
7) 邮箱地址
5. 有效期(Validity)
指定证书的有效期,包括:
1) 证书开始生效的日期时间
2) 证书失效的日期和时间
每次使用证书时,需要检查证书是否在有效期内。
6. 证书用户名(Subject)
指定证书持有者的X.500唯一名字。包括:
1) 国家(C)
2) 省市(ST)
3) 地区(L)
4) 组织机构(O)
5) 单位部门(OU)
6) 通用名(CN)
7) 邮箱地址
7. 证书持有者公开密钥信息(subject PublicKey Info)
证书持有者公开密钥信息域包含两个重要信息:
1) 证书持有者的公开密钥的值
2) 公开密钥使用的算法标识符。此标识符包含公开密钥算法和hash算法。
8. 扩展项(extension)
X.509 V3证书是在v2的基础上一标准形式或普通形式增加了扩展项,以使证书能够附带额外信息。标准扩展是指由X.509 V3版本定义的对V2版本增加的具有广泛应用前景的扩展项,任何人都
可以向一些权威机构,如ISO,来注册一些其他扩展,如果这些扩展项应用广泛,也许以后会成为标准扩展项。
9. 签发者唯一标识符(Issuer Unique Identifier)
签发者唯一标识符在第2版加入证书定义中。此域用在当同一个X.500名字用于多个认证机构时,用一比特字符串来唯一标识签发者的X.500名字。可选。
10. 证书持有者唯一标识符(Subject Unique Identifier)
持有证书者唯一标识符在第2版的标准中加入X.509证书定义。此域用在当同一个X.500名字用于多个证书持有者时,用一比特字符串来唯一标识证书持有者的X.500名字。可选。
11. 签名算法(Signature Algorithm)
证书签发机构对证书上述内容的签名算法
example: sha1WithRSAEncryption
12. 签名值(Issuer's Signature)
证书签发机构对证书上述内容的签名值
EXAMPLE:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
b9:cb:1f:9a:a1:8a:cc:5d
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
Validity
Not Before: Nov 9 07:27:51 2018 GMT
Not After : Nov 9 07:27:51 2019 GMT
Subject: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:cc:35:81:fb:bd:0b:85:27:c3:fc:1e:91:74:b6:
aa:9e:12:8c:8f:f3:53:83:77:13:cf:e0:ae:af:9f:
17:7d:6d:d4:27:b4:3c:27:72:2a:45:68:10:c6:6b:
67:53:77:15:8f:b7:2d:f3:33:ab:a1:e7:a2:02:a2:
a4:92:00:a1:e6:1e:37:23:ca:b4:5a:40:e6:09:42:
a0:6c:5b:fa:6d:15:93:13:3a:95:a1:e6:3a:e7:fb:
5e:32:ab:d0:3a:fb:63:2f:2f:18:68:a0:8f:10:77:
d9:a1:4d:a3:6e:89:41:b5:45:94:5e:32:f9:c8:36:
08:99:b8:aa:b5:73:56:da:21:67:6e:f1:51:b8:ad:
ce:7b:4e:06:97:92:f8:38:e9:dd:38:bd:88:b6:04:
59:0b:1b:a6:c9:0a:c8:49:8d:84:3f:44:a9:72:2e:
bf:4c:48:21:4b:f5:3f:ef:9f:5c:90:9f:ab:f3:fb:
c9:20:bc:e3:e8:e6:79:c5:75:1a:45:61:ed:47:ec:
56:22:52:94:40:4c:8b:ab:7a:ab:6d:68:ed:e6:09:
e3:4f:ef:f3:0e:8c:34:6e:6b:94:21:a1:72:d7:c5:
ce:d1:61:f0:bb:13:1d:1c:bf:b4:aa:64:e2:fd:a8:
3c:9b:17:9c:df:9d:9b:4e:84:5f:b1:df:d9:22:19:
e1:45
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3
X509v3 Authority Key Identifier:
keyid:73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
4a:d2:d0:9e:a6:7e:21:25:d7:20:4b:8d:98:0e:52:15:2d:90:
d0:bc:45:68:90:72:10:41:b2:40:3c:5d:bb:d4:32:b9:6a:ba:
a6:95:63:4a:1e:8c:0c:f3:7e:03:d8:4b:57:f5:e8:23:49:ae:
a7:56:22:49:fc:ee:5c:a9:73:75:06:78:a1:14:75:f1:fa:79:
b6:7c:89:bc:ec:38:fa:0b:9f:32:0c:47:86:9e:30:3c:85:ae:
5e:0f:5a:62:a0:b6:51:64:c4:ab:ed:f1:be:78:ff:a9:c1:6e:
93:4c:79:a8:4b:cd:b8:29:fb:ea:df:4d:e5:09:a9:54:69:89:
56:a4:d2:1b:74:2c:a7:6c:ac:24:34:3d:9c:1d:6c:c6:64:82:
71:d5:cc:a7:3e:c3:a6:ae:32:19:bc:29:bb:9b:15:ad:cd:c0:
67:20:6e:14:2b:9a:fb:82:32:30:84:73:04:65:49:3a:17:48:
1e:e7:7d:92:e9:fb:9e:71:f0:11:48:39:18:09:7e:4e:62:cb:
9a:90:6a:fb:27:1f:4c:f4:ac:6b:9b:4c:a7:86:e0:7d:e9:8e:
d2:f2:d0:ec:f3:09:a7:60:ad:73:0b:1a:db:e1:21:57:cf:3d:
22:f3:e0:be:e2:67:5d:ea:73:dd:90:7a:dc:47:ea:9f:f7:7d:
72:e8:25:87
证书的签发过程
- 服务端向第三方 CA 机构提交公钥、组织信息、个人信息等信息并申请认证;
- CA 通过线上、线下等多种手段验证申请者提供信息的真实性,如:组织是否存在、企业是否合法,是否拥有域名的所有权等;
- 信息审核通过,CA 会向申请者签发认证文件 — 证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;CA 使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即 “签名”;
- 客户端向服务端发出请求时,服务端响应证书文件给客户端;
- 客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
- 客户端然后验证证书相关的域名信息、有效时间等信息;
- 客户端会内置信任 CA 的证书信息(包含公钥),如果 CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法。
证书 = 公钥 + 申请者与颁发者信息 + 签名
简单的非对称加密系统中,客户端只需要获得服务器发放的公钥即可访问服务端。CA 体系下的客户端则需要获得 CA 机构签发的服务器证书以及 CA 机构的公钥,首先验证证书的可靠性之后才能获得服务端的公钥,继而访问服务端。
自建 CA 签发证书并认证 HTTPS 网站的过程
- CA 机构生成密钥对:公钥 ca.cer,私钥 ca.key
- 网站(Server 端)生成私钥 cert.key
- 网站将其公钥及网站信息(域名/组织 etc.)提交到 CA 机构,CA 机构结合自己的私钥 ca.key 签发网站证书 cert.cer
- 网站配置 Apache/Nginx 加载 cert.key 和 cert.cer 并运行 HTTPS 模块
- 用户首次通过浏览器访问网站,网站首先返回 cert.cer,由于 cert.cer 使用 CA 机构的私钥签发,因此可以通过保存在用户本地的公钥 ca.cer 进行验证
- 用户验证 cert.cer 和 ca.cer 的有效性。如果验证通过,则得到网站的公钥并以此访问网站;否则,提示用户风险信息
- 用户通过网站的公钥与网站交换对称加密共享密钥,进行正式的 SSL 会话
**所以,用户能够与网站建立 SSL 通信的关键在于用户是否拥有 CA 机构的根证书 ca.cer 和网站证书 cert.cer。**用户拿着 ca.cer 与 cert.cer 验证,只有通过后,用户才可以获得网站真实的公钥。
使用 OpenSSL 自建 CA 并签发证书
OpenSSL:是一个强大的安全套接字层密码库,利用 OpenSSL 我们可以建立 X.509 证书、证书签名请求(CSR)和 CRLs(证书回收列表)。
常用指令:
- 生成 RSA 私钥
openssl genrsa [args] [numbits]
-des: CBC模式的DES加密
-des3: CBC模式的3DES加密
-aes128: CBC模式的AES128加密
-aes192: CBC模式的AES192加密
-aes256: CBC模式的AES256加密
-passout arg arg为对称加密(des、3des、aes)的密码,使用该参数可以省去指令行交互提示输入密码环节
-out file 输出证书私钥文件
[numbits] 密钥长度
example 生成一个1024位的RSA私钥,并用3DES加密(密码为1111),保存为server.key文件
openssl genrsa -out server.key -passout pass:1111 -des3 1024
- 生成证书签名请求(CSR)
openssl req [options] outfile
-inform arg 输入文件格式 DER、PEM
-outform arg 输出文件格式 DER、PEM
-in arg 待处理文件
-out arg 待输出文件
-passin 用于签名待生成的请求证书的私钥文件的解密密码
-key file 用于签名待生成的请求证书的私钥文件
-keyform arg DER、NET、PEM
-new 新的请求
-x509 输出一个X509格式的证书
-days X509证书的有效时间
-newkey rsa:bits 生成一个bits长度的RSA私钥文件,用于签发
-[digest] HASH算法 md5、sha1、md2、mdc2、md4
-config file 指定openssl配置文件
-text text显示格式
example1 利用CA的RSA密钥创建一个自签署的CA证书(X.509结构)
openssl req -new -x509 -days 3650 -key server.key -out ca.crt
example2 用server.key生成证书签署请求CSR(这个CSR用于之外发送待CA中心等待签发)
openssl req -new -key server.key -out server.csr
example3 查看CSR的细节:
openssl req -noout -text -in server.csr
- x509 证书操作
openssl x509 [args]
-inform arg 待处理X509证书文件格式 DER、NET、PEM
-outform arg 待输出X509证书文件格式 DER、NET、PEM
-in arg 待处理X509证书文件
-out arg 待输出X509证书文件
-req 表明输入文件是一个"请求签发证书文件(CSR)",等待进行签发
-days arg 表明将要签发的证书的有效时间
-CA arg 指定用于签发请求证书的根CA证书
-CAform arg 根CA证书格式(默认是PEM)
-CAkey arg 指定用于签发请求证书的CA私钥证书文件,缺省认为私有密钥在CA证书文件里有
-CAkeyform arg 指定根CA私钥证书文件格式(默认为PEM格式)
-CAserial arg 指定序列号文件(serial number file)
-CAcreateserial 如果序列号文件(serial number file)没有指定,则自动创建它
example1 转换DER证书为PEM格式
openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
example2 使用根CA证书对"请求签发证书"进行签发,生成x509格式证书
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
example3 打印出证书的内容
openssl x509 -in server.crt -noout -text
- CA 签名
openssl ca [options]:
-selfsign 使用对证书请求进行签名的密钥对来签发证书。即"自签名",这种情况发生在生成证书的CA客户端与签发证书的CA服务器都是同一台机器,此时我们可以使用同一个密钥对来进行"自签名"
-in file 需要进行处理的PEM格式的证书
-out file 处理结束后输出的证书文件
-cert file 用于签发的根CA证书
-days arg 指定签发的证书的有效时间
-keyfile arg CA的私钥证书文件
-keyform arg CA的根私钥证书文件格式: PEM、ENGINE
-key arg CA的根私钥证书文件的解密密码(如果加密了的话)
-config file 配置文件
example 利用 CA 证书 ca.crt 签署请求证书 server.crt:
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
EXAMPLE:
Step 1. 设定 OpenSSL CA 配置文件
默认的配置文件为 /etc/pki/tls/openssl.cnf,每个 CA 中心可以指定一个配置文件。
cp /etc/pki/tls/openssl.cnf ~/openssl.cnf
修改 ~/openssl.cnf 为:
各配置的含义注释得比较清楚,需要注意的是 CA 中心的路径为 /root/demoCA。
Step 2. 搭建 CA 中心
所谓 CA 中心,本质是一个 dir,正如上文提到的 /root/demoCA。它有着拥有固定的目录结构:
/*
CA 中心目录结构
-- demoCA/
|-- index.txt
|-- newcerts/
|-- private/
|-- serial
*/
CERT_DIR=~/demoCA
mkdir -p $CERT_DIR
cd $CERT_DIR
mkdir newcerts private
chmod 700 private
# prepare files
touch index.txt
echo 01 > serial
-
newcerts dir:存放 CA 签署(颁发)过的数字证书
-
private dir:存放 CA 的私钥
-
serial file:存放证书序列号,可自定义第一张证书的序号(e.g. 01),之后每新建一张证书,序列号会自动加 1。
-
index.txt file:存放证书信息
Step 3. 生成 CA 证书的 RSA 私钥
$ openssl genrsa -passout pass:foobar -des3 -out ~/demoCA/private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
....................+++
..................................................+++
e is 65537 (0x10001)
$ ll ~/demoCA/private/cakey.pem
-rw-r--r--. 1 root root 1751 Nov 9 07:18 /root/demoCA/private/cakey.pem
$ cat ~/demoCA/private/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,B017FD40FE243E30
QKV/gR2rC/E5gogSoDuascRfQKoVUfBekIiTtROUPKmW6R74EYh4SoxRhW1WKNQa
xtD4583SC99aCjrKCETUPrQAijX9wxuL3bSevWzH6Uxba1XX9YEUOMA8vRThR1e4
rK+HKXT/S7w39ku8+YfwjmO64DCkGVl1T35GHe+De2oXxE6gaUbpgz/KZiOuo0yV
1SRHCK03PQ6nYEqMyk67UGT0gQ1NLwEEB4eTZxHkyheTAXrCazAYrSGqTXsx5rCJ
mOU2G63/w/ktbW+YGphk7P4myhvkgNflm/Lh9JOGxrAgjAk6Ay6T7wMT17zKqKYk
j9AqLh36Ph6876PYnxnf2UFMye8yl+boxUlfnc+GA1C2SEXHcucDHcic+ae5tGwy
mltY7EeC0+MB/U1UvdeBZOK1wAoKW5nS7WW5C2Mg9ZJZ1H7FXUk8h9oLwS1sgcVN
hOwsHRJtR8k1+iutcOTnDcN07IWDaCzFQi4Z9K+w1uCIH1Zky2DYixr2HNpmbEFD
CcBDMpmqZD92ReVVW5Taa1i4TB6YgCVKCMysNmTGE9QqiMcCdZQ1jBhN3+Z0SAaR
sHCWK0gOVF6lIdYEk8y6bW1VPgINNzsKL0aX/gt44JBS9Z7xKwJlS1yCNnHVVtZQ
wRd+gwMEPxXq+U8OQsvyBFHCXZWEbLSWAYMsNGU3iH84gNEhEH54PmEtBKRSt6KJ
83BUu+P9wcXBvnc6GncDPXa7+O6xmdKHzdYKrJPLlkW8XL0zOqgnpe6/vx+WZiDN
N4f0ej83VhuwrIfhfC6vU7kTPPcM9fmS0B4NCa6MR6W/Q2Y6NIV+jI3IX6YvyLUA
aPxX2sAirahGpFgMGzAPCNw3Bsqsf7lOsw8baH3jkeCj61PCEQhBwHJRzjl2yuVu
0w3c5kKDepiqlq2hnQtx3XGScDwhrAVitGtTRBhxfZoiy1vLLvB/fye/DLbqP/z3
MnNRSM9rIxYap6Usy0rpBQGyeNAYlpWKhhl3qWQLV84OVkV8cfkp0vEhgstXyIKv
A/klaloD5gCt5WBt/iBjuFxf1W/DfzVD9FAgRG+9qL3ZZBLqs7Q6OPXSISlnaK6r
/uGTHgenPHkdVDN+eWhpMKYAPvwKiBBTq8WIz4zkBJQGxs9JVgEzKmvQXAbcafFj
HWvuykPo3WZ59ACLl59vDoPMNl+Mi11mH0Ye3jsxckWIMCzE3N+INwqdBmF90vbU
jelvO+QFyY4bpx3+T3kJydDIAJSjwRMA+4mPdYlH9hyE9rOLt4ObWY1//5fHEVuw
3SSW3Cf1FTSTsRvyuTm0ORPNogzPsIfnnUFnSoukXYBvFmbXXeWxKbbomzcubjCx
FP5O6/6LVw4V0YOl4E9CAJZ8pcHDRz6uauXM4Ig8MTpHdNyd07o0hC56bD07mTnt
0ifBucs9grQ0mxdCbIl3BNgg2J7mRYpXAtIhXDR9VyGxvoa5cgeKUsdECyAavfJp
xJgvC/0NFWNampB5fhMp9mnLRy7LzqnmHdUJpXntKzfH16Vu6MB3jE8YVORc313v
wFv5k7AiQVAplWBLEU4/opFkB97FuvRlmms5lK2umePezGjPunpobq4Qe5Gwocw2
-----END RSA PRIVATE KEY-----
可见 /root/demoCA/private/cakey.pem 就是一个 RSA 的密(私)钥。
Step 4. 生成 CA 的根证书(公钥)
NOTE:下述指令一并完成了 CA 证书签名请求 & 对证书进行自签名两件事情。
$ openssl req -x509 -passin pass:foobar -new -nodes -key ~/demoCA/private/cakey.pem -days 365 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -out ca_01.pem
$ ll
total 8
-rw-r--r--. 1 root root 1289 Nov 9 07:27 ca_01.pem
-rw-r--r--. 1 root root 0 Nov 9 07:17 index.txt
drwxr-xr-x. 2 root root 6 Nov 9 07:17 newcerts
drwx------. 2 root root 22 Nov 9 07:19 private
-rw-r--r--. 1 root root 3 Nov 9 07:17 serial
$ cat ca_01.pem
-----BEGIN CERTIFICATE-----
MIIDizCCAnOgAwIBAgIJALnLH5qhisxdMA0GCSqGSIb3DQEBCwUAMFwxCzAJBgNV
BAYTAlVTMQ8wDQYDVQQIDAZEZW5pYWwxFDASBgNVBAcMC1NwcmluZ2ZpZWxkMQww
CgYDVQQKDANEaXMxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTAeFw0xODExMDkw
NzI3NTFaFw0xOTExMDkwNzI3NTFaMFwxCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZE
ZW5pYWwxFDASBgNVBAcMC1NwcmluZ2ZpZWxkMQwwCgYDVQQKDANEaXMxGDAWBgNV
BAMMD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAMw1gfu9C4Unw/wekXS2qp4SjI/zU4N3E8/grq+fF31t1Ce0PCdyKkVoEMZr
Z1N3FY+3LfMzq6HnogKipJIAoeYeNyPKtFpA5glCoGxb+m0VkxM6laHmOuf7XjKr
0Dr7Yy8vGGigjxB32aFNo26JQbVFlF4y+cg2CJm4qrVzVtohZ27xUbitzntOBpeS
+Djp3Ti9iLYEWQsbpskKyEmNhD9EqXIuv0xIIUv1P++fXJCfq/P7ySC84+jmecV1
GkVh7UfsViJSlEBMi6t6q21o7eYJ40/v8w6MNG5rlCGhctfFztFh8LsTHRy/tKpk
4v2oPJsXnN+dm06EX7Hf2SIZ4UUCAwEAAaNQME4wHQYDVR0OBBYEFHPUtuHJXbnO
cJEFB6PEnC397rijMB8GA1UdIwQYMBaAFHPUtuHJXbnOcJEFB6PEnC397rijMAwG
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAErS0J6mfiEl1yBLjZgOUhUt
kNC8RWiQchBBskA8XbvUMrlquqaVY0oejAzzfgPYS1f16CNJrqdWIkn87lypc3UG
eKEUdfH6ebZ8ibzsOPoLnzIMR4aeMDyFrl4PWmKgtlFkxKvt8b54/6nBbpNMeahL
zbgp++rfTeUJqVRpiVak0ht0LKdsrCQ0PZwdbMZkgnHVzKc+w6auMhm8KbubFa3N
wGcgbhQrmvuCMjCEcwRlSToXSB7nfZLp+55x8BFIORgJfk5iy5qQavsnH0z0rGub
TKeG4H3pjtLy0OzzCadgrXMLGtvhIVfPPSLz4L7iZ13qc92QetxH6p/3fXLoJYc=
-----END CERTIFICATE-----
NOTE:-key
指定了新建证书使用的密钥文件;-x509
生成 x509 标准的证书。
Step 5. 查看 CA 证书的内容
$ openssl x509 -in ca_01.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
b9:cb:1f:9a:a1:8a:cc:5d
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
Validity
Not Before: Nov 9 07:27:51 2018 GMT
Not After : Nov 9 07:27:51 2019 GMT
Subject: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:cc:35:81:fb:bd:0b:85:27:c3:fc:1e:91:74:b6:
aa:9e:12:8c:8f:f3:53:83:77:13:cf:e0:ae:af:9f:
17:7d:6d:d4:27:b4:3c:27:72:2a:45:68:10:c6:6b:
67:53:77:15:8f:b7:2d:f3:33:ab:a1:e7:a2:02:a2:
a4:92:00:a1:e6:1e:37:23:ca:b4:5a:40:e6:09:42:
a0:6c:5b:fa:6d:15:93:13:3a:95:a1:e6:3a:e7:fb:
5e:32:ab:d0:3a:fb:63:2f:2f:18:68:a0:8f:10:77:
d9:a1:4d:a3:6e:89:41:b5:45:94:5e:32:f9:c8:36:
08:99:b8:aa:b5:73:56:da:21:67:6e:f1:51:b8:ad:
ce:7b:4e:06:97:92:f8:38:e9:dd:38:bd:88:b6:04:
59:0b:1b:a6:c9:0a:c8:49:8d:84:3f:44:a9:72:2e:
bf:4c:48:21:4b:f5:3f:ef:9f:5c:90:9f:ab:f3:fb:
c9:20:bc:e3:e8:e6:79:c5:75:1a:45:61:ed:47:ec:
56:22:52:94:40:4c:8b:ab:7a:ab:6d:68:ed:e6:09:
e3:4f:ef:f3:0e:8c:34:6e:6b:94:21:a1:72:d7:c5:
ce:d1:61:f0:bb:13:1d:1c:bf:b4:aa:64:e2:fd:a8:
3c:9b:17:9c:df:9d:9b:4e:84:5f:b1:df:d9:22:19:
e1:45
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3
X509v3 Authority Key Identifier:
keyid:73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
4a:d2:d0:9e:a6:7e:21:25:d7:20:4b:8d:98:0e:52:15:2d:90:
d0:bc:45:68:90:72:10:41:b2:40:3c:5d:bb:d4:32:b9:6a:ba:
a6:95:63:4a:1e:8c:0c:f3:7e:03:d8:4b:57:f5:e8:23:49:ae:
a7:56:22:49:fc:ee:5c:a9:73:75:06:78:a1:14:75:f1:fa:79:
b6:7c:89:bc:ec:38:fa:0b:9f:32:0c:47:86:9e:30:3c:85:ae:
5e:0f:5a:62:a0:b6:51:64:c4:ab:ed:f1:be:78:ff:a9:c1:6e:
93:4c:79:a8:4b:cd:b8:29:fb:ea:df:4d:e5:09:a9:54:69:89:
56:a4:d2:1b:74:2c:a7:6c:ac:24:34:3d:9c:1d:6c:c6:64:82:
71:d5:cc:a7:3e:c3:a6:ae:32:19:bc:29:bb:9b:15:ad:cd:c0:
67:20:6e:14:2b:9a:fb:82:32:30:84:73:04:65:49:3a:17:48:
1e:e7:7d:92:e9:fb:9e:71:f0:11:48:39:18:09:7e:4e:62:cb:
9a:90:6a:fb:27:1f:4c:f4:ac:6b:9b:4c:a7:86:e0:7d:e9:8e:
d2:f2:d0:ec:f3:09:a7:60:ad:73:0b:1a:db:e1:21:57:cf:3d:
22:f3:e0:be:e2:67:5d:ea:73:dd:90:7a:dc:47:ea:9f:f7:7d:
72:e8:25:87
可见新建的 CA 证书内含了与密钥文件对应的公钥信息。
Step 6. 生成 Server 证书密钥文件 & 证书签名请求
同样应用了 RSA 机制,创建出 Server 的私钥及 Server 证书签名请求文件。
$ openssl req -newkey rsa:2048 -nodes -keyout client.key -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -out client.csr
Generating a 2048 bit RSA private key
...........................................................................+++
.............................................................................................................................................................................................+++
writing new private key to 'client.key'
-----
$ ll
total 16
-rw-r--r--. 1 root root 1289 Nov 9 07:27 ca_01.pem
-rw-r--r--. 1 root root 989 Nov 9 07:57 client.csr
-rw-r--r--. 1 root root 1704 Nov 9 07:57 client.key
-rw-r--r--. 1 root root 0 Nov 9 07:17 index.txt
drwxr-xr-x. 2 root root 6 Nov 9 07:17 newcerts
drwx------. 2 root root 22 Nov 9 07:19 private
-rw-r--r--. 1 root root 3 Nov 9 07:17 serial
$ cat client.key
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDeyPWkug8CbxK9
lNdise3ta93ao7qqQ4u0kEiVvPUyMH6lWrtoIVDpcita/ycT60AvynscNX4bIwPR
vUfn19A7Y5iMZCI+PsgN+d/3B29QZUXF7ypmeC6OF/b7MAbFrtpSWG6OqS9/rh7a
P0wuYYmoRdrB2MHDpETn+aJZUe+Yj4qvQEl9sr47shfGw6Af6VCxJ8Q89CBKGAQZ
Jg2OykWaf7j8rvN5WqBtRxTuYAS52JSthQcVbd/hc35dg9xXTcRCJp/7vymw95ox
U5VyY0JWI51ih3dUhZOLXeb/ZdBAwtw23WK0wRrhxdmRpyQsOjlp3aNjN1B8y52w
KaOa6VqTAgMBAAECggEAMhAImy6wRsS8+lsjF2uSYsLVhNc8EBzDnRy7IuLmWpPp
MbE04c5yxzK/qWAi4OgBcXvXtFwU7XYt2ojlSqUFhwL3ebzasRAcln9rI7DJA9Du
H++BoKsrEwUxm/qL2wpSxyRWG7rLEK8JAdQtg1Kpw2WHJf5WdGdKkLJZGCdAZxCX
IO0/cEk90uhbCpbbagHmiByTDAenVYyGJG1klpHlt8TCBh1LCepczXw5QXDUmGsY
zlnvjwrKHXO6zzCJGMmpTOkEDKTErcWyE+IlZ7wEfS8bFvVJJIxUzJEBWqde40DR
wXuwqLvXw82sERp0O/j1TRsH48Xiw5LxD8wMq0iwaQKBgQD2NTCAoiPatHXJfaCb
JygPUh9qr1Y5vdGS49WR99s1t8LEfUkfwqziuhoMK/pMqV7GxkfLT6vbJsGvLYvK
C0yXppHkOjb4aKT13brZQr+PTeOY8qDOpZJDii0CpDt0fUej0IONW6ZgIDYb739K
yqRjA8JqQ767w9/jnlCos41jdwKBgQDnpUlnLE7Uk4WyqAPi5z6lsEL/V5QA2E+g
Nny0d7Al2KXN8bzlXwJQfCQIyFdBdJ/0yAYUI7l7DSmS6/pcbg/p3UQYHjRC+BOC
YoHjhqbOmSUNLf7R0Ia28uNdc8jdbiK9kOWXLc/aI31r2aIdlba0PXWCvlaoRTCN
eCmGZZawxQKBgCzCGqEn2LDHoaoRhoLuKWAvo7p3SYuRsGmttYOltVocn/GsfQCj
GV7WSinwTL5nA+3K2f5h63IZp5g7BXCjgTcIdvkwhBHApEx2FKOueLiKhleltAod
G2vf0LLsPEq/A6kKHQAzqxlKgcuuTEvCbwP5CPzcd+4We7sbarpgedGdAoGAEQwZ
7czV9FDy+uXge1dXRexF0fLJApLosTqxTLquLOrXsONEaoDmc7PfFwJfYYLKrsH1
qI/Ee6jJUXWqVBkJdMWC2F+IqxEEpojHVE45gmTE1EZ5RUmaUGZpkxwNQTZ0ugyq
yMhnTn9kIIbApnq5GmSXfEqzp+iHnTGlpK1fPJ0CgYAJWMcxz9ajBQV+bn07/lgY
SAwFGjnMI/kFy0E/kIuxm6+VSkJ5BC+L1qRlmXe/kg7cMvpINxZ6ySy24YO87jn1
rY4cLwqZ+nKTe6ZPbjUFcuPZRbQrvL98eOoUBzdUdrapU1z1POKVIQDB7+MD2q8c
c4VhhRAEpFJqs8xya2ANnw==
-----END PRIVATE KEY-----
$ cat client.csr
-----BEGIN CERTIFICATE REQUEST-----
MIICoTCCAYkCAQAwXDELMAkGA1UEBhMCVVMxDzANBgNVBAgMBkRlbmlhbDEUMBIG
A1UEBwwLU3ByaW5nZmllbGQxDDAKBgNVBAoMA0RpczEYMBYGA1UEAwwPd3d3LmV4
YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3sj1pLoP
Am8SvZTXYrHt7Wvd2qO6qkOLtJBIlbz1MjB+pVq7aCFQ6XIrWv8nE+tAL8p7HDV+
GyMD0b1H59fQO2OYjGQiPj7IDfnf9wdvUGVFxe8qZngujhf2+zAGxa7aUlhujqkv
f64e2j9MLmGJqEXawdjBw6RE5/miWVHvmI+Kr0BJfbK+O7IXxsOgH+lQsSfEPPQg
ShgEGSYNjspFmn+4/K7zeVqgbUcU7mAEudiUrYUHFW3f4XN+XYPcV03EQiaf+78p
sPeaMVOVcmNCViOdYod3VIWTi13m/2XQQMLcNt1itMEa4cXZkackLDo5ad2jYzdQ
fMudsCmjmulakwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAMi72WVtaxwmgeMl
WydHUhDTcrGOKo7ncuwaEfmtH/D8sGBgYY0OFb9vtsNWLdVPt+8JGTqgaXfQLCBp
5J5BcrwbN5EikWrPNU/WdR532Eou6C3kKVoISmSGsg9xQNq1V7LLMO1iLkeP1+lr
cn1Is7He/3+TpHQjo6aF8IMPSjx22UaCaNgESbh81Xp3K7/v/BS2lhAb/HorHBt5
+emwTTrAbk0/q8X22svPUmmu55AdWZ4LZbQETENcsyx+YwmNXFnDk4FbBh1m8+f4
j0jftulqi89iGP8hayNPWqhDLy+RcNoCJ15hZeqpSudJ2xkf/NsUilRm+W4fW5lk
0avPyfs=
-----END CERTIFICATE REQUEST-----
Step 7. 签发 Server 证书
签发 Server 证书时,会根据该配置文件 openssl.cnf 加载 CA 证书并集合 Server 证书签名请求文件来完成签名。
NOTE:所以如果下述指令报错,建议检查 openssl.cnf 中各证书文件路径配置是否正确。
$ openssl ca -passin pass:foobar -config ~/openssl.cnf -in client.csr -out client-.pem -batch
Using configuration from /root/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Nov 9 08:04:16 2018 GMT
Not After : Nov 9 08:04:16 2019 GMT
Subject:
countryName = US
stateOrProvinceName = Denial
organizationName = Dis
commonName = www.example.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
B7:3D:8E:E8:2C:D3:48:58:E1:3B:E6:9B:DB:E5:98:8A:C2:12:16:44
X509v3 Authority Key Identifier:
keyid:73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3
Certificate is to be certified until Nov 9 08:04:16 2019 GMT (365 days)
Write out database with 1 new entries
Data Base Updated
$ cat client-.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=Denial, L=Springfield, O=Dis, CN=www.example.com
Validity
Not Before: Nov 9 08:04:16 2018 GMT
Not After : Nov 9 08:04:16 2019 GMT
Subject: C=US, ST=Denial, O=Dis, CN=www.example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:de:c8:f5:a4:ba:0f:02:6f:12:bd:94:d7:62:b1:
ed:ed:6b:dd:da:a3:ba:aa:43:8b:b4:90:48:95:bc:
f5:32:30:7e:a5:5a:bb:68:21:50:e9:72:2b:5a:ff:
27:13:eb:40:2f:ca:7b:1c:35:7e:1b:23:03:d1:bd:
47:e7:d7:d0:3b:63:98:8c:64:22:3e:3e:c8:0d:f9:
df:f7:07:6f:50:65:45:c5:ef:2a:66:78:2e:8e:17:
f6:fb:30:06:c5:ae:da:52:58:6e:8e:a9:2f:7f:ae:
1e:da:3f:4c:2e:61:89:a8:45:da:c1:d8:c1:c3:a4:
44:e7:f9:a2:59:51:ef:98:8f:8a:af:40:49:7d:b2:
be:3b:b2:17:c6:c3:a0:1f:e9:50:b1:27:c4:3c:f4:
20:4a:18:04:19:26:0d:8e:ca:45:9a:7f:b8:fc:ae:
f3:79:5a:a0:6d:47:14:ee:60:04:b9:d8:94:ad:85:
07:15:6d:df:e1:73:7e:5d:83:dc:57:4d:c4:42:26:
9f:fb:bf:29:b0:f7:9a:31:53:95:72:63:42:56:23:
9d:62:87:77:54:85:93:8b:5d:e6:ff:65:d0:40:c2:
dc:36:dd:62:b4:c1:1a:e1:c5:d9:91:a7:24:2c:3a:
39:69:dd:a3:63:37:50:7c:cb:9d:b0:29:a3:9a:e9:
5a:93
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
B7:3D:8E:E8:2C:D3:48:58:E1:3B:E6:9B:DB:E5:98:8A:C2:12:16:44
X509v3 Authority Key Identifier:
keyid:73:D4:B6:E1:C9:5D:B9:CE:70:91:05:07:A3:C4:9C:2D:FD:EE:B8:A3
Signature Algorithm: sha256WithRSAEncryption
be:55:53:6c:80:a6:dc:47:d9:fc:cc:0d:46:c1:48:f7:8a:da:
74:d9:b3:c3:fe:3e:d1:60:9e:c4:64:e9:5f:9a:ec:72:cd:a7:
d0:76:4c:96:e2:84:45:9e:f6:d9:fb:d1:c4:6f:8f:ab:95:54:
a2:37:84:a2:ef:80:30:10:c8:60:3b:c6:76:5c:86:ca:07:84:
ed:74:7a:41:a9:dd:a7:a4:c8:91:c4:1b:06:1b:fd:a7:59:6a:
be:02:24:3b:c0:47:92:08:dd:72:5c:d3:d3:3f:ff:64:14:ed:
72:d3:9c:e9:0d:5c:53:63:33:b4:3d:27:2b:15:07:2b:43:d2:
c1:6e:8f:9f:61:23:07:f5:b7:d6:98:99:1e:37:57:a3:14:5a:
93:97:2a:b1:2c:92:e6:c0:a2:3c:80:e4:60:2c:ca:d3:db:0d:
86:35:19:86:e8:80:fd:30:26:71:92:29:a6:01:c9:52:9a:4a:
33:5e:32:c9:7d:bb:7d:c5:eb:ee:eb:8d:e7:6d:34:34:73:5b:
c1:d3:31:45:2e:f4:2b:f6:05:b2:e5:59:b0:2a:8a:64:ef:6e:
b6:12:79:d5:ca:e1:03:bf:80:14:3a:0e:9c:56:8e:8a:69:24:
cc:3a:b0:00:6b:b8:39:6b:6a:51:ac:6f:db:52:ac:9a:bf:e0:
b7:95:18:3f
-----BEGIN CERTIFICATE-----
MIIDmDCCAoCgAwIBAgIBATANBgkqhkiG9w0BAQsFADBcMQswCQYDVQQGEwJVUzEP
MA0GA1UECAwGRGVuaWFsMRQwEgYDVQQHDAtTcHJpbmdmaWVsZDEMMAoGA1UECgwD
RGlzMRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20wHhcNMTgxMTA5MDgwNDE2WhcN
MTkxMTA5MDgwNDE2WjBGMQswCQYDVQQGEwJVUzEPMA0GA1UECAwGRGVuaWFsMQww
CgYDVQQKDANEaXMxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAN7I9aS6DwJvEr2U12Kx7e1r3dqjuqpDi7SQ
SJW89TIwfqVau2ghUOlyK1r/JxPrQC/Kexw1fhsjA9G9R+fX0DtjmIxkIj4+yA35
3/cHb1BlRcXvKmZ4Lo4X9vswBsWu2lJYbo6pL3+uHto/TC5hiahF2sHYwcOkROf5
ollR75iPiq9ASX2yvjuyF8bDoB/pULEnxDz0IEoYBBkmDY7KRZp/uPyu83laoG1H
FO5gBLnYlK2FBxVt3+Fzfl2D3FdNxEImn/u/KbD3mjFTlXJjQlYjnWKHd1SFk4td
5v9l0EDC3DbdYrTBGuHF2ZGnJCw6OWndo2M3UHzLnbApo5rpWpMCAwEAAaN7MHkw
CQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2Vy
dGlmaWNhdGUwHQYDVR0OBBYEFLc9jugs00hY4Tvmm9vlmIrCEhZEMB8GA1UdIwQY
MBaAFHPUtuHJXbnOcJEFB6PEnC397rijMA0GCSqGSIb3DQEBCwUAA4IBAQC+VVNs
gKbcR9n8zA1GwUj3itp02bPD/j7RYJ7EZOlfmuxyzafQdkyW4oRFnvbZ+9HEb4+r
lVSiN4Si74AwEMhgO8Z2XIbKB4TtdHpBqd2npMiRxBsGG/2nWWq+AiQ7wEeSCN1y
XNPTP/9kFO1y05zpDVxTYzO0PScrFQcrQ9LBbo+fYSMH9bfWmJkeN1ejFFqTlyqx
LJLmwKI8gORgLMrT2w2GNRmG6ID9MCZxkimmAclSmkozXjLJfbt9xevu643nbTQ0
c1vB0zFFLvQr9gWy5VmwKopk7262EnnVyuEDv4AUOg6cVo6KaSTMOrAAa7g5a2pR
rG/bUqyav+C3lRg/
-----END CERTIFICATE-----
NOTE:-config
指定 CA 中心对应的 openssl.cnf 配置文件的路径。
再简单回顾一下,自建 CA 证书的过程:
- 自建 CA 中心并生成 CA 证书
- 结合 Server 公钥和 CA 证书签发 Server 证书
- Client 拿着 Server 证书、 CA 公钥两张 “证明” 向 Server 端发出 SSL 通信请求