OpenSSL之创建中间证书

前言

OpenSSL系列的第二集。

创建完根证书之后,便可以继续创建中间证书信息了,这里以MidCA作为中间证书命名。

为什么要使用中间证书?

通过使用中间证书,可以减少根密钥的暴露风险,因为即使中间密钥被泄露,影响的范围也仅限于由该中间证书签发的证书。 密钥轮换:中间证书的密钥可以定期更换,而不需要更换根密钥。 这样可以保持根证书的长期稳定性,同时确保整个系统的安全性。

根证书、中间证书、目标证书,以及签名和验签(基于openssl)

版本说明

  • OpenSSL版本为3.0.13

专题跳转

创建属于自己的根证书(快捷指令版)

与创建根证书一致,这里记录着需要创建中间证书所需要的快捷指令方式,方便无脑CV,如需了解更多请前往 创建属于自己的中间证书(一步步操作版)

创建中间证书的文件夹及数据库

创建2.sh文件,并加入如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
# 创建中间证书所需要的全部文件信息
# 创建签发证书位置
if [ ! -d MidCA/crt ]; then
mkdir -p MidCA/crt
fi
# 创建根证书数据文件点
if [ ! -d MidCA/db ]; then
mkdir -p MidCA/db
touch MidCA/db/index
openssl rand -hex 16 > MidCA/db/serial
fi
# 创建密钥存放点
if [ ! -d MidCA/key ]; then
mkdir -p MidCA/key
fi
# 创建中间证书新证书记录存放点
if [ ! -d MidCA/newcerts ]; then
mkdir -p MidCA/newcerts
fi

之后./2.sh进行运行配置文件

创建中间证书配置文件touch ./conf/MidCA.cnf,并添加如下内容:

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
55
56
57
58
59
60
61
62
63
64
65
66
67
#
# OpenSSL example configuration file.
# See doc/man5/config.pod for more info.
#
# 整个项目的根目录,默认为当下
HOME = .

####################################################################
[ ca ]
default_ca = CA_default # The default ca section

####################################################################
[ CA_default ]
dir = ./MidCA
database = $dir/db/index.txt # 数据文件存放点(必要)
new_certs_dir = $dir/newcerts # 存放新证书 (必要)
private_key = ./KEY/Mid_CA.key # 私钥地址 (必要)
serial = $dir/db/serial # 当前序列号(必要)
certificate = RootCA/crt/Mid_CA.crt # 根证书签发文件位置
name_opt = ca_default # Subject Name options
cert_opt = ca_default # Certificate field options
crl_extensions = crl_ext # 添加撤销证书功能
default_days = 365 # 默认天数
default_crl_days= 30 # 默认30天获取撤销证书信息
default_md = sha256 # 公钥默认加密方式
preserve = no # keep passed DN ordering
policy = policy_match

# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

####################################################################
[ req ]
default_bits = 2048
prompt = no
distinguished_name = req_distinguished_name
string_mask = pkix

[ req_distinguished_name ]
C = CN
ST = TianJin
L = TJ
O = ZHYCarge
OU = ZHYCarge Mid CA
CN = ZHYCarge Mid CA
emailAddress = ZHYCarge@zhycarge.top


[ crl_ext ]
authorityKeyIdentifier=keyid:always

[ web1_cert ]
# www.zhycarge.top config
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = DNS:www.zhycarge.top
authorityInfoAccess=caIssuers;URI:http://ca.zhycarge.top/crt/Mid_CA.crt
crlDistributionPoints = URI:http://ca.zhycarge.top/crl/crl-Mid.crl

生成中间证书私钥:

openssl genrsa -aes256 -out KEY/Mid_CA.key 4096

生成中间证书签名请求:

openssl req -new -config ./conf/MidCA.cnf -sha256 -key /KEY/Mid_CA.key -out ./RootCA/csr/Mid_CA.csr

签发证书:

openssl ca -config ./conf/Root_CA.cnf -extensions v3_Web_ca -days 365 -notext -md sha256 -in ./RootCA/csr/Mid_CA.csr -out ./RootCA/crt/Web_CA.crt

至此证书无脑化生成完毕。

创建属于自己的中间证书(一步步操作版)

此处记录详细讲解内容,由于创建证书命令与根证书那里基本相同,因此不过多赘述

创建数据库及相关存储文件夹

创建中间证书的文件夹及数据库

创建中间证书的配置文件

此处内容一步步复制即可,相关讲解已附

创建中间证书配置文件touch ./conf/MidCA.cnf,并添加如下内容:

CA头

没什么可以讲解的,默认配置

1
2
3
4
5
6
7
8
9
10
11
12
#
# OpenSSL example configuration file.
# See doc/man5/config.pod for more info.
#
# 整个项目的根目录,默认为当下
HOME = .

####################################################################
[ ca ]
default_ca = CA_default # The default ca section

####################################################################

证书配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ CA_default ]
dir = ./MidCA # 与证书配套的配置文件夹
database = $dir/db/index.txt # 证书签发记录数据库
new_certs_dir = $dir/newcerts # 存放生成证书签名信息
private_key = ./KEY/Mid_CA.key # 当前证书私钥地址
serial = $dir/db/serial # 生成随机数,根据随机数进行索引记录
certificate = ./RootCA/crt/Mid_CA.crt # 当前证书签发文件位置
name_opt = ca_default # 默认
cert_opt = ca_default # 默认
crl_extensions = crl_ext # 添加撤销证书功能,与后续功能块联动
default_days = 365 # 默认证书天数
default_crl_days= 30 # 默认更新撤销证书实践
default_md = sha256 # 私钥默认加密方式
preserve = no # 不知道,暂存
policy = policy_match # 证书创建规则匹配,与后续功能块联动

证书规则匹配

1
2
3
4
5
6
7
8
9
# For the CA policy
# 前三个match 要求签发证书与当前CA一致,optional为可选项,supplied会在创建时进行输入
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

证书生成参数

1
2
3
4
5
[ req ]
default_bits = 2048 # 证书加密位数
prompt = no # 不需要显示提示信息,直接按照参数信息进行键入CN信息等
distinguished_name = req_distinguished_name # 参数信息,后面功能块联动
string_mask = pkix # 如果是utf8only,则键入英文可能会出现证书规则匹配错误,具体查看后面疑难杂症章节

证书参数信息

1
2
3
4
5
6
7
8
[ req_distinguished_name ]
C = CN # 国家代码,默认2位
ST = TianJin # 所在州省
L = TJ # 所在市
O = ZHYCarge # 组织名称
OU = ZHYCarge Mid CA # 组织唯一名称
CN = ZHYCarge Mid CA # 通用名称,要求唯一
emailAddress = ZHYCarge@zhycarge.top # 邮箱地址

用户证书签发参数

1
2
3
4
5
6
7
8
9
10
[ web1_cert ]
# www.zhycarge.top config # 自己做的备忘记录,记得这个参数对应的是哪个证书
basicConstraints = CA:FALSE # 是终端证书,不可再次签发证书
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment # 证书用途(在根证书讲解里有,查看之前博文)
extendedKeyUsage = serverAuth # 证书用途
subjectAltName = DNS:www.zhycarge.top # SAN信息
authorityInfoAccess=caIssuers;URI:http://ca.zhycarge.top/crt/Mid_CA.crt # AIA信息(在根证书讲解里有,查看之前博文)
crlDistributionPoints = URI:http://ca.zhycarge.top/crl/crl-Mid.crl # CRL信息(在根证书讲解里有,查看之前博文)

证书吊销列表参数

1
2
[ crl_ext ]
authorityKeyIdentifier=keyid:always # 与根证书同

subjectAltName讲解

现已知如果证书不添加这个值,在局域网中IP地址使用Chrome访问时会出现报错:缺少SAN。因此增加此项。

subjectAltName(SAN),是一项对X.509的扩展,它允许在安全证书中使用subjectAltName字段将多种值与证书关联[1],这些值被称为主题备用名称。名称可包括:[2]

subjectAltName wiki

信息标注说明:

可以添加多个,使用,分开,应该可以使用通配符,如DNS:*.zhycarge.top

  • IP地址标注:IP:127.0.0.1
  • 电子邮件地址:email:zhycarge@zhycarge.top
  • 域名信息:DNS:www.zhycarge.top

生成中间证书密钥

openssl genrsa -aes256 -out ./KEY/Mid_CA.key 4096

生成CSR文件

openssl req -new -config ./conf/MidCA.cnf -sha256 -key ./KEY/Mid_CA.key -out ./RootCA/csr/Mid_CA.csr

生成中间证书

openssl ca -config ./conf/Root_CA.cnf -extensions v3_Web_ca -days 365 -notext -md sha256 -in ./RootCA/csr/Mid_CA.csr -out ./RootCA/crt/Mid_CA.crt

其中这里使用的配置文件便是根证书的配置文件,在使用根证书配置文件时同时也许访问根证书私钥与根证书文件,因此请确保根证书配置文件中根证书私钥和根证书文件路径有效。

至此中间证书创建结束

其余操作

创建证书链

由于本教程搭建的证书链是通过AIA进行连接,因此在有网条件下签发证书时会自动连接好相关证书信息,但是如果是无网情况下需要签发证书链才能使用证书。(签发证书链过程可能会存在些许问题,暂由于使用AIA进行证书链生成,因此不再研究,若后续自身有需求或有人留言则会继续研究)

命令如下,中间证书在上,根证书在下,生成证书链,生成证书链便可导入到局域网机器中进行安装验证书

cat ./RootCA/crt/Mid_CA.crt ./RootCA/crt/RootCA.crt > ./RootCA/crt/CA_Mid.crt

尾言

暂无