首页 > 解决方案 > 从环境变量传递证书到 curl

问题描述

我正在为我的应用程序开发 CORS 监视器,需要执行以下操作:

  1. 从我们的 Hashicorp Vault 实例下载证书
  2. 使用这些证书卷曲端点
  3. 评估响应

我目前可以这样做:

vault kv get -field crt my/cert/path/CACERT > CACERT.crt
vault kv get -field crt my/cert/path/TESTCERT > CERT.crt
vault kv get -field key my/cert/path/TESTCERT > KEY.key

curl -v\
    --cacert CACERAT.crt \
    --cert CERT.crt \
    --key KEY.key \
    --location \
    --request GET 'https://my.end.point'
# <evaluate here>
rm CACERT.crt CERT.crt KEY.key

虽然这可行,但我宁愿不将证书写入文件,而是将它们保存在内存中,例如使用环境变量或一些我不知道的 bash-isms。

在我看来,它看起来更像这样:

CACERT=$(vault kv get -field crt my/cert/path/CACERT)
CERT=$(vault kv get -field crt my/cert/path/TESTCERT)
KEY=$(vault kv get -field key my/cert/path/TESTCERT)

curl -v\
    --cacert $CACERT \
    --cert $CERT \
    --key $KEY \
    --location \
    --request GET 'https://my.end.point'
# <evaluate here>

显然这不起作用,因为 curl 期待文件路径,但为了说明目的,这可能吗?如果可能的话,这是一个糟糕的方法吗?也许还有另一种我没有考虑过的方法来解决这个问题?我知道我可以相对容易地使用 python 完成上述操作,但是如果可能的话,我更愿意坚持使用 bash + curl。

标签: bashcurlhashicorp-vault

解决方案


Bash 支持使用语法进行进程替换。<(cmd)这会导致 的输出cmd被替换为文件名。这允许您将命令输出作为预期文件名的参数传递。

在您的示例中,您将执行以下操作:

CACERT=$(vault kv get -field crt my/cert/path/CACERT)
CERT=$(vault kv get -field crt my/cert/path/TESTCERT)
KEY=$(vault kv get -field key my/cert/path/TESTCERT)

curl -v \
    --cacert <(echo "$CACERT") \
    --cert <(echo "$CERT") \
    --key <(echo "$KEY") \
    --location \
    --request GET 'https://my.end.point'

推荐阅读