OpenSSL生成CA(根证书)并自签署证书(支持IP地址)

Eave 2024.10.30 15:47

X.509证书包含三个文件:key,csr,crt

key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密

csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名

crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有的公钥,以及签署者的签名等信息

备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。

一、生成CA根证书

生成CA根证书私钥

openssl genrsa -des3 -out ca.pass.key 2048

去除CA私钥中的密码

openssl rsa -in ca.pass.key -out ca.key

生成CA根证书包括了国家(C=CN)、省/州(ST=BJ)、城市(L=BJ)、组织(O=MyRootCA)、组织单位(OU=MyCA)、通用名称(CN=CA)等信息

openssl req -new -sha256 -x509 -days 3650 -key ca.key -subj "/C=CN/ST=Chonqing/L=Chonqing/O=CA/OU=CA/CN=CA" -out ca.crt

二、生成服务器证书

生成v3.ext文件

cat > $HOST.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names
[alt_names]
DNS.1=${HOST} # 这里DNS替换成IP就可以签IP了
EOF

生成服务器证书

openssl req -newkey rsa:2048 -nodes -keyout $HOST.key -subj "/C=CN/ST=Chonqing/L=Chonqing/O=MyRootServer/OU=MyServer/CN=$HOST" -out $HOST.csr

对服务器证书进行签名

openssl x509 -req -sha256 -days 3650 -in $HOST.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out $HOST.crt -extfile $HOST.ext

以上命令中的-extfile $HOST.ext可以替换成-extfile <(printf "subjectAltName=IP:10.10.49.172[,DNS:,...]")

查看服务器证书信息

openssl x509 -text -noout -in $HOST.crt

三、信任CA证书

CentOS

cp rootCA.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust

Ubuntu

cp ca.crt /usr/local/share/ca-certificates/
update-ca-certificates

Windows

右键文件,选择安装证书,选择本地计算机,指定安装到受信任的根证书颁发机构,即可


附:证书生成脚本

#!/bin/bash

HOST=$1

# 判断是否有根证书,有就不生成根证书了
if [ ! -e "ca.crt" ]; then
    # 生成CA根证书私钥
    openssl genrsa -des3 -out ca.pass.key 2048

    # 去除CA根证书私钥中的密码
    openssl rsa -in ca.pass.key -out ca.key

    # 生成CA根证书 包括了国家(C=CN)、省/州(ST=BJ)、城市(L=BJ)、组织(O=MyRootCA)、组织单位(OU=MyCA)、通用名称(CN=CA)等信息
    openssl req -new -sha256 -x509 -days 3650 -key ca.key -subj "/C=CN/ST=Chonqing/L=Chonqing/O=CA/OU=CA/CN=CA" -out ca.crt
fi

# 生成v3.ext文件
cat > $HOST.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=@alt_names
[alt_names]
DNS.1=${HOST}
EOF

# 生成服务器证书
openssl req -newkey rsa:2048 -nodes -keyout $HOST.key -subj "/C=CN/ST=Chonqing/L=Chonqing/O=MyRootServer/OU=MyServer/CN=$HOST" -out $HOST.csr

# 对服务器证书进行签名
openssl x509 -req -sha256 -days 3650 -in $HOST.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out $HOST.crt -extfile $HOST.ext