Go ONLY on kubernetes/CoreOS 中的无效 header 字段值

Invalid header field value in Go ONLY on kubernetes/CoreOS

我有一个使用 aws-sdk-go 与 dynamodb 对话的 Go 程序。依赖项已出售。转到版本 1.7.1。 aws-sdk-go 版本 1.6.24。该程序在以下所有环境中均按预期工作:

当我 运行 kubernetes 上的 docker 容器(与我在我的开发箱上测试的容器相同)时,出现以下错误:


2017/03/02 22:30:13 DEBUG ERROR: Request dynamodb/GetItem:
---[ REQUEST DUMP ERROR ]-----------------------------
net/http: invalid header field value "AWS4-HMAC-SHA256 Credential=hidden\n/20170302/us-east-1/dynamodb/aws4_request, SignedHeaders=accept-encoding;content-length;content-type;host;x-amz-date;x-amz-target, Signature=483f56dd0b17d8945d3c2f2044b7f97e531190602f132a4d5f828264b3a2cff2" for key Authorization
-----------------------------------------------------

2017/03/02 22:30:13 DEBUG: Response dynamodb/GetItem Details:
---[ RESPONSE ]--------------------------------------
HTTP/0.0 000 status code 0
Content-Length: 0

基于:
https://golang.org/src/net/http/transport.go
https://godoc.org/golang.org/x/net/lex/httplex#ValidHeaderFieldValue

看起来问题出在 header 值验证上,但我无法理解为什么它在我的 k8s 集群以外的任何地方都有效。集群由 Ec2 实例组成 运行 最新的 CoreOS stable ami (CoreOS stable 1235.8.0)

在我的开发机器上运行的 docker 图像是基于 scratch 的。为了解决问题,我创建了一个基于 Ubuntu latest 的图像,并使用一个单独的 go 程序,该程序仅从 dynamodb 中执行简单的获取项目。当此图像在我的 k8s 集群上 运行 和交互式 shell 中的程序 运行 时,我得到相同的错误。我已经确认我可以从这个环境中 ping dynamodb 端点。

我很难解决这个问题:我是不是遗漏了什么愚蠢的东西?有人能指出我正确的方向或知道发生了什么事吗?

hidden后面的\n肯定是无效的。不确定它是否真的存在或在您清理发布时以某种方式插入。

考虑:

package main

import (
    "fmt"
    "golang.org/x/net/lex/httplex"
)

func main() {
    fmt.Println("Is valid (without new line)", httplex.ValidHeaderFieldValue("AWS4-HMAC-SHA256 Credential=hidden/20170302/us-east-1/dynamodb/aws4_request, SignedHeaders=accept-encoding;content-length;content-type;host;x-amz-date;x-amz-target, Signature=483f56dd0b17d8945d3c2f2044b7f97e531190602f132a4d5f828264b3a2cff2"))
    fmt.Println("Is valid (with new line)", httplex.ValidHeaderFieldValue("AWS4-HMAC-SHA256 Credential=hidden\n/20170302/us-east-1/dynamodb/aws4_request, SignedHeaders=accept-encoding;content-length;content-type;host;x-amz-date;x-amz-target, Signature=483f56dd0b17d8945d3c2f2044b7f97e531190602f132a4d5f828264b3a2cff2"))
}

一个猜测是真正的隐藏值是从(配置文件等)中错误地包含 \n 的地方,它很高兴地被拉入你的 header,但仅限于此案例.

执行此操作时请记住“-n”: echo -n 键 | base64