首页  >  文章  >  后端开发  >  如何修复 Go 项目 Docker 多阶段构建中的'x509:证书由未知机构签名”错误?

如何修复 Go 项目 Docker 多阶段构建中的'x509:证书由未知机构签名”错误?

Susan Sarandon
Susan Sarandon原创
2024-11-04 00:23:30689浏览

How to Fix

Docker 多阶段构建:解决“x509:由未知机构签署的证书”错误

尝试为 Go 构建 Docker 镜像时使用多阶段构建的私有企业网络,可能会出现“x509:由未知权威机构签名的证书”错误。此问题源于检索 Go 依赖项时的证书和身份验证问题。

理解问题:

发生错误的原因是 Go 使用 git 来访问依赖项,利用卷曲。这需要将必要的证书导入到系统的 CA 存储中。最初建议使用环境变量 GIT_SSL_NO_VERIFY=1,但事实证明这种方法对于获取依赖关系无效。

解决方案:将证书导入到 CA Store

到要解决这个问题,需要将相关证书导入到系统的CA存储中。执行此操作的方法因操作系统而异,但通常涉及使用 openssl 命令。

例如,在基于 Debian 的系统中,可以使用以下命令:

  1. apt-get update && apt-get install -y ca-certificates openssl
  2. openssl s_client -showcerts -connect github.com:443 /null 2>/dev/null | openssl x509 -outform PEM > > /usr/local/share/ca-certificates/github.crt (用于 GitHub 证书)
  3. openssl s_client -showcerts -connect proxy.golang.org:443 /null 2>/dev/null | openssl x509 -outform PEM > > /usr/local/share/ca-certificates/proxy.golang.crt (用于 proxy.golang.org 证书)
  4. update-ca-certificates

修改后的 Dockerfile :

通过将这些证书导入步骤合并到 Dockerfile 中,可以解决问题,从而可以获取依赖项并成功进行构建。以下是更新后的 Dockerfile:

FROM golang:latest as builder

RUN apt-get update && apt-get install -y ca-certificates openssl

ARG cert_location=/usr/local/share/ca-certificates

# Get certificate from "github.com"
RUN openssl s_client -showcerts -connect github.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM > ${cert_location}/github.crt
# Get certificate from "proxy.golang.org"
RUN openssl s_client -showcerts -connect proxy.golang.org:443 </dev/null 2>/dev/null | openssl x509 -outform PEM > ${cert_location}/proxy.golang.crt
# Update certificates
RUN update-ca-certificates

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN GO111MODULE="on" CGO_ENABLED=0 GOOS=linux go build -o main ${MAIN_PATH}

FROM alpine:latest
LABEL maintainer="Kozmo"
RUN apk add --no-cache bash
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["/./main"]

以上是如何修复 Go 项目 Docker 多阶段构建中的'x509:证书由未知机构签名”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn