当前位置: 首页 > 知识库问答 >
问题:

ListenAndServeTLS在本地运行-X509:在docker中由未知授权机构签署的证书

秦阳旭
2023-03-14

我正在使用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连接时,我得到上面描述的未知权限错误。

我错过了什么?

共有1个答案

罗心思
2023-03-14

问题在于您的多阶段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的证书存在问题,一切正常:( 我做了很