如何在Bash中将私钥插入证书链的第一个证书末尾?
解决方案:将私钥插入证书链的第一个证书之后
问题分析
你需要把私钥文件的内容插入到证书链文件中第一个-----END CERTIFICATE-----行的后面,而非所有证书结束行之后。之前的脚本存在两个关键错误:
sed的r命令需要传入文件路径,但你把文件内容赋值给了private_key变量,导致sed无法识别目标文件-e "/-----END CERTIFICATE-----/d"会删除所有匹配的证书结束行,不符合仅插入第一个位置的需求
正确实现方式
方法1:用awk(逻辑清晰,推荐)
通过标记位控制,只在第一个证书结束行后插入私钥:
awk ' # 匹配第一个证书结束行 /-----END CERTIFICATE-----/ && !inserted { print $0 # 输出当前行 system("cat '"$PRIVATE_KEY_PATH"'") # 插入私钥文件内容 inserted=1 # 标记已完成插入,避免重复操作 next } # 其他所有行正常输出 1 ' "$certificate_path" > updated_combined.pem
方法2:用sed(高效单行命令)
利用0,/pattern/限定匹配范围,仅处理第一个证书结束行:
sed -e '0,/-----END CERTIFICATE-----/{//r '"$PRIVATE_KEY_PATH"'}' "$certificate_path" > updated_combined.pem
0,/-----END CERTIFICATE-----/:限定处理从文件开头到第一个匹配行的范围//r "$PRIVATE_KEY_PATH":在匹配到的证书结束行后,读取并插入私钥文件内容
整合到你的脚本中
替换原函数里的合并逻辑即可:
get_new_certificate() { curl --get "$venafi_url$venafi_get_cert_endpoint?Format=Base64&IncludeChain=true&RootFirstOrder=false" --insecure --data-urlencode "CertificateDN=$certificate_identifier" \ -H "accept: application/json" \ -H "Authorization: Bearer $auth_token" \ -o "$certificate_path" # 使用awk完成私钥插入 awk ' /-----END CERTIFICATE-----/ && !inserted { print $0 system("cat '"$PRIVATE_KEY_PATH"'") inserted=1 next } 1 ' "$certificate_path" > updated_combined.pem # 若需要直接覆盖原证书文件,可替换为: # awk '...' "$certificate_path" > temp.pem && mv temp.pem "$certificate_path" echo "Got new Certificate" }
验证结果
执行后updated_combined.pem的结构将完全符合你的预期:
-----BEGIN CERTIFICATE----- ... (服务器证书内容)... -----END CERTIFICATE----- -----BEGIN PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,CFCECC7976725DE5 <服务器私钥 - 带密码保护> -----END PRIVATE KEY----- -----BEGIN CERTIFICATE----- ... (中间证书内容)... -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ... (CA根证书内容)... -----END CERTIFICATE----
内容的提问来源于stack exchange,提问作者Paul1896
相关产品推荐
相关产品推荐

