生成CA自签名根证书和颁发证书和证书提取

2023-06-10 17:47:15 浏览数 (1)

生成CA自签名根证书和颁发证书和证书提取

CA(Certificate Authority)被称为证书授权中心,是数字证书发放和管理的机构。

根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。

生成CA证书私钥

代码语言:javascript复制
1# 生成aes128位编码的 密码为Test@2022 2048位的 key 文件  (带密码 、加密格式 aes、des 3des等)
2openssl genrsa -aes128 -passout pass:Test@2022 -out ca_private.key 2048
3# 生成 2048位的 key 文件  (不带密码,加密格式 等)
4openssl genrsa -out ca_private.key 2048 
5# 也可生成  ca_private.pem 文件,将后缀.key 变更为.pem
6openssl genrsa -aes128 -passout pass:Test@2022 -out ca_private.pem 2048
7openssl genrsa -out ca_private.pem 2048

生成CA证书请求文件

代码语言:javascript复制
1# 有效期20年
2# 也可以 将后缀.key 变更为.pem 带密码(注意目录,文件放在哪个目录下,一会用的到,别找不到路径)
3openssl req -new -key ca_private.key -passin pass:Test@2022 -out ca_req.csr -days 7300
4# 不带密码
5openssl req -new -key ca_private.key  -out ca_req.csr -days 7300 
6# 填写 国家、机构、密码等,按实际情况填写即可

生成CA根证书

代码语言:javascript复制
1# 注意目录,文件放在哪个目录下,一会用的到,别找不到路径
2openssl x509 -req -in ca_req.csr -signkey ca_private.key -out ca_root.crt -days 7300 -passin pass:Test@2022
3# 不带密码
4openssl x509 -req -in ca_req.csr -signkey ca_private.key -out ca_root.crt -days 7300

注:接下来服务器证书要根据 以上证书 来生成

服务器证书生成

与根节点服务器证书类似,只是生成 服务器证书的第三部要依赖 生成的 ca 根证书

代码语言:javascript复制
 1# 1. 生成服务器私钥 
 2openssl genrsa -aes128 -passout pass:Test@2022 -out server_private.key 2048
 3## 带秘钥 带加密方式 等同 ca 第一步
 4## 可以 去掉密码 去掉加密 方式
 5openssl genrsa -out server_private.key 2048
 6
 7# 2. 生成服务端的待签名证书
 8## 有效期10年
 9openssl req -new -key server_private.key -passin pass:Test@2022 -out server_req.csr -days 3650
10## 无密码可以去掉密码部分
11openssl req -new -key server_private.key -out server_req.csr -days 3650
12
13# 3. 使用CA根证书对服务端证书签名
14## key版
15openssl x509 -req -in server_req.csr -days 3650  -CAkey ca_private.key -CA ca_root.crt -CAcreateserial  -out server.crt
16## pem 版本
17openssl x509 -req -in server_req.csr -days 3650  -CAkey ca_private.pem -CA ca_root.pem -CAcreateserial  -out server.crt

chrome错误

错误码:NET::ERR_CERT_COMMON_NAME_INVALID

错误信息:此服务器无法证实它就是 mousemin.com - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接。

解决方案

新建一个文件 ext.ini,写入以下内容:

代码语言:javascript复制
1basicConstraints = CA:FALSE
2keyUsage = nonRepudiation, digitalSignature, keyEncipherment
3subjectAltName = @alt_names
4 
5[alt_names]
6DNS.1 = *.mousemin.com
7DNS.2 = mousemin.com

alt_names 下面填写上所有的域名即可,然后签发证书的时候带上参数:

代码语言:javascript复制
1openssl x509 ... -extfile ext.ini

服务器证书生成脚本

代码语言:javascript复制
 1#!/usr/bin/env bash
 2set -e
 3
 4File=$1
 5if [[ "${File}" == "" ]]
 6then
 7  echo "gen.sh filename [domain...]"
 8  exit
 9fi
10
11if [[ "$#" < 1 ]]
12then
13  echo "gen.sh filename [domain...]"
14  exit
15fi
16
17domains=($*)
18
19# 生成私钥
20openssl genrsa -out ${File}.key 2048
21
22# 生成服务端的待签名证书
23openssl req -new -key ${File}.key -out ${File}.csr -days 3650
24
25# 生成ext.ini
26echo "basicConstraints = CA:FALSE" > ${File}_ext.ini
27echo "keyUsage = nonRepudiation, digitalSignature, keyEncipherment" >> ${File}_ext.ini
28echo "subjectAltName = @alt_names" >> ${File}_ext.ini
29echo "[alt_names]" >> ${File}_ext.ini
30
31for(( i=1; i<${#domains[@]}; i  )) do
32  echo "DNS.${i} = ${domains[i]}" >> ${File}_ext.ini
33done
34
35for(( i=0;i<${#domains[@]};i  )) do
36  echo "DNS.${i} = ${domains[i]}" >> ${File}_ext.ini
37done
38
39# 使用CA根证书对服务端证书签名
40openssl x509 -req -in ${File}.csr -days 3650 -CAkey ca_private.key -CA ca_root.crt -CAcreateserial -out ${File}.crt -extfile ${File}_ext.ini
41
42rm -f ${File}.csr ${File}_ext.ini

一键生成

代码语言:javascript复制
1openssl req -newkey rsa:4096 -x509 -sha256 -days 3650 -nodes -out mousemin.com.crt -keyout mousemin.com.key

0 人点赞