• 证书服务(四)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
    View Code

    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

  • 相关阅读:
    闭包
    iframe
    函数声明和函数表达式
    简单的事件委托
    onhashchange
    WebP探索
    Chrome
    适合自己学习的一些网站
    模拟jQuery的一些功能
    __autoload()方法
  • 原文地址:https://www.cnblogs.com/jackadam/p/16260764.html
Copyright © 2020-2023  润新知