在Bash脚本中读取K8s密钥内容生成PKCS#12文件报错求助
问题分析与解决
核心错误原因
openssl pkcs12命令的-inkey和-in参数要求传入文件路径,但你直接传递了base64编码的密钥/证书内容,导致openssl无法识别参数格式,因此抛出帮助提示。
读取方式的问题确认与修正
变量赋值与K8s Secret读取注意点
- 脚本中变量赋值未加双引号,带空格的base64字符串会被拆分成多个参数(比如
hdlKey=absncb asdasdas...会被解析成hdlKey=absncb,后续内容变成无效命令参数),必须用双引号包裹:hdlKey="absncb asdasdas asdasdasd asdasdasd== asdasddf" hdlCert="absncb asdasdas asdasdasd asdasdasd== asdasddf asadasdii" - 如果是从K8s Secret通过环境变量读取内容,Secret存储的是base64编码后的原始证书/密钥数据,需要先解码再使用(比如
hdlKey=$(echo "$CLIENT_KEY" | base64 -d))。
- 脚本中变量赋值未加双引号,带空格的base64字符串会被拆分成多个参数(比如
正确生成PKCS12的两种方法
方法一:临时文件方式(逻辑清晰,推荐)
#!/bin/bash # 实际环境中需从K8s Secret读取并解码,示例中直接赋值模拟 hdlKey="absncb asdasdas asdasdasd asdasdasd== asdasddf" hdlCert="absncb asdasdas asdasdasd asdasdasd== asdasddf asadasdii" function checkHDLKey(){ if [ -z "$hdlKey" ] || [ -z "$hdlCert" ]; then # 修正逻辑:任一为空即报错 echo "ERROR - HDL values were not properly read" exit 1 else echo "Key and cert loaded successfully" fi } checkHDLKey PCK12_PATH="/app/pk12/client-keystore.p12" function generate_password { openssl rand -base64 16 } result=$(generate_password) function generate_pkc12_cert { echo "Inside generate_pkc12_cert" # 创建临时文件存储解码后的密钥和证书 tmp_key=$(mktemp) tmp_cert=$(mktemp) echo "$hdlKey" | base64 -d > "$tmp_key" echo "$hdlCert" | base64 -d > "$tmp_cert" # 生成PKCS12文件 openssl pkcs12 -export -inkey "$tmp_key" -in "$tmp_cert" -out "$PCK12_PATH" -password pass:"$result" # 清理临时文件 rm -f "$tmp_key" "$tmp_cert" echo "Done generate_pkc12_cert " } generate_pkc12_cert
方法二:Here-doc方式(无需临时文件)
# 替换上述脚本中的generate_pkc12_cert函数 function generate_pkc12_cert { echo "Inside generate_pkc12_cert" # 通过进程替换直接传递解码后的内容给openssl openssl pkcs12 -export -inkey <(echo "$hdlKey" | base64 -d) -in <(echo "$hdlCert" | base64 -d) -out "$PCK12_PATH" -password pass:"$result" echo "Done generate_pkc12_cert " }
额外修正点
- 原脚本
checkHDLKey函数的条件判断用了&&,逻辑错误(仅当两个变量都为空时才报错),改为||(任一为空即触发错误提示)。 - 所有变量引用都需加双引号,避免空格导致的参数拆分问题(比如
echo "$hdlKey"而非echo $hdlKey)。
内容的提问来源于stack exchange,提问作者coders
相关产品推荐
相关产品推荐

