使用OpenSSL构建私有CA

参考链接: https://blog.51cto.com/1inux/1638154

什么是CA

数字证书认证机构(英语:Certificate Authority,缩写为CA),是指发放、管理、废除数字证书的机构。CA的作用是检查证书持有者身份的合法性,并签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理。

为什么使用CA

CA 是PKI(Public Key Infrastructure)体系的核心。它为客户的公开密钥签发公钥证书、发放证书和管理证书,并提供一系列密钥生命周期内的管理服务。它将客户的公 钥与客户的名称及其他属性关联起来,为客户之间电子身份进行认证。证书中心是一个具有权威性、可信赖性和公证性的第三方机构。它是电子商务存在和发展的基础。

简单的说,使用CA不仅能保证数据的安全传输,还能保证目标的可信赖性。

CA配置文件

CA 配置文件位置:/etc/pki/tls/openssl.cnf

推荐链接: OpenSSL主配置文件openssl.cnf

CA服务器的建立

生成私钥文件

:文件位置及名称在配置文件 /etc/pki/tls/openssl.cnf 中已经定义:/etc/pki/CA/private/cakey.pem

1
2
3
4
5
# 生成私钥到CA目录,做为CA私钥
openssl genpkey \
-algorithm RSA \
-out /etc/pki/CA/private/cakey.pem \
-pkeyopt rsa_keygen_bits:2048

由于私钥文件被篡改后将会导致无法估计的灾难,所以一般都会对其进行权限的限制可以使用两种方法

1
2
3
4
5
6
# 一、
openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
chmod 400 /etc/pki/CA/private/cakey.pem

# 二、
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

生成自签证书

1
2
3
4
5
6
7
8
# 生成自签证书到CA目录,做为CA证书,后缀通常为crt
openssl req \
-x509 \
-days 3650 \
-new \
-key /etc/pki/CA/private/cakey.pem \
-out /etc/pki/CA/cacert.pem \
-subj "/C=CN/ST=ShanXi/L=XiAn/O=mars/CN=www.zhaolq.com/emailAddress=hello@zhaolq.com"

【参数中带 -x509 表示直接生成自签证书,不带则表示生成证书签署请求】

在线解码 CRT 证书,查看 CRT 证书内容能对 -subj 属性内容一目了然。

https://www.getssl.cn/decode_crt.php

https://www.ssleye.com/cer_check.html

创建两个文件

1
2
3
# 为了能使证书可以工作还需要创建两个文件
touch /etc/pki/CA/index.txt # 证书索引数据库文件(默认没有需要创建)
echo 01 > /etc/pki/CA/serial # 记录过去签发的所有证书的序列号【每签发一个证书 自动+1】 (文本文件 需要创建)

生成证书签署请求

生成私钥

1
2
3
4
5
# 生成一个新私钥
openssl genpkey \
-algorithm RSA \
-out /home/privatekey.pem \
-pkeyopt rsa_keygen_bits:2048

生成CSR(证书签署请求)

CA 配置文件中:

  • ca相关段,定义了 CSR 被 CA 签署时和 CA 证书的 DN 信息匹配规则。默认证书匹配策略是 [ policy_match ] 策略,要求CSR 中的 国家(Country缩写C)州/省份(State/Province缩写ST)组织/公司名称(Organization缩写O) 不可缺少且必须与CA证书一致,否则无法签署成功。
  • req相关段,定义了 CA 签署 CSR 时能够识别的 DN 信息及限制。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 利用新私钥生成证书签署请求
openssl req \
-new \
-key /home/privatekey.pem \
-out /home/req1.csr \
-subj "/C=CN/ST=ShanXi/O=mars/CN=www.zhaolq2.com/emailAddress=hello@zhaolq.com"

# 利用新私钥生成证书签署请求,和上一个CSR的DN信息不同
# 若想成功签署该CSR,需将CA配置文件中的证书匹配策略改为policy=policy_anything
openssl req \
-new \
-key /home/privatekey.pem \
-out /home/req2.csr \
-subj "/C=US/ST=beijing/L=beijing/O=Beijing Baidu Netcom Science Technology Co., Ltd/OU=service operation department/CN=baidu.com/emailAddress=hello@zhaolq.com"

注:CSR 文件后缀通常为:csr 。

在线解码 CSR ,查看 CSR 内容能对 -subj 属性内容一目了然:

https://www.getssl.cn/decode_csr.php

https://www.ssleye.com/csr_check.html

签署证书

用 CA 证书对 CSR 进行签名,为用户签发证书。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 利用自建CA的私钥和自签的CA证书,签署证书请求
openssl ca \
-keyfile /etc/pki/CA/private/cakey.pem \
-cert /etc/pki/CA/cacert.pem \
-days 3650 \
-in /home/req1.csr \
-out /home/cert1.pem
openssl ca \
-keyfile /etc/pki/CA/private/cakey.pem \
-cert /etc/pki/CA/cacert.pem \
-days 3650 \
-in /home/req2.csr \
-out /home/cert2.pem

$ cat /etc/pki/CA/serial
03

$ cat /etc/pki/CA/index.txt # 证书索引数据库文件
V 310119094423Z 01 unknown /C=CN/ST=ShanXi/O=mars/CN=www.zhaolq2.com/emailAddress=hello@zhaolq.com
V 310119094430Z 02 unknown /C=US/ST=beijing/L=beijing/O=Beijing Baidu Netcom Science Technology Co., Ltd/OU=service operation department/CN=baidu.com/emailAddress=hello@zhaolq.com

$ ls /etc/pki/CA/newcerts/ # 查看所有签署的证书,名称为证书序列号
01.pem 02.pem

# 02.pem与CA证书的国家、州、组织不同,证书匹配策略:policy=policy_anything
$ cat /etc/pki/CA/newcerts/02.pem
......忽略前面内容......
-----BEGIN CERTIFICATE-----
MIIENTCCAx2gAwIBAgIBAjANBgkqhkiG9w0BAQsFADB2MQswCQYDVQQGEwJDTjEP
MA0GA1UECAwGU2hhblhpMQ0wCwYDVQQHDARYaUFuMQ0wCwYDVQQKDARtYXJzMRcw
FQYDVQQDDA53d3cuemhhb2xxLmNvbTEfMB0GCSqGSIb3DQEJARYQaGVsbG9Aemhh
b2xxLmNvbTAeFw0yMTAxMjAwNjA4NDVaFw0zMTAxMTgwNjA4NDVaMIHIMQswCQYD
VQQGEwJVUzEQMA4GA1UECAwHYmVpamluZzEQMA4GA1UEBwwHYmVpamluZzE5MDcG
A1UECgwwQmVpamluZyBCYWlkdSBOZXRjb20gU2NpZW5jZSBUZWNobm9sb2d5IENv
LiwgTHRkMSUwIwYDVQQLDBxzZXJ2aWNlIG9wZXJhdGlvbiBkZXBhcnRtZW50MRIw
EAYDVQQDDAliYWlkdS5jb20xHzAdBgkqhkiG9w0BCQEWEGhlbGxvQHpoYW9scS5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBhYEbAIvtkOe3CCsN
AJv7wdu7z30hRuAaojNkNDkH7VXqJjig+KVthujPoj6INCWb1dkNYnO+55VlN+YD
lAFiOKSfHiu/UO3UuFVClNB0bXSiE4bPb+PrHUsm5eayJRueSR93RGVHLvWB0wV+
BXiUvcGKmOno0jBLQC8lh9WZP2xtH1J2tH9rxmL5zetbYQ8f5QNzABQTRz4Xuc1Z
NKQdeJIqR0GWuyRAPi6/EJKqfrrIUgwkkrhAGQgnaKqqm0ZF4QVvZ2gnSW8FpEUw
OF8TAM+b49e4s9wJuvOM31darwYzC3xDn62MNv0iWq7/v4neDxG0kAZdLiCMSlTc
XsedAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wg
R2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBS0i8yeDgPVK/LEX9CJ21in
WrEFdjAfBgNVHSMEGDAWgBRoJUyVwxYy1XL0JfIBHXZLne763DANBgkqhkiG9w0B
AQsFAAOCAQEAYx3mfWo55YaGYU7HemNfDYIK8Jv2QS9nF/7pxRipdYU+X9E8e7Fh
S6wmalIYH8CZhNYvJh9guUfmxA9faZSMyzcvyOaTPtf/Cf43LGhz1cf/52C6p2LJ
kew7JAV4G++Rg25tpT9LCZQEML5eE6OeHYZmMjzCbLk5/pRhn/dawHGGojfbtAI8
2Gkmu9jI6kN1NtOshaaGDWMm0Lrw/CwFgXLc+tHBrMqPPG0y0XB8FDjpY+dGE7Mc
OnpInE1vDic4V3v0ASCtuPjLwl2ygxApejM16QYheEzlsvYqahsFSZTy5OyH9OFw
XIUSfX2XXAYS9g4G7HRDaeY7Gp68+B3nPQ==
-----END CERTIFICATE-----

注:CA 证书后缀通常为:crt 。

吊销证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 获取吊销证书的序列号
openssl x509 -in /home/cert2.pem -noout -serial -subject
# 新建吊销证书编号文件,这个吊销编号与证书序列号无关,每次更新CRL都会+1
echo 01 > /etc/pki/CA/crlnumber


# 吊销证书
openssl ca -revoke /home/cert2.pem
$ cat /etc/pki/CA/index.txt # 证书索引数据库文件有变化
V 310119094423Z 01 unknown /C=CN/ST=ShanXi/O=mars/CN=www.zhaolq2.com/emailAddress=hello@zhaolq.com
R 310119094430Z 210121094520Z 02 unknown /C=US/ST=beijing/L=beijing/O=Beijing Baidu Netcom Science Technology Co., Ltd/OU=service operation department/CN=baidu.com/emailAddress=hello@zhaolq.com


# 根据index.txt(索引文件)中的信息 生成/更新 CRL。
openssl ca -gencrl -out /home/crl.pem # 此时crlnumber文件内容+1
# 获取PEM格式证书的crl文本内容
openssl crl -in /home/crl.pem -text -noout
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=CN/ST=ShanXi/L=XiAn/O=mars/CN=www.zhaolq.com/emailAddress=hello@zhaolq.com
Last Update: Jan 21 09:53:52 2021 GMT
Next Update: Feb 20 09:53:52 2021 GMT
CRL extensions:
X509v3 CRL Number:
3
Revoked Certificates:
Serial Number: 01
Revocation Date: Jan 21 09:53:39 2021 GMT
Serial Number: 02
Revocation Date: Jan 21 09:45:20 2021 GMT
Signature Algorithm: sha256WithRSAEncryption
91:78:41:65:a6:3b:7d:38:1c:9a:b8:2d:76:da:8f:9a:2b:a9:
32:82:e9:b9:ee:66:ad:30:8b:47:ba:59:1b:de:e6:1e:01:85:
06:8a:b8:f3:82:fa:ed:7d:ee:3b:95:b1:28:60:4b:7c:0a:e1:
0b:3a:b3:77:8a:7e:7c:96:c8:4a:be:d2:a7:47:93:5e:00:14:
c6:df:9e:04:ac:5d:1a:1f:54:bd:31:b3:80:30:0d:84:89:ce:
9e:76:a3:1c:a4:1b:f6:39:71:32:57:68:15:fd:ae:f7:d6:4a:
d3:53:66:7c:70:12:ad:54:66:66:9c:50:70:e0:a6:67:9e:87:
ab:88:d1:72:0d:61:0d:03:2c:75:8d:2b:87:08:5a:26:c6:77:
6a:d2:38:0f:29:f9:03:3b:26:4d:39:4c:d1:91:41:c9:ae:86:
a7:9b:85:10:10:dd:e8:fa:07:37:2e:92:91:8e:c7:57:1c:ba:
96:0e:43:a1:c3:c5:e6:60:59:fb:a8:b7:af:bd:cd:c9:b2:59:
f8:41:fa:ba:da:3a:dd:9e:04:06:c8:95:a2:68:e9:33:43:1c:
8f:3f:c7:e8:1e:ee:a3:e4:e7:e3:91:25:44:cc:bb:71:b3:ee:
5a:29:0b:f5:1c:74:d7:7f:64:12:5b:b1:d6:6d:e3:c6:3c:49:
31:49:8d:2a

Openssl证书文件类型及概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Openssl 证书文件类型及概念
证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL 、OCSP、SCEP等。
PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:
内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。
头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。
信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。
使用PEM格式存储的证书:
—–BEGIN CERTIFICATE—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE—–
使用PEM格式存储的私钥:
—–BEGIN RSA PRIVATE KEY—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END RSA PRIVATE KEY—–
使用PEM格式存储的证书请求文件:
—–BEGIN CERTIFICATE REQUEST—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE REQUEST—–
DER – 辨别编码规则 (DER) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。
PFX 或 P12 – 公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件。通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式合并转换为标准的PFX文件,你可以将PFX文件格式导入到微软IIS 5/6、微软ISA、微软Exchange Server等软件。转换时需要输入PFX文件的加密密码。
JKS – 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式”转换为标准的Java Key Store(JKS)文件。JKS文件格式被广泛的应用在基于JAVA的WEB服务器、应用服务器、中间件。你可以将JKS文件导入到TOMCAT、 WEBLOGIC 等软件。
KDB – 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式转换为标准的IBM KDB文件。KDB文件格式被广泛的应用在IBM的WEB服务器、应用服务器、中间件。你可以将KDB文件导入到IBM HTTP Server、IBM Websphere 等软件。
CSR - 证书请求文件(Certificate Signing Request)。生成 X509 数字证书前,一般先由用户提交证书申请文件,然后由 CA 来签发证书。大致过程如下(X509 证书申请的格式标准为 pkcs#10 和 rfc2314):
用户生成自己的公私钥对;
构造自己的证书申请文件,符合 PKCS#10 标准。该文件主要包括了用户信息、公钥以及一些可选的属性信息,并用自己的私钥给该内容签名;
用户将证书申请文件提交给 CA;
CA 验证签名,提取用户信息,并加上其他信息(比如颁发者等信息),用 CA 的私钥签发数字证书;
说 明:数字证书(如x.509)是将用户(或其他实体)身份与公钥绑定的信息载体。一个合法的数字证书不仅要符合 X509
格式规范,还必须有 CA 的签名。用户不仅有自己的数字证书,还必须有对应的私钥。X509v3
数字证书主要包含的内容有:证书版本、证书序列号、签名算法、颁发者信息、有效时间、持有者信息、公钥信息、颁发者 ID、持有者 ID 和扩展项。
OCSP – 在线证书状态协议(OCSP,Online Certificate Status
Protocol,rfc2560)用于实时表明证书状态。OCSP 客户端通过查询 OCSP
服务来确定一个证书的状态,可以提供给使用者一个或多个数字证书的有效性资料,它建立一个可实时响应的机制,让用户可以实时确认每一张证书的有效性,解决
由CRL引发的安全问题。。OCSP 可以通过 HTTP协议来实现。rfc2560 定义了 OCSP 客户端和服务端的消息格式。
CER - 一般指使用DER格式的证书。
CRT - 证书文件。可以是PEM格式。
KEY - 一般指PEM格式的私钥文件。
CRL -
证书吊销列表 (Certification Revocation List) 是一种包含撤销的证书列表的签名数据结构。CRL
是证书撤销状态的公布形式,CRL 就像信用卡的黑名单,用于公布某些数字证书不再有效。CRL
是一种离线的证书状态信息。它以一定的周期进行更新。CRL 可以分为完全 CRL和增量 CRL。在完全 CRL 中包含了所有的被撤销证书信息,增量
CRL 由一系列的 CRL 来表明被撤销的证书信息,它每次发布的 CRL 是对前面发布 CRL 的增量扩充。基本的 CRL
信息有:被撤销证书序列号、撤销时间、撤销原因、签名者以及 CRL 签名等信息。基于 CRL 的验证是一种不严格的证书认证。CRL 能证明在
CRL 中被撤销的证书是无效的。但是,它不能给出不在 CRL 中的证书的状态。如果执行严格的认证,需要采用在线方式进行认证,即 OCSP
认证。一般是由CA签名的一组电子文档,包括了被废除证书的唯一标识(证书序列号), CRL用来列出已经过期或废除的数字证书。它每隔一段时间就会更新,因此必须定期下载该清单,才会取得最新信息。
SCEP - 简单证书注册协议。基于文件的证书登记方式需要从您的本地计算机将文本文件复制和粘贴到证书发布中心,和从证书发布中心复制和粘贴到您的本地计算机。 SCEP可以自动处理这个过程但是CRLs仍然需要手工的在本地计算机和CA发布中心之间进行复制和粘贴。
PKCS7 – 加密消息语法(pkcs7),是各种消息存放的格式标准。这些消息包括:数据、签名数据、数字信封、签名数字信封、摘要数据和加密数据。
PKCS12 – pkcs12 (个人数字证书标准)用于存放用户证书、crl、用户私钥以及证书链。pkcs12 中的私钥是加密存放的

导出证书

Windows导出根证书

cmd:certmgr.msc

image-20210120103436410

image-20210120103601102

image-20210120103721991

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-----BEGIN CERTIFICATE-----
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
-----END CERTIFICATE-----