环境
$ cat /etc/*-release
CentOS release 6.5 (Final)
$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
这有效
$ tr -dc A-Za-z0-9 </dev/random | head -c 24 > ${f_host_passphrase}
$ echo -e "\n" >> ${f_host_passphrase}
$ openssl genpkey ... -pass file:${f_host_passphrase} -out ${f_host_key}
$ openssl req ... -key ${f_host_key} -passin file:${f_host_passphrase} \
-out ${f_host_req}
$ openssl ca ... -in ${f_host_req} -out ${f_host_cert}
$ openssl pkcs12 \
-export \
-inkey ${f_host_key} \
-passin pass:$(cat ${f_host_passphrase}) \
-in ${f_host_cert} \
-name "${l_ds_cert_name}" \
-password file:${f_host_passphrase} \
-out ${f_host_p12}
...
$ pk12util -i ${f_host_p12} \
-w ${f_host_passphrase} \
-d ${l_sql_prefix}${d_nssdb} \
-k ${f_host_passphrase}
pk12util: PKCS12 IMPORT SUCCESSFUL
完整的功能脚本是这里。我编写了快速测试脚本,因为事实证明,下一个变体失败了。
这失败了
$ tr -dc A-Za-z0-9 </dev/random | head -c 24 > ${f_host_passphrase}
$ echo -e "\n" >> ${f_host_passphrase}
$ openssl genpkey ... -pass file:${f_host_passphrase} -out ${f_host_key}
$ openssl req ... -key ${f_host_key} -passin file:${f_host_passphrase} \
-out ${f_host_req}
$ openssl ca ... -in ${f_host_req} -out ${f_host_cert}
$ openssl pkcs12 \
-export \
-inkey ${f_host_key} \
-passin file:${f_host_passphrase} \
-in ${f_host_cert} \
-name "${l_ds_cert_name}" \
-password file:${f_host_passphrase} \
-out ${f_host_p12}
...
$ pk12util -i ${f_host_p12} \
-w ${f_host_passphrase} \
-d ${l_sql_prefix}${d_nssdb} \
-k ${f_host_passphrase}
pk12util: PKCS12 decode not verified: SEC_ERROR_BAD_PASSWORD: The security password entered is incorrect.
为什么?
两种变体(“失败”openssl pkcs12
命令是我链接到的脚本中的注释块)之间的唯一区别是我如何将密码短语文件传递给命令openssl pkcs12
。
如果我将密码发送为-passin pass:$(cat ${f_host_passphrase})
,则以下pk12util
命令将成功。
如果我将密码发送为-passin file:${f_host_passphrase}
,openssl pkcs12
命令仍然会成功,但pk12util
命令会失败。
我的猜测是该openssl pkcs12
命令正在解析某物作为参数中的密码-passin file:${f_host_passphrase}
。只是不是世界其他地方期望使用的......