我正在使用mkcert生成一个自签名的证书和权限。当我用ListenandServetls
在本地使用这些文件时,我可以成功地用curl连接。我的主机是macos。
但是,当尝试在docker容器中运行此Go代码时,我得到以下错误:
X509:由未知授权机构签署的证书
mkcert -cert-file ./cert.pem -key-file ./key.pem localhost
// Load cert + key.
cert, _ := tls.LoadX509KeyPair("cert.pem", "key.pem")
// Load our CA. (Mkcert also generates this btw, check the docs).
caCert, _ := ioutil.ReadFile("rootCA.pem")
// Add our CA so it's considered an acceptable rootCA.
rootCAs, _ := x509.SystemCertPool()
rootCAs.AppendCertsFromPEM(caCert)
server := http.Server{
Addr: ":1234",
Handler: router,
TLSConfig: &tls.Config{
Certificates: []tls.Certificate{cert},
RootCAs: rootCAs,
},
}
_ = server.ListenAndServeTLS("", "")
ARG GO_VERSION=1.14
FROM golang:${GO_VERSION}-alpine AS builder
RUN apk add --no-cache ca-certificates git curl
ENV CGO_ENABLED=0
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . /app
RUN go build -o ./bin/app .
FROM alpine AS final
WORKDIR /app
COPY --from=builder /user/group /user/passwd /etc/
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
COPY --from=builder /app/bin/app /app
ENTRYPOINT ["./app"]
my-app:
build:
context: ./
dockerfile: Dockerfile
ports:
- 1234:1234
当运行上述容器并通过TLS连接时,我得到上面描述的未知权限错误。
我错过了什么?
问题在于您的多阶段DockerFile
。在第一阶段复制所有必需的构件(源代码、证书等)时,在最后阶段只复制二进制bin/app
:
COPY --from=builder /app/bin/app /app
您还需要复制服务运行时使用的PEM文件:
COPY --from=builder \
/app/cert.pem \
/app/key.pem \
/app/rootCA.pem \
/app/
无论一个操作看起来多么微不足道,总是检查错误(和布尔返回):
cert, err := tls.LoadX509KeyPair("cert.pem", "key.pem")
if err != nil {
log.Fatalf("failed to load server key pairs: %v", err)
}
rootCAs, err := x509.SystemCertPool()
if err != nil {
log.Fatalf("failed to load system keychain: %v", err)
}
caCert, err := ioutil.ReadFile("rootCA.pem")
if err != nil {
log.Fatalf("failed to read CA trust file rootCA.pem: %v", err)
}
ok := rootCAs.AppendCertsFromPEM(caCert)
if !ok {
log.Fatal("failed to load CA trust: bad PEM format?")
}
log.Fatalf(
"server error: %v", // e.g. "port in use"
server.ListenAndServeTLS("", ""),
)
我试图从Web请求数据的一些基本示例,但是所有对不同主机的请求都会导致SSL错误:。注意:我不支持代理,也没有发生任何形式的证书拦截,因为使用curl或浏览器没有问题。 我目前使用的代码示例是: 编辑:代码运行在Arch linux内核4.9.37-1-lts上。 编辑2:显然在我的系统上的版本之间有差异,通过(重新)移动证书并重新手动安装包,问题得到了解决。
在我的Go应用程序中,我打电话到 这取决于环境,在本地将在http上,而在生产环境中,它将在 当我使用postman在https上测试生产路由时,没有问题,路由工作正常。 但是当我从WS运行它时,我得到: 这是我的代码: 我能做些什么来解决这个问题?
我正在配置一个Kubernetes集群,在CoreOS中有2个节点,如中所述https://coreos.com/kubernetes/docs/latest/getting-started.html没有法兰绒。两台服务器都在同一个网络中。 但在worker中运行kubelet时,我得到了:x509:未知授权机构签署的证书(可能是因为尝试验证候选授权机构证书“kube ca”时出现了“crypto
我很困惑,不知道会有什么错? 非常感谢任何帮助。谢谢大家...
我正在使用Golang 1.9创建一个客户端应用程序。2,我在访问后端时遇到一些问题。问题是我的应用程序在最新版本的Windows和Linux中运行良好,但是,当我在Windows XP上运行它时(是的,不幸的是,我必须支持Windows XP,因为我们的一些客户拒绝升级他们的操作系统),我在尝试执行HTTP get和HTTP POST:
我在围棋中写的反向程序有点麻烦。我想连接我的Golang Web服务器和我的Apache Web服务器。我的Apache Web服务器应该也在https和反向代理上运行。因此,我编写了以下代码,但我总是得到错误:代理错误:x509:由未知授权机构签署的证书。那么apache必须使用与apache相同的证书,还是有什么问题?这里有一些代码片段,但我认为没有ssl的证书存在问题,一切正常:( 我做了很