Bash 从环境变量向curl传递证书

Bash 从环境变量向curl传递证书,bash,curl,hashicorp-vault,Bash,Curl,Hashicorp Vault,我正在为我的应用程序使用CORS监视器,需要执行以下操作: 从我们的Hashicorp Vault实例下载证书 使用这些证书卷曲端点 评估反应 目前,我可以按如下方式执行此操作: 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/TES

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

  • 从我们的Hashicorp Vault实例下载证书
  • 使用这些证书卷曲端点
  • 评估反应
  • 目前,我可以按如下方式执行此操作:

    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
    
    vault kv get-字段crt my/cert/path/CACERT>CACERT.crt
    vault kv get-字段crt my/cert/path/TESTCERT>cert.crt
    vault kv get-字段密钥my/cert/path/TESTCERT>key.key
    旋度-v\
    --cacert CACERAT.crt\
    --cert.crt\
    --钥匙,钥匙\
    --位置\
    --请求获取'https://my.end.point'
    # 
    rm CACERT.crt CERT.crt KEY.KEY
    
    虽然这是可行的,但我宁愿不将证书写入文件,而是将它们保存在内存中,比如使用环境变量或一些我不知道的bash ISM

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

    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>
    
    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'
    
    CACERT=$(vault kv get-字段crt my/cert/path/CACERT)
    证书=$(vault kv get-字段crt my/CERT/path/TESTCERT)
    密钥=$(vault kv get-字段密钥my/cert/path/TESTCERT)
    旋度-v\
    --cacert$cacert\
    --证书$cert\
    --钥匙$key\
    --位置\
    --请求获取'https://my.end.point'
    # 
    

    显然这是行不通的,因为curl需要文件路径,但为了说明起见,这可能吗?如果可能,这是一个糟糕的方法吗?也许还有另一种方法我没有考虑过?我知道我可以相对轻松地使用python完成上述操作,但是如果可能的话,我更喜欢使用bash+curl。

    对于仅使用POSIX的shell,可以用显式创建的命名管道替换进程替换

    后台任务将不同的密钥和证书流式传输到其专用的命名管道

    #/副秘书长/垃圾箱/环境卫生
    #这些是随机命名的管道
    cacert_管道=$(mktemp-u)
    证书管道=$(mktemp-u)
    键_管道=$(mktemp-u)
    #在退出时删除命名管道
    陷阱'rm-f--“$cacert_pipe”“$cert_pipe”“$key_pipe”退出
    #创建命名管道
    mkfifo--“$cacert_pipe”“$cert_pipe”“$key_pipe”|出口1
    #启动后台shell以将数据流传输到相应的命名管道
    vault kv get-现场crt my/cert/path/CACERT>“$CACERT\u管道”&
    vault kv get-现场crt my/cert/path/TESTCERT>“$cert\u管道”&
    vault kv get-现场密钥my/cert/path/TESTCERT>“$key\u管道”&
    旋度-v\
    --cacert“$cacert_管道”\
    --证书“$cert_pipe”\
    --图例“$key_pipe”\
    --位置\
    --请求获取'https://example.com/my.end.point'
    

    与Bash的进程替换方法相比,其缺点是;在使用命名管道作为文件参数调用
    curl
    之前,需要显式重新启动流式处理任务。

    Bash支持使用
    将echo输出重定向到curl的stdin,并且每次连续重定向都会删除前一个重定向。这根本行不通。还有
    @LéaGris-谢谢你,我错了,把