文章目录
- openssl3.2 - 官方demo学习 - test - certs
- 概述
- 笔记
- .sh的执行语句打印的方法
- 要修改的实际函数
- 备注
- END
openssl3.2 - 官方demo学习 - test - certs
概述
官方demos目录有证书操作的例子
已经做了笔记 openssl3.2 - 官方demo学习 - certs
但是这个demos/certs目录的脚本, 并没有演示如何操作PKCS12证书.
在官方给的程序例子中, 有操作PKCS12证书的工程, 但是却没有配套的PKCS12证书. 这咋弄?
翻了一下openssl源码工程, 发现测试目录中有2个脚本, 非常精彩, 比官方demos目录给出的脚本能操作的证书详细多了. 里面也有PKCS12证书的例子.
将test/certs目录中除了2个.sh都删掉, 在cygwin64下执行setup.sh, 可以将证书全部生成出来. 不过有报错, 原因是cygwin64中带的openssl是3.0.12, 不是最新版的3.2.
cygwin64升到最新的openssl也不是最新版的3.20.
这个目录是openssl自己测试用的, 证书的操作应该是最全的.
但是, 这2个.sh是bash脚本, 运行起来, 看不到执行了啥命令行(最终执行的都是openssl命令行).
想改一下.sh, 将最终执行的openssl命令行打印出来, 让人眼能看到. 然后我就可以在用windows下的openssl带相同命令行做相同的事情了.
笔记
.sh的执行语句打印的方法
在原有的这2个.sh上, 加了一个简单的测试函数, 测试了好使, 修改的思路就这么定了.
# this funciton test_exec() on mkcert.sh
test_exec()
{# 变量 - 赋值TEST_CMD="ls -l"# 变量 - 打印echo "TEST_CMD = $TEST_CMD"# 变量 - 执行$TEST_CMD
}
# this call on setup.sh
./mkcert.sh test_exec
在cygwnwin64环境下, 执行如下语句, 可以执行到test_exec()
在程序执行的同时, 将执行的命令行也打印出来了. 这就是我想要的效果.
chenx@ls-Precision3561 /cygdrive/d/my_dev/my_local_git_prj/study/sh
$ ./setup.sh
TEST_CMD = ls -l
total 20
-rwxrwx---+ 1 Administrators chenx 12465 Jan 17 18:24 mkcert.sh
-rwxrwx---+ 1 Administrators chenx 138 Jan 17 18:25 setup.sh
要修改的实际函数
官方原始的脚本, 是执行 ./setup.sh, 间接的调用mkcert.sh(作为脚本库)来干活.
setup.sh中, 都是调用mkcert.sh中的脚本函数, 看不到任何openssl相关的东西
./mkcert.sh genroot "Root CA" root-key root-cert
在mkcert.sh中, 先经过中间函数处理传入的参数, 最终会进入到有openssl最终调用的函数中.
包含openssl最终调用的函数有4个(cert(), req_nocn(), req(), key()), 如下.
key() {local key=$1; shiftlocal alg=rsaif [ -n "$OPENSSL_KEYALG" ]; thenalg=$OPENSSL_KEYALGfilocal bits=2048if [ -n "$OPENSSL_KEYBITS" ]; thenbits=$OPENSSL_KEYBITSfiif [ ! -f "${key}.pem" ]; thenargs=(-algorithm "$alg")case $alg inrsa) args=("${args[@]}" -pkeyopt rsa_keygen_bits:$bits );;ec) args=("${args[@]}" -pkeyopt "ec_paramgen_curve:$bits")args=("${args[@]}" -pkeyopt ec_param_enc:named_curve);;dsa) args=(-paramfile "$bits");;ed25519) ;;ed448) ;;*) printf "Unsupported key algorithm: %s\n" "$alg" >&2; return 1;;esacstderr_onerror \openssl genpkey "${args[@]}" -out "${key}.pem"fi
}# Usage: $0 req keyname dn1 dn2 ...
req() {local key=$1; shiftkey "$key"local errsstderr_onerror \openssl req -new -"${OPENSSL_SIGALG}" -key "${key}.pem" \-config <(printf "string_mask=%s\n[req]\n%s\n%s\n[dn]\n" \"$REQMASK" "prompt = no" "distinguished_name = dn"for dn in "$@"; do echo "$dn"; done)
}req_nocn() {local key=$1; shiftkey "$key"stderr_onerror \openssl req -new -"${OPENSSL_SIGALG}" -subj / -key "${key}.pem" \-config <(printf "[req]\n%s\n[dn]\nCN_default =\n" \"distinguished_name = dn")
}cert() {local cert=$1; shiftlocal exts=$1; shiftstderr_onerror \openssl x509 -req -"${OPENSSL_SIGALG}" -out "${cert}.pem" \-extfile <(printf "%s\n" "$exts") "$@"
}
对sh编程不熟, 但是能看懂. 小动一下是可以的.
这4个函数最终调用openssl时, 参数给的比较复杂, 如果直接用echo来打印最终的命令行, 试过了, 不好使.
原因是, 这个命令行中有一些即时生成的参数, 如果用echo直接打印, 看不到真正的变量值.
准备将传给openssl的参数再复制给一些中间变量, 最后再将拼好的中间变量再传给openssl, 这样就能打印出命令行了.
准备改这4个函数, 将最终要执行的openssl命令行打印出来, 且能正常执行openssl命令.
备注
在windows下整理了证书操作的参数, 整理成windows命令行, 执行报错.
开始怀疑是这些证书命令是给旧版openssl用的.
为了验证这个问题, 装了一个debian12.4, 然后装了openssl3.2(自己从源码编译的).
执行.\test\certs\中的脚本(将setup.sh拷贝成副本, 改名, 在里面只有一条脚本), 执行时, 只是有警告, 但是执行结果是对的.
lostspeed@debian12d4x64:~/openssl/openssl-3.2.0/test/certs$ ./test2.h
Warning: Reading cert request from stdin since no -in option is given // !
Certificate request self-signature ok
subject=CN=Root CA
在openssl源码中, 也找到了这句警告.
int x509_main(int argc, char **argv)
{// ...if (reqfile) {if (infile == NULL)BIO_printf(bio_err,"Warning: Reading cert request from stdin since no -in option is given\n");req = load_csr_autofmt(infile, informat, vfyopts,"certificate request input");if (req == NULL)goto end;// ...
}
再研究一下, 看看p12证书怎么用openssl命令行操作.
要是官方例子中给了p12证书的操作例子, 就不用看源码编译, 测试中间操作用的脚本了.