我正在使用AWS CLI更新包含x509证书的JSON密钥.我传递给--secret-string参数的有效负载是我所期望的编码,但是当它被上传并存储在AWS中时,secresManager会对换行符执行额外的编码.

Problem

我得到的问题是PEM和密钥内容在解开秘密时并不是完全不被解开的.我在GO中有一个应用程序服务器,当将秘密传递到tls.X509KeyPair()中时,它无法识别证书的内容.

我可以在Web上手动将CLI命令中的有效负载粘贴到密码中,它保留了现有的格式,我的代码运行得很好.

我主要是想看看是否可以做些什么来修复上传编码,而不是在获取密钥时格式化/取消转义Go中的PEM/Key内容.

Example:

-CLI命令:

aws secretsmanager update-secret --secret-id my-secret --secret-string '{"PEM":"-----BEGIN CERTIFICATE-----\n...\n...\n...\n-----END CERTIFICATE-----\n","KEY":"..."}'

实际上传的密码:

{"PEM":"-----BEGIN CERTIFICATE-----\\\\n...\\\\n...\\\\n...\\\\n-----END CERTIFICATE-----\\\\n",,"KEY":"..."}

我使用awk来加入PEM内容,使用jq来更新+字符串JSON.STRINGIZED JSON正是我要查找的正确格式.

AWK:STRING_PEM=$(awk '{printf "%s\\n", $0}' $PemFile)

JQ:SECRET_STRING=$(jq -r 'tostring' $UPDATED_SECRET)

推荐答案

我可以确认这个命令设置的一个秘密

aws secretsmanager update-secret --secret-id my-secret --secret-string '{"PEM":"-----BEGIN CERTIFICATE-----\n...\n...\n...\n-----END CERTIFICATE-----\n","KEY":"..."}'

按预期工作(请参阅此答案底部的Go演示).

And here is a simplified command that does the whole thing:

aws secretsmanager update-secret --secret-id -secret --secret-string "$(jq -n --arg cert "$(cat /path/to/cert/file)" --arg key "$(cat /path/to/key/file)" -c '{"PEM": $cert, "KEY": $key}')"

以下是一个GO演示,用于验证上传的内容:

package main

import (
    "context"
    "crypto/tls"
    "encoding/json"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/secretsmanager"
)

func main() {
    secretName := "test1"
    region := "ap-southeast-1"

    config, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
    if err != nil {
        panic(err)
    }

    svc := secretsmanager.NewFromConfig(config)

    input := &secretsmanager.GetSecretValueInput{
        SecretId: aws.String(secretName),
    }

    result, err := svc.GetSecretValue(context.TODO(), input)
    if err != nil {
        panic(err)
    }

    var secret struct {
        PEM string `json:"PEM"`
        KEY string `json:"KEY"`
    }
    {
    }

    if err := json.Unmarshal([]byte(*result.SecretString), &secret); err != nil {
        panic(err)
    }

    if _, err := tls.X509KeyPair([]byte(secret.PEM), []byte(secret.KEY)); err != nil {
        panic(err)
    }
}

Go相关问答推荐

SEARCH On Conflict Clause不考虑乐观锁定版本

Golang ==错误:OCI运行时创建失败:无法启动容器进程:exec:./" bin:stat./" bin:没有这样的文件或目录:未知

Go PQ驱动程序无法使用默认架构进行查询

+在具有html/模板Golang的Base64中

如何在围棋中从多部分.Part中获取多部分.文件而不保存到磁盘?

Makefilego version和read命令

Go Gin:验证 base64

Kafka golang 生产者在错误后更改分区计数

如何忽略打印达到最大深度限制 go colly

有没有办法计算枚举中定义的项目总数?

致命错误 - 所有 Goroutines 都睡着了!僵局

为什么互斥量比 golang 中的通道慢?

如何将元素从一个切片移动到另一个切片

有没有什么方法可以在不使用 if/else 的情况下在 Golang 中处理 nil 指针?

如何在切片增长时自动将切片的新元素添加到函数参数

为超时的单元测试创​​建 deadlineExceededError:true

go-libp2p - 从流中接收字节

来自洪流公告的奇怪同行字段

如何将具有嵌入式 struct 的 struct 展平为 json

HTTP 重定向不呈现新页面