我在这库中使用了以下代码
provider, err := oidc.NewProvider(ctx, providerURI)
if err != nil {
log.Println(err)
}当在本地运行时,使用与works相同的providerURI,我成功地获得了提供者!
我将它部署到K8S中,使用完全相同的提供者url (作为env变量),并使用port-forwarding调试,但是,在k8S中,我得到了错误,而没有得到provider。
错误是:
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库或其他更一般的东西有关。
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
不知道怎么做,知道吗?
发布于 2020-08-17 18:58:52
在oidc.ClientContext文档中,它展示了如何传递自定义http.Client
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,我使用以下帮助函数:
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
}以及:
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包中使用上面的内容进行快速测试:
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")如果这样做有效,那么将正确的信任文件添加到应用程序中:
hc, err := httpCli("/usr/local/share/ca-certificates/server.crt"))CA信托
如果您的server.crt信任文件无法工作,您可能列出了错误的主题/发行者。
要确定地知道,您可以从任何远程服务器(端口443是默认的https端口)进行获取信任证书 (和可选签名链):
echo | openssl s_client -connect ace.svar.com:443 -showcerts 2> /dev/null > ace.txt由于我不知道您的基础设施是什么样子,所以我将使用来自google.com:443的示例输出
---
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:)。因此,与其信任主题证书--人们可以相反地信任颁发者证书--允许可能的多台服务器是信任的。由于主体证书是由发行人签署的--信任链已经完成.
发布于 2020-08-17 09:03:02
Golang库正在以下目录中查找证书:unix.go#L18-L37 && L8-L15,如果要在新位置查找证书,可以使用环境变量:SSL_CERT_FILE或SSL_CERT_DIR,并设置证书的位置。所以在你的情况下应该是:
export SSL_CERT_DIR=/usr/local/share/ca-certificates/然后运行应用程序。
https://stackoverflow.com/questions/63416875
复制相似问题