Linux利用openssl工具自签CA证书

 前言

        公网环境可以申请Let's encrypt或者ZoreSSL的免费证书(一般都是3个月续签一次),有时候测试环境或者非公网环境有SSL需求 这时候就需要自签证书了

        本人写作水平一般,以及文中我图方便大量使用了相对路径 见谅

自签发根CA证书

 配置文件参考openssl官方文档:x509v3_config - OpenSSL Documentation

 命令用法参考openssl官方文档:OpenSSL commands - OpenSSL Documentation

   签发根CA证书 

        创建多个文件夹 用于存放不同的文件 结构如下

主路径 #自行选择
└── CA #CA证书颁发路径
  ├── config/ #存放openssl.cnf配置文件
  ├── certs/ #颁发的证书存放路径
  ├── crl/ #CRL吊销记录存放路径
  └── db/ #签发吊销记录数据库

        进入config文件夹 创建CA证书的配置文件

cd config
vi openssl.cnf

        内容如下

请先看一下注释内容 不要直接复制粘贴

注意authorityInfoAccess和crlDistributionPoints参数 如果你需要crl吊销验证(例如Windows RDP远程)需要一台web服务器用于存放crl文件和证书文件

#CA证书拓展
[ v3_ca ]
basicConstraints = critical,CA:true
keyUsage = critical, keyCertSign, cRLSign
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid

[ custom_ca ]
#主目录 根据你的主路径来填
dir             = /test/custom_cert/
#已颁发的证书路径
certs		    = $dir/CA/certs
#CA证书的路径
certificate	    = $dir/CA/CA.crt
#已颁发的CRL的存放路径
crl_dir         = $dir/CA/crl
#证书数据库
database        = $dir/CA/db/index.txt
#将来颁发的证书存放路径
new_certs_dir   = $dir/CA/certs
#提供序列号的文件
serial          = $dir/CA/db/serial
#当前CRL序列号
crlnumber       = $dir/CA/db/crlnumber
#当前CRL
crl             = $dir/CA/crl/crl.pem
#CA证书的私钥路径
private_key	    = $dir/CA/CA-privikey.pem

#中间证书拓展
x509_extensions	= inca_cert
#CRL证书吊销列表拓展
crl_extensions  = crl_ext

#默认的证书有效期
default_days	= 36500
#默认的摘要算法
default_md	= sha256
#CRL的有效期
default_crl_days = 3
#证书匹配策略
policy		= policy_match

[ crl_ext ]
authorityKeyIdentifier = keyid:always

#中间证书拓展
[ inca_cert ]
#基本约束 critical代表此扩展必须被处理,否则证书应被拒绝 CA:TRUE代表此证书是一个CA证书 pathlen:0:限制该CA证书链深度为0
basicConstraints = critical,CA:TRUE,pathlen:0
#定义密钥用途 critical代表此扩展必须被处理,否则证书应被拒绝 keyCertSign允许签发其他证书 cRLSign允许签发证书吊销列表
keyUsage = critical, keyCertSign, cRLSign
#标识证书中的公钥
subjectKeyIdentifier=hash
#标识签发该证书的CA信息 keyid:使用上级CA证书的subjectKeyIdentifier issuer:包含上级CA的颁发者名称和序列号
authorityKeyIdentifier=keyid, issuer
#提供获取上级CA证书的途径 这里是我本地的web服务器
authorityInfoAccess = caIssuers;URI:http://192.168.8.108/root_ca.crt
#提供证书吊销列表(CRL)的下载地址
crlDistributionPoints = URI:http://192.168.8.108/root_ca.crl

[ policy_match ]
#match表示请求中填写的该字段信息要和CA证书中的匹配 optional表示该字段信息可提供可不提供 supplied表示该字段信息必须提供
countryName		= match
stateOrProvinceName	= optional
organizationName	= optional
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional

        回到上一层路径 并自签发CA证书

cd ..
#创建私钥 注:建议设置一个复杂性高的密码来保护私钥文件
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -aes256 -out CA-privikey.pem
#创建证书签名请求 CN=通用名 OU=组织单位名 O=组织名 L=城市名 ST=州名/省名 C=国家名
openssl req -new -sha256 -key CA-privikey.pem -out CA-Request.csr -subj "/C=CN/O=BreadAira/CN=Root CA"
#自签发证书 -days代表证书有效期为35600天
openssl x509 -req -days 36500 -sha256 -signkey CA-privikey.pem -in CA-Request.csr -out CA.crt -extensions v3_ca -extfile ./config/openssl.cnf

        自签名CA证书成功

        删除掉CSR签名请求文件

rm -f CA-Request.csr

        使用openssl输出一下证书信息

openssl x509 -in CA.crt -text

        可以看到证书的详细信息

        创建数据库文件

cd db
touch index.txt
echo 01 > crlnumber
echo 01 > serial

   创建CRL吊销证书列表(可选)

        如果需要crl吊销列表验证 需要有一台web服务器(需要能被访问到 这里不详细展开)

#当前路径 主路径/CA
#创建crl 建议使用绝对路径并按照crl过期时间做cron任务 我这里使用的是相对路径
openssl ca -gencrl -config ./config/openssl.cnf -name custom_ca -out ./crl/root_ca.crl -extensions crl_ext -extfile ./config/openssl.cnf -verbose

        创建crl成功

        将crl与根CA证书复制到web的目录下(这里不详细展开)

文件命名需要与authorityInfoAccess和crlDistributionPoints中所填写的文件名相同

当然 如果你会nginx的alias别名的话就可以随便来

 自签发中间CA证书

   签发中间CA证书

        创建多个文件夹 用于存放不同的文件 结构如下

主路径 #自行选择
├── CA #CA证书颁发路径
│ ├── config/ #存放openssl.cnf配置文件
│ ├── certs/ #颁发的证书存放路径
│ ├── crl/ #CRL吊销记录存放路径
│ └── db/ #签发吊销记录数据库
└── INCA #中间CA证书颁发路径
  ├── config/ #存放openssl.cnf配置文件
  ├── certs/ #颁发的证书存放路径
  ├── crl/ #CRL吊销记录存放路径
  └── db/ #签发吊销记录数据库

        进入config文件夹 创建中间CA证书的配置文件

cd config
vi openssl.cnf

        内容如下

[ custom_usr ]
#主目录 根据你的主路径来填 其它子目录上面都讲过不再赘述
dir             = /test/custom_cert/
certs		    = $dir/INCA/certs
certificate	    = $dir/INCA/INCA.crt
crl_dir         = $dir/INCA/crl
database        = $dir/INCA/db/index.txt
new_certs_dir   = $dir/INCA/certs
serial          = $dir/INCA/db/serial
crlnumber       = $dir/INCA/db/crlnumber
crl             = $dir/INCA/crl/local_ca.crl
private_key	    = $dir/INCA/INCA-privikey.pem

x509_extensions	= usr_cert
crl_extensions  = crl_ext

# CRL 有效期
default_days	= 36500
default_md	= sha256
default_crl_days = 365
policy		= usr_policy_match

[ crl_ext ]
authorityKeyIdentifier = keyid:always

[ usr_cert ]
basicConstraints=CA:FALSE
subjectKeyIdentifier=hash
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
authorityKeyIdentifier=keyid
#可选 OCSP认证和crl认证
authorityInfoAccess = OCSP;URI:http://192.168.8.108:8452 , caIssuers;URI:http://192.168.8.108/local_ca.cer
#可选
crlDistributionPoints = URI:http://192.168.8.108/local_ca.crl

[ usr_policy_match ]
countryName		= match
stateOrProvinceName	= optional
organizationName	= optional
organizationalUnitName	= optional
commonName		= supplied
emailAddress		= optional

        回到上一层目录 使用根CA证书签发中间CA证书

cd ..
#创建私钥
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -aes256 -out INCA-privikey.pem
#创建CSR证书签名请求
openssl req -new -key INCA-privikey.pem -out INCA-Request.csr -subj "/C=CN/O=IT/CN=IT CA"
#使用根CA证书签发中间CA 配置文件这里要调用CA的openssl.cnf
openssl ca -config ../CA/config/openssl.cnf -name custom_ca -days 18250 -in INCA-Request.csr -out INCA.crt -notext

        签发成功

  

        查看根CA证书签发列表

cat ../CA/db/index.txt

        可以看到签发下来的中间CA证书

        刷新根CA证书的CRL吊销证书列表(可选)

#如果你签发根CA证书时也签发了CRL吊销证书列表 这里需要重新签发一个CRL
openssl ca -gencrl -config ./config/openssl.cnf -name custom_ca -out ./crl/root_ca.crl -extensions crl_ext -extfile ./config/openssl.cnf -verbose

         创建中间CA的数据库文件

cd db
touch index.txt
echo 01 > crlnumber
echo 01 > serial

   创建CRL吊销证书列表(可选)

        如果需要crl吊销列表验证 需要有一台web服务器(需要能被访问到 这里不详细展开)

#当前路径 主路径/INCA
#创建crl 建议使用绝对路径并按照crl过期时间做cron任务 我这里使用的是相对路径
openssl ca -gencrl -config ./config/openssl.cnf -name custom_usr -out ./crl/root_ca.crl -extensions crl_ext -extfile ./config/openssl.cnf -verbose

        创建crl成功

        将crl与根CA证书复制到web的目录下(这里不详细展开)

   创建OCSP在线证书状态协议(可选)

写文章的时候 我先签了普通证书再来弄OCSP的 所以建议先看完签发普通证书再来看这里

        创建一个openssl.cnf配置文件

vi openssl.cnf

        内容如下

[ ocsp_cert ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = OCSPSigning

        使用中间CA签发一个用于OCSP的证书(类似签发普通证书)

#创建私钥
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -aes256 -out OCSP-privikey.pem
#创建CSR证书签名请求
openssl req -new -key OCSP-privikey.pem -out OCSP-Request.csr -subj "/C=CN/CN=OCSP"
#使用中间CA签发OCSP证书
openssl ca -config /test/custom_cert/INCA/config/openssl.cnf -name custom_usr -days 3650 -in OCSP-Request.csr -out OCSP.crt -notext -extfile openssl.cnf -extensions ocsp_cert

        签发成功

        使用openssl运行OCSP服务

#-port参数是运行端口 -index参数是中间CA证书的证书列表 -CA参数是中间CA证书 -rsigner参数是OCSP证书 -rkey参数是证书的私钥
openssl ocsp -index /test/custom_cert/INCA/db/index.txt -CA /test/custom_cert/INCA/INCA.crt -port 8084 -text -rsigner OCSP.crt -rkey OCSP-privikey.pem -timeout 60 -ignore_err -passin pass:OCSP证书的密码

        模拟OCSP请求

#-issuer参数是中间CA证书 -cert是中间CA签发的普通证书 -CAfile是根CA证书
openssl ocsp -issuer /test/custom_cert/INCA/INCA.crt -cert public.crt -url http://127.0.0.1:8084 -CAfile /test/custom_cert/CA/CA.crt

        可以看到证书状态是正常的

自签发普通证书

   签发普通证书

        随便找一个目录 我这里直接进root目录

cd /root

        创建用于普通证书的配置文件

vi openssl.cnf

         内容如下

[ usr_cert ]
subjectAltName = @alt_names

#证书的备用名称 可以配置多域名证书或泛域名证书 以及IP证书
[alt_names]
IP.1 = 192.168.8.12
DNS.1 = www.xxx.com
DNS.2 = xxx.com
DNS.3 = *.owo.com

        使用中间CA证书签发普通证书

#创建私钥 普通证书可以不设置额外密码保护
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out privikey.pem
#生成CSR证书签名申请
openssl req -new -sha256 -key privikey.pem -out public.csr -subj "/C=CN/ST=GuangDong/L=GuangZhou/CN=yourname"
#使用中间证书签发普通证书 这里的绝对路径按你自己的来
openssl ca -config /test/custom_cert/INCA/config/openssl.cnf -name custom_usr -days 365 -in public.csr -out public.crt -extfile openssl.cnf -extensions usr_cert -notext

        签发成功

         刷新中间CA证书的CRL吊销证书列表(可选)

#当前路径 主路径/INCA
#创建crl 建议使用绝对路径并按照crl过期时间做cron任务 我这里使用的是相对路径
openssl ca -gencrl -config ./config/openssl.cnf -name custom_usr -out ./crl/root_ca.crl -extensions crl_ext -extfile ./config/openssl.cnf -verbose

如何使用自签证书

   Nginx或Apache

        将普通证书>中间CA证书>根CA证书拼接成证书链

{
    cat /root/public.crt
    cat /test/custom_cert/INCA/INCA.crt
    cat /test/custom_cert/CA/CA.crt   
} >> /root/fullchain.crt

        然后将证书和私钥复制到Nginx或Apache的目录中 配置文件例子如下

  • Nginx
    server { 
            listen 443 ssl;
    
            ... 省略内容
            ssl_certificate    /var/www/ssl/fullchain.crt;
            ssl_certificate_key    /var/www/ssl/privkey.pem;
            ssl_protocols TLSv1.2 TLSv1.3;
            ... 省略内容
    }
  • Apache
    <VirtualHost *:443>
        ... 省略内容
        SSLEngine on
        SSLCertificateFile /var/www/ssl/fullchain.crt
        SSLCertificateKeyFile /var/www/ssl/privkey.pem
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
        ... 省略内容
    </VirtualHost>

   IIS或用于RDP远程桌面

        将普通证书>中间CA证书>根CA证书拼接成证书链

{
    cat /root/public.crt
    cat /test/custom_cert/INCA/INCA.crt
    cat /test/custom_cert/CA/CA.crt   
} >> /root/fullchain.crt

        将证书转为pfx格式

#将证书链和私钥打包到pfx文件中
openssl pkcs12 -export -in fullchain.crt -inkey privikey.pem -out windows.pfx

        如何安装到IIS和用于RDP远程桌面bing搜一下都有教程 我这里懒得截图了owo

更新补充 记得信任自签的CA证书

Linux

#rockylinx almalinux
cat /test/custom_cert/CA/CA.crt >> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
#debian
cat /test/custom_cert/CA/CA.crt >> /etc/ssl/certs/ca-certificates.crt

Windows

        直接将CA.crt和INCA.crt下载到windows电脑中 点击安装证书>本地计算机>将证书放入下列存储>受信任的根证书颁发机构>完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值