证书服务(四)opensslCA证书中心


七:openssl证书中心

1.简介

看到前面的签名命令了么?没关系,再看一遍

openssl ca -in SANserver.csr \
    -policy policy_anything \
    -cert  rootCA.crt \
    -keyfile rootCA.key \
    -batch \
    -extensions SAN \
    -config <(cat /etc/pki/tls/openssl.cnf \
        <(printf "[SAN]\nsubjectAltName=DNS:server.jackadam.ml")) \
    -out ./SANserver.crt

明显这是openssl为CA中心准备的命令。

而且我们还费劲的写上了cert **** keyfile ****

这真的是没用好啊。属于强制使用。

2.opensslCA中心的准备

还是签名命令当中,我们cat /etc/pki/tls/openssl.cnf,就是openssl的配置文件,我们进去看看有什么东西。

[ CA_default ]

dir        = /etc/pki/CA        # 主存储路径
certs        = $dir/certs        # 颁发的证书存储位置
crl_dir        = $dir/crl        # 吊销的证书存储位置
database    = $dir/index.txt    # 数据库索引文件。
#unique_subject    = no            # 设置为“否”以允许创建同一主题的多个证书。
new_certs_dir    = $dir/newcerts        # 新证书的默认位置。

certificate    = $dir/cacert.pem     # CA证书文件
serial        = $dir/serial         # 当前序列号文件
crlnumber    = $dir/crlnumber    # 吊销的序列号,必须注释掉才能留下V1 CRL文件
crl        = $dir/crl.pem         # 吊销的证书
private_key    = $dir/private/cakey.pem# CA私钥

x509_extensions    = usr_cert        # X509扩展



#注释掉“传统”的以下两行(严重破坏)格式。
name_opt     = ca_default        # Subject Name options
cert_opt     = ca_default        # Certificate field options

#复制扩展选项:小心使用。
# copy_extensions = copy

#要添加到CRL的扩展。注意:Netscape communicator在V2 CRL上阻塞
#因此,这在默认情况下被注释掉,留下一个V1 CRL。
#crlnumber也必须注释掉,以留下V1 CRL。
# crl_extensions    = crl_ext

default_days    = 365            # 默认证书有效期
default_crl_days= 30            # 多久更新吊销列表
default_md    = sha256        # 默认使用SHA256加密
preserve    = no            # 连续DN顺序

# 指定请求校验的方法
# 对于CA类型,必须提供属性并且相同。
policy        = policy_match

简单翻译一下,我英文也不好,这计算机专业英语,更是翻译的也不太通顺。凑活看吧。

关心的其实就是路径配置,文件配置。

3.检查目录

echo "以下为目录"
dir="/etc/pki/CA" # 主存储路径
certs="${dir}/certs" # 颁发的证书存储位置
crl_dir="${dir}/crl" # 吊销的证书存储位置
new_certs_dir="${dir}/newcerts" # 新证书的默认位置。
private="${dir}/private"

4.检查文件

private_key="${dir}/private/cakey.pem" # CA私钥
certificate="${dir}/cacert.pem" # CA证书文件
serial="${dir}/serial" # 当前序列号文件
database= "${dir}/index.txt" # 数据库索引文件。
crl= "${dir}/crl.pem" # 吊销的证书
crlnumber="${dir}/crlnumber" # 吊销的序列号,必须注释掉才能留下V1 CRL文件

5.创建CA证书

连同目录,文件,证书,一起做个脚本吧。

#!/bin/bash


C=CN
ST=HeNan
L=ZhengZhhou
O=FreeNet
CAOU=CA
CACN=ca.test.com
SERVERCN=test.test.com
CLIENTCN=client.test.com
SANCN=san.test.com
emailAddress=test@test.com

echo $dir
if [ ! -d $dir ];then
    echo "CA已创建,退出脚本 "
    exit "CA已创建,退出"
fi


echo "以下为目录"
dir="/etc/pki/CA"      # 主存储路径
certs="${dir}/certs"       # 颁发的证书存储位置
crl_dir="${dir}/crl"        # 吊销的证书存储位置
new_certs_dir="${dir}/newcerts"        # 新证书的默认位置。
private="${dir}/private"
echo $dir
echo $certs
echo $crl_dir
echo $new_certs_dir
echo $private

echo "以下为文件"
private_key="${dir}/private/cakey.pem" # CA私钥
certificate="${dir}/cacert.pem"     # CA证书文件
serial="${dir}/serial"         # 当前序列号文件
database="${dir}/index.txt"    # 数据库索引文件。
crl="${dir}/crl.pem"         # 吊销的证书
crlnumber="${dir}/crlnumber"    # 吊销的序列号,必须注释掉才能留下V1 CRL文件
echo $private_key
echo $certificate
echo $serial
echo $database
echo $crl
echo $crlnumber

echo $dir
if [ -d $dir ];then
    echo "CA已创建,退出脚本 "
    exit 1
fi

all_path="$dir $certs $crl_dir $new_certs_dir $private"
for path in $all_path
do
    if [ ! -d $path ];then
        echo "目录不存在,创建$path"
        mkdir -p $path
    fi
done

echo '创建数据库索引'
if [ ! -f /etc/pki/CA/index.txt ];then
    touch /etc/pki/CA/index.txt 
fi
echo '创建默认序列号'
if [ ! -f /etc/pki/CA/serial ];then
    echo "01" > /etc/pki/CA/serial 
fi

echo '创建CA私钥'
openssl genrsa -out cakey.pem 1024 
cp cakey.pem $private_key
echo '用私钥创建CA自签名证书'
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650  -subj "/C=$C/ST=$ST/L=$L/O=$O/OU=$CAOU/CN=$CACN/emailAddress=jackadam@sina.com"
cp cacert.pem $certificate

6.创建证书请求 签发证书

还是写脚本吧

#!/bin/bash



C=CN
ST=HeNan
L=ZhengZhhou
O=FreeNet
CAOU=CA
CACN=ca.test.com
test1=test1.test.com
test2=test2.test.com
test3=test3.test.com
SANCN=san.test.com
emailAddress=test@test.com


echo "SAN证书"
echo "SANserver私钥"
openssl genrsa -out ./SANserver.pem 4096


echo "SANtest1证书请求"
openssl req -new -sha256 -key ./SANserver.pem \
    -subj "/C=${C}/ST=${ST}/L=${L}/O=${O}/OU=${CAOU}/CN=${test1}/emailAddress=${emailAddress}" \
    -extensions v3_req \
    -out SANtest1.csr 
    
echo "Openssl 不带入请求中的san扩展"
openssl ca -in SANtest1.csr \
    -batch \
    -extensions v3_req \
    -out ./SANtest1.crt
    
echo "SANtest2证书请求"
openssl req -new -sha256 -key ./SANserver.pem \
    -subj "/C=${C}/ST=${ST}/L=${L}/O=${O}/OU=${CAOU}/CN=${test2}/emailAddress=${emailAddress}" \
    -extensions v3_req \
    -out SANtest2.csr 
    
echo "Openssl 手动带入san扩展"
openssl ca -in SANtest2.csr \
    -batch \
    -extensions SAN \
    -config <(cat /etc/pki/tls/openssl.cnf \
        <(printf "[SAN]\nsubjectAltName=DNS:${test2}")) \
    -out ./SANtest2.crt

echo "SANtest3证书请求"
openssl req -new -sha256 -key ./SANserver.pem \
    -subj "/C=${C}/ST=${ST}/L=${L}/O=${O}/OU=${CAOU}/CN=${test3}/emailAddress=${emailAddress}" \
    -extensions v3_req \
    -config <(cat /etc/pki/tls/openssl.cnf \
        <(printf "[req]\nreq_extensions = req_ext\n[req_ext]\nsubjectAltName=DNS:${test3}")) \
    -out SANtest3.csr 
    
echo "Openssl 带入请求中的san扩展"
openssl ca -in SANtest3.csr \
    -batch \
    -extensions v3_req \
    -config <(cat /etc/pki/tls/openssl.cnf \
        <(printf "[ CA_default ]\ncopy_extensions = copy\n")) \
    -out ./SANtest3.crt

7.查看签发证书信息

openssl req -noout -text -in SANtest1.csr
openssl req -noout -text -in SANtest2.csr
openssl req -noout -text -in SANtest3.csr
openssl x509 -text -noout -in SANtest1.crt
openssl x509 -text -noout -in SANtest2.crt
openssl x509 -text -noout -in SANtest3.crt

8.吊销证书

创建注销列表
echo 01 > /etc/pki/CA/crlnumber

获取证书编号:
openssl x509 -noout -serial -subject -in test.crt

注销证书
openssl ca -revoke /etc/pki/CA/newcerts/03.pem

更新证书注销列表
openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem

9.证书吊销列表(CRL)

证书吊销列表 (Certificate Revocation List ,简称: CRL) 是 PKI 系统中的一个结构化数据文件,该文件包含了证书颁发机构 (CA) 已经吊销的证书的序列号及其吊销日期。 CRL 文件中还包含证书颁发机构信息、吊销列表失效时间和下一次更新时间,以及采用的签名算法等。证书吊销列表最短的有效期为一个小时,一般为 1 天,甚至一个月不等,由各个证书颁发机构在设置其证书颁发系统时设置。

证书吊销列表分发点 (CRL Distribution Point ,简称 CDP) 是含在数字证书中的一个可以共各种应用软件自动下载的最新的 CRL 的位置信息。一个 CDP 通常出现在数字证书的 详细信息 选项卡的 CRL 分发点 域,一般会列出多个使用不同的访问方法,以确保如 Web 浏览器和 Web 服务器程序始终可以获取最新的 CRL 。 CDP 一般是一个可以访问 http 网址。

10.证书状态在线查询协议(OCSP)

 OCSP(Online Certificate Status Protocol)即在线证书状态协议,是一个互联网协议,用于获取符合X.509标准的数字证书的状态。OCSP是维护服务器和其它网络资源安全性的两种普遍模式之一。OCSP协议的产生是用于在公钥基础设施(PKI)体系中替代证书吊销列表(CRL)来查询数字证书的状态,当用户试图访问一个服务器时,在线证书状态协议发送一个对于证书状态信息的请求。服务器回复一个“有效”、“过期”或“未知”的响应。

1)与CRL相比OCSP消息中信息内容更少,这能减少网络的负担和客户端的资源;

2)由于OCSP响应端需要解析的信息更少,客户端提供的用于解析消息的库函数更简单;

3)OCSP向发起响应方公开了一个特定的网络主机在特定时刻所使用的特定证书。由于OCSP并不强制加密该证书,因此信息可能被第三方拦截。

11.改用别的CA中心

这还要http服务啊,openssl默认也没有带,做实验自己生成证书,用openssl还是挺方便的,但是企业证书,有注册,有注销,有域信任,还是windowsCA中心更方便一点吧。

下面一篇应该将windowsCA中心,正好看看windowsCA中心如何处理CRL和OCSP。

不行的话还有第三方的开源CA中心,EJBCA。

https://www.ejbca.org/

https://github.com/bitnami/bitnami-docker-ejbca