前言
公网环境可以申请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电脑中 点击安装证书>本地计算机>将证书放入下列存储>受信任的根证书颁发机构>完成!


被折叠的 条评论
为什么被折叠?



