docker多级生成Go映像-x509:由未知权限签署的证书

docker多级生成Go映像-x509:由未知权限签署的证书,go,docker-multi-stage-build,docker,go-build,go-git,Go,Docker Multi Stage Build,Docker,Go Build,Go Git,我尝试在私人公司网络使用中创建图像: 并获取x509:由未知机构签名的证书错误 Step 1/13 : FROM golang:latest as builder ---> 2421885b04da Step 2/13 : WORKDIR /app ---> Using cache ---> 6555644dbd16 Step 3/13 : COPY go.mod go.sum ./ ---> 55d45a30f492 Step 4/13 : RUN go mod

我尝试在私人公司网络使用中创建图像:


并获取
x509:由未知机构签名的证书
错误

Step 1/13 : FROM golang:latest as builder
 ---> 2421885b04da
Step 2/13 : WORKDIR /app
 ---> Using cache
 ---> 6555644dbd16
Step 3/13 : COPY go.mod go.sum ./
 ---> 55d45a30f492
Step 4/13 : RUN go mod download
 ---> Running in 88c21c6b4fab
go: github.com/dgrijalva/jwt-go/v4@v4.0.0-preview1: Get "https://proxy.golang.org/github.com/dgrijalva/jwt-go/v4/@v/v4.0.0-preview1.mod": x509: certificate signed by unknown authority
The command '/bin/sh -c go mod download' returned a non-zero code: 1
make: *** [docker] Error 1

我试图从中找到答案



,



,但结果是一样的



❗️如果添加
-不安全
标志

...
RUN go env -w GOPROXY=direct GOFLAGS="-insecure"
COPY go.mod go.sum ./
...

对于
Dockerfile
我将提出几点建议:

  • 在与最终代码映像相同的操作系统发行版中构建代码,以便确保代码将在该特定发行版中运行。另外,一些发行版要求证书位于不同的文件夹中,因此请注意这一点
  • 在第一张图像中使用alpine将大大缩短构建时间。您可以看到
    最新的
    尺寸约为260M,但
    阿尔卑斯山的
    尺寸约为100M
  • 更好的做法是使用特定版本的alpine,这样您就可以确保代码在该版本中运行(我将由您自行决定)
  • Golang非常强大的一点是,您可以在名为
    scratch
    的空docker映像中运行它,这意味着您的最终docker映像只包含您自己的可执行文件
  • 如果您需要自己的证书,则必须在代码中包含这些证书,并在执行
    update ca certificates
    之前复制它们,以便将它们包含在最终文件中

下面是dockerfile的一个例子,我在上面解释过

FROM golang:alpine as builder
WORKDIR /app

# This will download all certificates (ca-certificates) and builds it in a
# single file under /etc/ssl/certs/ca-certificates.crt (update-ca-certificates)
# I also add git so that we can download with `go mod download` and
# tzdata to configure timezone in final image
RUN apk --update add --no-cache ca-certificates openssl git tzdata && \
update-ca-certificates

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

# Golang can run in a scratch image, so that, the only thing that your docker 
# image contains is your executable
FROM scratch
LABEL maintainer="Kozmo"
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo

# This line will copy all certificates to final image
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]

如果自己的证书将第一个docker阶段替换为:

FROM golang:alpine as builder
WORKDIR /app

RUN apk --update add --no-cache ca-certificates openssl git tzdata

COPY your/cert/path /usr/local/share/ca-certificates/your-cert-name

RUN update-ca-certificates

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

因为您使用自己的证书,所以最终的
Dockerfile
将如下所示:

FROM golang:alpine as builder
WORKDIR /app

RUN apk --update add --no-cache ca-certificates openssl git tzdata

COPY your/cert/path /usr/local/share/ca-certificates/your-cert-name

RUN update-ca-certificates

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 scratch
LABEL maintainer="Kozmo"
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo

# This line will copy all certificates to final image
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]

如果您有任何疑问,请随时问我:)

来自您的错误消息


得到 "https://proxy.golang.org/github.com/dgrijalva/jwt-go/v4/@v/v4.0.0-preview1.mod”: x509:由未知权限签署的证书


看起来proxy.golang.org的CA根不是您的私有公司docker环境中受信任的根CA的一部分


我会尝试使用以下工具安装它:


1-从proxy.golang.org获取证书:

echo -n | openssl s_client -connect proxy.golang.org:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./golang.cer

如果打开golang.cer,您应该会看到证书链



2-将其安装到受信任的根CA中:

certutil.exe -addstore root golang.cer

…或在Mac上:


2a-双击证书文件(扩展名为“.cer”)


2b-从钥匙链选项中选择“系统”。然后按“OK”


2c-当弹出以下窗口时,单击“始终信任”按钮。

git
使用
curl
访问
https
服务器,因此您需要将证书导入系统的
CA存储


解决方法是在代理环境变量上定义环境变量
GIT\u SSL\u NO\u VERIFY=1
,但在使用
go-get
go-mod-download
时,它不起作用。您是否尝试在客户端重新启动docker.service?@Ashok-zero results?这是否回答了您的问题?@Peter-当我使用
golang:latest
I get
命令'/bin/sh-c apk add--no cache ca certificates'返回一个非零代码:127
@Peter-当我使用
golang:alpine
I get
go:github.com/dgrijalva/jwt-go时/v4@v4.0.0-预览1:git init——裸入/go/pkg/mod/cache/vcs/DBB1616A13223A75321E21A8150B1A778150B73E761213ECC0AB67568C38AC2:exec:“git”:在$PATH中找不到可执行文件
我有相同的错误(
x509:由未知机构签署的证书
)在步骤
RUN go mod download
中,您对我为什么获得
x509:由未知机构签署的证书有什么建议吗
使用您提供的
Dockerfile
❓您是否复制了第二部分所述的证书?此外,我忘了提到它们必须是
.pem
格式,以便
更新ca证书
将它们拾取并添加到可信证书如果我使用
golang:latest as builder
并复制自证书(查看我的答案),我的意思是复制您自己的证书作为我答案的第二部分。将它们复制到
/usr/local/share/ca certificates/
阶段中的
golang:latest as builder
添加
将其安装到受信任的根ca中…
对于mac/nix,请
certutil.exe -addstore root golang.cer