实验前置条件为 openssl3.2 - linux脚本(.sh)调用openssl命令行参数的简单确认方法
#! /bin/bash
# \file setup001.sh
# Primary root: root-cert
./mkcert.sh genroot "Root CA" root-key root-cert
exit 0
执行完后, 经修改后的openssl记录下了执行的openssl命令序列
# \file my_openssl_log_001.txt
# Primary root: root-cert
./mkcert.sh genroot "Root CA" root-key root-cert
openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:2048 -out root-key.pem
openssl req -new -sha256 -key root-key.pem -config /dev/fd/63
openssl x509 -req -sha256 -out root-cert.pem -extfile /dev/fd/63 -signkey root-key.pem -set_serial 1 -days 36525
/dev/fd/63 经修改过的openssl记录的管道内容, 这个配置内容改名cfg_001.txt, 作为第2步的配置文件用.
string_mask=utf8only
[req]
prompt = no
distinguished_name = dn
[dn]
CN = Root CA
# \file my_openssl_log_001_doc_1.txt
# 要运行的openssl命令行
openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:2048 -out root-key.pem
# openssl 对入参的处理判断流程
# 判断是否无参数(-v, -help)
openssl
# 进行什么任务?
openssl genpkey
# 如果是产生私钥, 请问算法是什么?
openssl genpkey -algorithm rsa
# 输出文件是什么?
openssl genpkey -algorithm rsa -out root-key.pem
# 扩展参数是什么?
openssl genpkey -algorithm rsa -out root-key.pem rsa_keygen_bits:2048
# 参数都拿到了, 开始正式干活
产生输出文件(私钥.pem) root-key.pem
# \file my_openssl_log_001_doc_2.txt
# 要运行的openssl命令行
openssl req -new -sha256 -key root-key.pem -config /dev/fd/63
/dev/fd/63 已经记录到了 cmd_line_pipe_in_linux_001.txt, 将 cmd_line_pipe_in_linux_001.txt 改名为 cfg_001.txt
# 需要自己加一个 -out 输出文件, 否则没有输出
# 脚本调用时, 用重定向输出的.
openssl req -new -sha256 -key root-key.pem -config cfg_001.txt -out root-req.pem
# openssl 对入参的处理判断流程
# 判断是否无参数(-v, -help)
openssl
# 进行什么任务?
openssl req
# 进行什么子任务?
openssl req new
# 请问算法是什么?
#对于req来说, 指定摘要算法无效, 摘要算法就是sh256, 无法指定为其他算法
openssl req new -sha256
# 私钥文件是什么?
openssl req new -sha256 -key root-key.pem
# 配置文件是什么?
# -config 后面指定的最好是一个落地后的文件名, 方便单步调试
# 如果是运行时, 可以用脚本来指定临时的管道文件名(e.g. /dev/fd/63), 不用落地
openssl req new -sha256 -key root-key.pem -config cfg_001.txt
# 输出文件名是啥?
openssl req new -sha256 -key root-key.pem -config cfg_001.txt -out root-req.pem
# 参数都拿到了, 开始正式干活
输出了 root-req.pem
# \file my_openssl_log_001_doc_3.txt
# 要运行的openssl命令行
openssl x509 -req -sha256 -out root-cert.pem -extfile /dev/fd/63 -signkey root-key.pem -set_serial 1 -days 36525
/dev/fd/63 是空的(我在日志里面看到的) , 因为官方原版程序使用脚本做的, 没有将文件落地.
如果-extfile跟着一个有内容的文件, 就会报错.
如果-extfile跟着一个没内容的文件, 就有警告. 在代码中单步, 已经看到了警告.
这里就先看看, 官方正式例子中, 也有生成root证书的操作, 是没有警告的. 等用到时, 再比对一下.
# 根据openssl的报错提示, 增加了-in选项, 将上一步生成的证书请求文件作为in内容
# 这也能看出来, 官方自己测试用的证书操作, 仅仅是用于测试, 参数细节给的也不是全对, 需要自己单步openssl, 来看参数是否给的是否正确?
# 官方自己测试用的.sh例子, 生成证书时, 并没有用到上一步产生的证书请求文件, 这就是bug了.
openssl x509 -req -sha256 -in root-req.pem -out root-cert.pem -signkey root-key.pem -set_serial 1 -days 36525
# openssl 对入参的处理判断流程
# 判断是否无参数(-v, -help)
openssl
# 进行什么任务?
openssl x509
# 进行什么子任务?
openssl x509 -req
# 请问算法是什么?
#对于req来说, 指定摘要算法无效, 摘要算法就是sh256, 无法指定为其他算法
openssl x509 -req -sha256
# 输入文件是啥?
openssl x509 -req -sha256 -in root-req.pem
# 输出文件是啥?
openssl x509 -req -sha256 -in root-req.pem -out root-cert.pem
# 私钥文件是什么?
openssl x509 -req -sha256 -in root-req.pem -out root-cert.pem -signkey root-key.pem
# 序列号sn是啥?
openssl x509 -req -sha256 -in root-req.pem -out root-cert.pem -signkey root-key.pem -set_serial 1
# 证书有效天数
# 如果不设置证书有效天数, 默认是30天的证书
openssl x509 -req -sha256 -in root-req.pem -out root-cert.pem -signkey root-key.pem -set_serial 1 -days 36525
# 参数都拿到了, 开始正式干活
输出了 root-cert.pem
./test/certs目录中的.sh写的也不咋对(经过单步openssl处理命令行参数就明白参数写的不对)
但是官方这个目录的证书操作也不是用于make test的.
应该是openssl工程自己攒下来的脚本, 用于证书操作的内部测试.
因为这个目录, 官方没有文档说明. 如果要想为己用, 就要用openssl工程来调试, 看看哪些参数不合适(有警告也不行, 一定是哪里参数给错了).
然后看是否能生成符合要求的输出文件.
这个001的.sh, 官方调用命令行时, 没有使用 in 参数, 给出上一步生成的证书请求文件, 所以有警告.
自己加了 -in 证书请求文件, 同时将-extfile去掉, 才正常.