You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Bash脚本中读取K8s密钥内容生成PKCS#12文件报错求助

问题分析与解决

核心错误原因

openssl pkcs12命令的-inkey和-in参数要求传入文件路径,但你直接传递了base64编码的密钥/证书内容,导致openssl无法识别参数格式,因此抛出帮助提示。

读取方式的问题确认与修正

  1. 变量赋值与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))。
  2. 正确生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:15:31