首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K8S集装箱上的去码头客要求证书

K8S集装箱上的去码头客要求证书
EN

Stack Overflow用户
提问于 2020-08-14 16:44:37
回答 2查看 604关注 0票数 6

我在库中使用了以下代码

代码语言:javascript
复制
provider, err := oidc.NewProvider(ctx, providerURI)
if err != nil {
    log.Println(err)
}

当在本地运行时,使用与works相同的providerURI,我成功地获得了提供者!

我将它部署到K8S中,使用完全相同的提供者url (作为env变量),并使用port-forwarding调试,但是,在k8S中,我得到了错误,而没有得到provider

错误是:

代码语言:javascript
复制
2020/08/14 16:42:22 Get "https://ace.svar.com/.well-known/openid-configuration": x509: certificate signed by unknown authority

我已经将证书添加到映像中,并由验证它为,部署后,我将exec添加到k8s容器中,并在/usr/local/share/ca-certificates/路径下看到了server.crt文件。

仍然有同样的错误,如果我错过了其他的东西.不确定它是否真的与OIDC库或其他更一般的东西有关。

代码语言:javascript
复制
FROM golang:1.14.7 AS builder
RUN go get github.com/go-delve/delve/cmd/dlv
ADD server.crt /usr/local/share/ca-certificates/server.crt
RUN chmod 644 /usr/local/share/ca-certificates/server.crt && update-ca-certificates
RUN mkdir /app

ADD . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -gcflags="all=-N -l" -o main ./...

FROM debian:buster AS production
COPY --from=builder /app .
COPY --from=builder /go/bin/dlv /
COPY --from=builder /usr/local/share/ca-certificates/ /usr/local/share/ca-certificates/
EXPOSE 8000 40000
ENV SSL_CERT_DIR=/usr/local/share/ca-certificates/
ENV PORT=8000
CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "--accept-multiclient", "exec", "./main"]

我从GO-OIDC存储库的作者那里得到回放来尝试使用

https://godoc.org/github.com/coreos/go-oidc#ClientContext

不知道怎么做,知道吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-17 18:58:52

oidc.ClientContext文档中,它展示了如何传递自定义http.Client

代码语言:javascript
复制
myClient := &http.Client{}
ctx := oidc.ClientContext(parentContext, myClient)

// This will use the custom client
provider, err := oidc.NewProvider(ctx, "https://accounts.example.com")

提供自定义http.Client允许自定义TLS处理。

TLS Config

要创建具有特定CA信任文件的http.Client,我使用以下帮助函数:

代码语言:javascript
复制
func tlsConf(trustfile string) (t *tls.Config, err error) {
    if trustfile == "" {
        // DON'T USE IN PRODUCTION (but handy for testing)
        t = &tls.Config{InsecureSkipVerify: true}
        return
    }

    pembody, err := ioutil.ReadFile(trustfile)
    if err != nil {
        err = fmt.Errorf("failed to load trust file %q: %w", trustfile, err)
        return
    }

    rootCAs := x509.NewCertPool()
    if ok := rootCAs.AppendCertsFromPEM(pembody); !ok {
        err = fmt.Errorf("invalid PEM file %q", trustfile)
        return

    }

    t = &tls.Config{RootCAs: rootCAs}
    return
}

以及:

代码语言:javascript
复制
func httpCli(trustfile string) (hc *http.Client, err error) {
    tc, err := tlsConf(trustfile)
    if err != nil {
        return
    }
    hc = &http.Client{Transport: &http.Transport{TLSClientConfig: tc}}
    return
}

因此,在OIDC包中使用上面的内容进行快速测试:

代码语言:javascript
复制
hc, err := httpCli("") // DON'T USE IN PRODUCTION - will trust any TLS cert

ctx := oidc.ClientContext(parentContext, hc)
provider, err := oidc.NewProvider(ctx, "https://accounts.example.com")

如果这样做有效,那么将正确的信任文件添加到应用程序中:

代码语言:javascript
复制
hc, err := httpCli("/usr/local/share/ca-certificates/server.crt"))

CA信托

如果您的server.crt信任文件无法工作,您可能列出了错误的主题/发行者。

要确定地知道,您可以从任何远程服务器(端口443是默认的https端口)进行获取信任证书 (和可选签名链):

代码语言:javascript
复制
echo | openssl s_client -connect ace.svar.com:443 -showcerts 2> /dev/null > ace.txt

由于我不知道您的基础设施是什么样子,所以我将使用来自google.com:443的示例输出

代码语言:javascript
复制
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=*.google.com
   i:/C=US/O=Google Trust Services/CN=GTS CA 1O1
-----BEGIN CERTIFICATE-----
MIIKIzCCCQugAwIBAgIQF9rkH7fB/M4IAAAAAE2d0TANBgkqhkiG9w0BAQsFADBC
MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVR29vZ2xlIFRydXN0IFNlcnZpY2VzMRMw
...
-----END CERTIFICATE-----

s:指示证书的主题,您可以看到服务器名是由通配符CN=*.google.com标识的。如果您在ace.txt中看到类似的内容--您的server.crt应该包括这些行(从BEGIN CERTIFICATE开始,以END CERTIFICATE结尾)。

您还可以注意到,i:行指示颁发者证书名称。如果这是与s:相同的名称,那么它就是自签名证书,您就完成了。

google.com:443示例中,主题(s:)不同于发行者(i:)。因此,与其信任主题证书--人们可以相反地信任颁发者证书--允许可能的多台服务器是信任的。由于主体证书是由发行人签署的--信任链已经完成.

票数 7
EN

Stack Overflow用户

发布于 2020-08-17 09:03:02

Golang库正在以下目录中查找证书:unix.go#L18-L37 && L8-L15,如果要在新位置查找证书,可以使用环境变量:SSL_CERT_FILESSL_CERT_DIR,并设置证书的位置。所以在你的情况下应该是:

代码语言:javascript
复制
export SSL_CERT_DIR=/usr/local/share/ca-certificates/

然后运行应用程序。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63416875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档