生成CA自签名根证书和颁发证书和证书提取
mousemin 2023/2/9 CAopenssl
CA(Certificate Authority)被称为证书授权中心,是数字证书发放和管理的机构。
根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。
# 生成CA证书私钥
# 生成aes128位编码的 密码为Test@2022 2048位的 key 文件 (带密码 、加密格式 aes、des 3des等)
openssl genrsa -aes128 -passout pass:Test@2022 -out ca_private.key 2048
# 生成 2048位的 key 文件 (不带密码,加密格式 等)
openssl genrsa -out ca_private.key 2048
# 也可生成 ca_private.pem 文件,将后缀.key 变更为.pem
openssl genrsa -aes128 -passout pass:Test@2022 -out ca_private.pem 2048
openssl genrsa -out ca_private.pem 2048
1
2
3
4
5
6
7
2
3
4
5
6
7
# 生成CA证书请求文件
# 有效期20年
# 也可以 将后缀.key 变更为.pem 带密码(注意目录,文件放在哪个目录下,一会用的到,别找不到路径)
openssl req -new -key ca_private.key -passin pass:Test@2022 -out ca_req.csr -days 7300
# 不带密码
openssl req -new -key ca_private.key -out ca_req.csr -days 7300
# 填写 国家、机构、密码等,按实际情况填写即可
1
2
3
4
5
6
2
3
4
5
6
# 生成CA根证书
# 注意目录,文件放在哪个目录下,一会用的到,别找不到路径
openssl x509 -req -in ca_req.csr -signkey ca_private.key -out ca_root.crt -days 7300 -passin pass:Test@2022
# 不带密码
openssl x509 -req -in ca_req.csr -signkey ca_private.key -out ca_root.crt -days 7300
1
2
3
4
2
3
4
注:接下来服务器证书要根据 以上证书 来生成
# 服务器证书生成
与根节点服务器证书类似,只是生成 服务器证书的第三部要依赖 生成的 ca 根证书
# 1. 生成服务器私钥
openssl genrsa -aes128 -passout pass:Test@2022 -out server_private.key 2048
## 带秘钥 带加密方式 等同 ca 第一步
## 可以 去掉密码 去掉加密 方式
openssl genrsa -out server_private.key 2048
# 2. 生成服务端的待签名证书
## 有效期10年
openssl req -new -key server_private.key -passin pass:Test@2022 -out server_req.csr -days 3650
## 无密码可以去掉密码部分
openssl req -new -key server_private.key -out server_req.csr -days 3650
# 3. 使用CA根证书对服务端证书签名
## key版
openssl x509 -req -in server_req.csr -days 3650 -CAkey ca_private.key -CA ca_root.crt -CAcreateserial -out server.crt
## pem 版本
openssl x509 -req -in server_req.csr -days 3650 -CAkey ca_private.pem -CA ca_root.pem -CAcreateserial -out server.crt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# chrome错误
错误码:NET::ERR_CERT_COMMON_NAME_INVALID
错误信息:此服务器无法证实它就是 mousemin.com - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。
# 解决方案
新建一个文件 ext.ini
,写入以下内容:
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.mousemin.com
DNS.2 = mousemin.com
1
2
3
4
5
6
7
2
3
4
5
6
7
alt_names
下面填写上所有的域名即可,然后签发证书的时候带上参数:
openssl x509 ... -extfile ext.ini
1
# 服务器证书生成脚本
#!/usr/bin/env bash
set -e
File=$1
if [[ "${File}" == "" ]]
then
echo "gen.sh filename [domain...]"
exit
fi
if [[ "$#" < 1 ]]
then
echo "gen.sh filename [domain...]"
exit
fi
domains=($*)
# 生成私钥
openssl genrsa -out ${File}.key 2048
# 生成服务端的待签名证书
openssl req -new -key ${File}.key -out ${File}.csr -days 3650
# 生成ext.ini
echo "basicConstraints = CA:FALSE" > ${File}_ext.ini
echo "keyUsage = nonRepudiation, digitalSignature, keyEncipherment" >> ${File}_ext.ini
echo "subjectAltName = @alt_names" >> ${File}_ext.ini
echo "[alt_names]" >> ${File}_ext.ini
for(( i=1; i<${#domains[@]}; i++)) do
echo "DNS.${i} = ${domains[i]}" >> ${File}_ext.ini
done
for(( i=0;i<${#domains[@]};i++)) do
echo "DNS.${i} = ${domains[i]}" >> ${File}_ext.ini
done
# 使用CA根证书对服务端证书签名
openssl x509 -req -in ${File}.csr -days 3650 -CAkey ca_private.key -CA ca_root.crt -CAcreateserial -out ${File}.crt -extfile ${File}_ext.ini
rm -f ${File}.csr ${File}_ext.ini
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
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
# 一键生成
openssl req -newkey rsa:4096 -x509 -sha256 -days 3650 -nodes -out mousemin.com.crt -keyout mousemin.com.key
1