buildx icon indicating copy to clipboard operation
buildx copied to clipboard

Self signed certificate cannot be authenticated

Open GGbind opened this issue 2 years ago • 9 comments

Contributing guidelines

I've found a bug and checked that ...

  • [ ] ... the documentation does not mention anything about my problem
  • [X] ... there are no open or closed issues that are related to my problem

Description

ERROR: failed to solve: failed to push www.harbor.com/king/taxi-bus-server:0.1.9: failed to authorize: failed to fetch oauth token: Post "https://www.harbor.com/service/token": tls: failed to verify certificate: x509: certificate signed by unknown authority

Expected behaviour

Can be pushed normally

Actual behaviour

I searched for historical discussions and feedback on issues, but I still couldn't find a solution. I configured Toml and copied the certificate into the container. But x509 will still appear, but I can push normally using Docker Push

Buildx version

github.com/docker/buildx v0.10.5 86bdced

Docker info

Client: Docker Engine - Community
 Version:    24.0.2
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.10.5
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.18.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 10
  Running: 10
  Paused: 0
  Stopped: 0
 Images: 19
 Server Version: 24.0.2
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8
 runc version: v1.1.7-0-g860f061
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-1160.90.1.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 7.637GiB
 Name: harbor
 ID: f21487ee-68a3-48d6-997c-1df4e3577f87
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  www.harbor.com
  127.0.0.0/8
 Registry Mirrors:
  https://3ighvcgt.mirror.aliyuncs.com/
 Live Restore Enabled: false

Builders list

kingbuilder *  docker-container                                                          
  kingbuilder0 unix:///var/run/docker.sock running 81cd697                               linux/amd64, linux/386
default        docker                                                                    
  default      default                     running v0.11.7-0.20230525183624-798ad6b0ce9f linux/amd64, linux/386

Configuration

FROM azul/zulu-openjdk:8-jre-headless-latest

RUN mkdir -p /app WORKDIR /app COPY ./target/yudao-server.jar app.jar ENV TZ=Asia/Shanghai ENTRYPOINT ["java","-jar","app.jar"]

docker buildx build --platform linux/amd64,linux/arm64 -t www.harbor.com/king/taxi-bus-server:0.1.9 --push .

Build logs

[+] Building 4.8s (17/17) FINISHED                                                                                                                                                
 => [internal] load build definition from Dockerfile                                                                                                                         0.1s
 => => transferring dockerfile: 583B                                                                                                                                         0.0s
 => [linux/amd64 internal] load metadata for docker.io/azul/zulu-openjdk:8-jre-headless-latest                                                                               1.8s
 => [linux/arm64 internal] load metadata for docker.io/azul/zulu-openjdk:8-jre-headless-latest                                                                               1.9s
 => [internal] load .dockerignore                                                                                                                                            0.1s
 => => transferring context: 2B                                                                                                                                              0.0s
 => [linux/amd64 1/4] FROM docker.io/azul/zulu-openjdk:8-jre-headless-latest@sha256:d73a99fee1fa81ba16f6fb37998be6204d7e9dac81c4e2cc0b645c2820d37cca                         0.3s
 => => resolve docker.io/azul/zulu-openjdk:8-jre-headless-latest@sha256:d73a99fee1fa81ba16f6fb37998be6204d7e9dac81c4e2cc0b645c2820d37cca                                     0.3s
 => [internal] load build context                                                                                                                                            0.1s
 => => transferring context: 179B                                                                                                                                            0.0s
 => [linux/arm64 1/4] FROM docker.io/azul/zulu-openjdk:8-jre-headless-latest@sha256:d73a99fee1fa81ba16f6fb37998be6204d7e9dac81c4e2cc0b645c2820d37cca                         0.3s
 => => resolve docker.io/azul/zulu-openjdk:8-jre-headless-latest@sha256:d73a99fee1fa81ba16f6fb37998be6204d7e9dac81c4e2cc0b645c2820d37cca                                     0.3s
 => CACHED [linux/amd64 2/4] RUN mkdir -p /app                                                                                                                               0.0s
 => CACHED [linux/amd64 3/4] WORKDIR /app                                                                                                                                    0.0s
 => CACHED [linux/amd64 4/4] COPY ./target/yudao-server.jar app.jar                                                                                                          0.0s
 => CACHED [linux/arm64 2/4] RUN mkdir -p /app                                                                                                                               0.0s
 => CACHED [linux/arm64 3/4] WORKDIR /app                                                                                                                                    0.0s
 => CACHED [linux/arm64 4/4] COPY ./target/yudao-server.jar app.jar                                                                                                          0.0s
 => ERROR exporting to image                                                                                                                                                 1.6s
 => => exporting layers                                                                                                                                                      0.0s
 => => exporting manifest sha256:24986b7a9a2a90be027deacd9af996e85a0918638f4af9c047e4ab4173b63c6f                                                                            0.1s
 => => exporting config sha256:e2550a7cbbc72a19c26d151ef15b01e081870fd0d2d12c3dcd99df44319a6330                                                                              0.1s
 => => exporting attestation manifest sha256:b45acfa2ff21ee3949e38051bd71665b6c82f5237252b9700494ece5cf559954                                                                0.3s
 => => exporting manifest sha256:48093dce8b9e6d95234a7955036a743315d76fe599d3ed229804036ec71ead32                                                                            0.1s
 => => exporting config sha256:afdf5369c4787d7a11563750094f2e9a9ef768e0b3c9ca46c44cb69c713489c4                                                                              0.1s
 => => exporting attestation manifest sha256:c9629a393c4c893ec8255dd33a528e905cfe1245f88c735a585140b8cb2d31d9                                                                0.2s
 => => exporting manifest list sha256:85244e7cd337ebd6f533946e6d59f830ddf7a0633fa02a1d4b91befb1288790b                                                                       0.1s
 => => pushing layers                                                                                                                                                        0.0s
 => [auth] king/taxi-bus-server:pull,push token for www.harbor.com                                                                                                           0.0s
 => [auth] king/taxi-bus-server:pull,push token for www.harbor.com                                                                                                           0.0s
 => [auth] king/taxi-bus-server:pull,push token for www.harbor.com                                                                                                           0.0s
------
 > exporting to image:
------
ERROR: failed to solve: failed to push www.harbor.com/king/taxi-bus-server:0.1.9: failed to authorize: failed to fetch oauth token: Post "https://www.harbor.com/service/token": tls: failed to verify certificate: x509: certificate signed by unknown authority

Additional info

debug = true

insecure-entitlements = [ "network.host", "security.insecure" ]


[registry."www.harbor.com"]
  mirrors = [
    "3ighvcgt.mirror.aliyuncs.com"
  ]
  insecure = true
  ca=["/etc/buildkit/www.harbor.com.crt"]
  [[registry."www.harbor.com".keypair]]
    key="/etc/buildkit/www.harbor.com.key"
    cert="/etc/buildkit/www.harbor.com.cert"

GGbind avatar Aug 18 '23 07:08 GGbind

As you're using a container builder, can you post your BuildKit logs please? Can be seen with docker logs buildx_buildkit_kingbuilder0.

crazy-max avatar Oct 20 '23 13:10 crazy-max

Hi, I'm building a multi-arch image using buildx on Apple Silicon M1. I've already added my private registry domain name into docker configuration insecure-registries setting.

Mine builder log:

time="2023-11-15T00:20:39Z" level=info msg="auto snapshotter: using overlayfs"
time="2023-11-15T00:20:39Z" level=warning msg="using host network as the default"
time="2023-11-15T00:20:39Z" level=info msg="found worker \"io9cq40biuaowbgafw3fwlp83\", labels=map[org.mobyproject.buildkit.worker.executor:oci org.mobyproject.buildkit.worker.hostname:a1f1153736eb org.mobyproject.buildkit.worker.network:host org.mobyproject.buildkit.worker.oci.process-mode:sandbox org.mobyproject.buildkit.worker.selinux.enabled:false org.mobyproject.buildkit.worker.snapshotter:overlayfs], platforms=[linux/arm64 linux/riscv64 linux/ppc64le linux/s390x linux/386 linux/mips64 linux/arm/v7 linux/arm/v6]"
time="2023-11-15T00:20:39Z" level=warning msg="skipping containerd worker, as \"/run/containerd/containerd.sock\" does not exist"
time="2023-11-15T00:20:39Z" level=info msg="found 1 workers, default=\"io9cq40biuaowbgafw3fwlp83\""
time="2023-11-15T00:20:39Z" level=warning msg="currently, only the default worker can be used."
time="2023-11-15T00:20:39Z" level=info msg="running server on /run/buildkit/buildkitd.sock"
time="2023-11-15T00:20:58Z" level=error msg="/moby.buildkit.v1.Control/Solve returned error: rpc error: code = Canceled desc = context canceled"
time="2023-11-15T00:28:36Z" level=warning msg="forcibly turning on oci-mediatype mode for attestations" spanID=1a4e4df378aec7ea traceID=100db93628abd9a5d4bffff468c3277f
time="2023-11-15T00:28:37Z" level=error msg="/moby.buildkit.v1.Control/Solve returned error: rpc error: code = Unknown desc = failed to push docker.vpn/omsv-blank-database:20231114: failed to do request: Head \"https://docker.vpn/v2/omsv-blank-database/blobs/sha256:0c64aeff28be01d1b097dd81ca75dfe3596cf6d1a91fb8018280955cf48718eb\": tls: failed to verify certificate: x509: certificate signed by unknown authority"

bigfoot90 avatar Nov 15 '23 00:11 bigfoot90

Hi,

I've a very similar situation. Same errors messages about certificates.

2 local registries over https by self-generated certs and insecures-registries set on every docker daemon.

I can pull/push without any problems.... but can't build with images from my local registries because certs can't be verified.

dginhoux avatar Dec 21 '23 17:12 dginhoux

I have the same issue, any updates on this issue? Or maybe a workaround

fjglira avatar Jan 18 '24 15:01 fjglira

@GGbind You may need to make the local machine trust your self-signed certificate by executing the following command:

cp /path/to/your_ca.crt /etc/pki/ca-trust/source/anchors/extca.crt
update-ca-trust

ethan256 avatar Jan 25 '24 07:01 ethan256

我在ubuntu 20.04上执行下面的操作解决了该问题: echo -n | openssl s_client -showcerts -connect harbor.XXX.local:443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >> ./my_harbor.crt

cp my_harbor.crt /usr/local/share/ca-certificates/

update-ca-certificates

yanggongwang avatar Feb 20 '24 05:02 yanggongwang

Any update on these, We are still facing this issue

Utkarsh-vishnoi avatar Mar 13 '24 10:03 Utkarsh-vishnoi

@Utkarsh-vishnoi I successfully pushed the mirror value private harbor on Ubuntu 22.04 TLS using the following method.

  1. Generate a ca certificate using openssl and issue a harbor certificate.
  2. change harbor configuration: update IP, add certificate
  3. add the ca certificate to the local certificate trust chain:
sudo cp ca.crt /usr/local/share/ca-certificates
sudo update-ca-certificates
  1. Create the buildkitd.toml file with the following contents
debug = true
insecure-entitlements = [ "network.host", "security.insecure" ]

[ registry. "your_harbor_ip" ]
  insecure = true
  1. Execute buildx build named:
docker buildx create --use --driver docker-container --name buildx_main --config . /buildkitd.toml > /dev/null 2>&1 || true
docker buildx build --platform linux/amd64,linux/arm64 --push -f Dockerfile -t {your_harbor_ip}/test:1.0.0 .
``

ethan256 avatar Mar 15 '24 01:03 ethan256

It worked. Thanks @ethan256

Utkarsh-vishnoi avatar Mar 15 '24 04:03 Utkarsh-vishnoi

debug = true insecure-entitlements = [ "network.host", "security.insecure" ]

[ registry. "your_harbor_ip" ] insecure = true

如果对于https的harbor自签镜像仓库,这样配置好像无效,只能使用方法3

gitfxx avatar Nov 19 '24 09:11 gitfxx

I am having the exact same problem and I couldn't make it work. Running update-ca-certificates is not an option for me, but even when I tried, it didn't work.

Relevant code - it's an open source project: https://github.com/humansoftware/example_self_hosted_saas_app/pull/7

When I inspect the builder, I see the right config:

Run docker buildx inspect --bootstrap
  docker buildx inspect --bootstrap
  shell: /usr/bin/bash -e {0}
...
File#certs/harbor.local/ca.crt:
 > -----BEGIN CERTIFICATE-----
 > MIICxzCCAa+gAwIBAgIRAPEcmYalLZhUgCmVkc/+DSIwDQYJKoZIhvcNAQELBQAw
...
 > -----END CERTIFICATE-----
 > 
File#buildkitd.toml:
 > debug = true
 > insecure-entitlements = ["network.host", "security.insecure"]
 > 
 > [registry]
 > 
 >   [registry."harbor.local"]
 >     ca = ["/etc/buildkit/certs/harbor.local/ca.crt"]
 >     insecure = true
 > 

But when cache tries to export:


 > importing cache manifest from harbor.local/example-self-hosted-saas-app/example-self-hosted-saas-app:buildcache:
------
------
 > exporting cache to registry:
------
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
 3 warnings found (use docker --debug to expand):
 - LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 22)
 - LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 13)
 - LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 21)
ERROR: failed to build: failed to solve: failed to fetch oauth token: Post "https://harbor.local/service/token": tls: failed to verify certificate: x509: certificate signed by unknown authority
Error: Process completed with exit code 1.

mvallebr avatar Jul 06 '25 23:07 mvallebr

I am having the exact same problem and I couldn't make it work. Running update-ca-certificates is not an option for me, but even when I tried, it didn't work.

Relevant code - it's an open source project: humansoftware/example_self_hosted_saas_app#7

When I inspect the builder, I see the right config:

Run docker buildx inspect --bootstrap
  docker buildx inspect --bootstrap
  shell: /usr/bin/bash -e {0}
...
File#certs/harbor.local/ca.crt:
 > -----BEGIN CERTIFICATE-----
 > MIICxzCCAa+gAwIBAgIRAPEcmYalLZhUgCmVkc/+DSIwDQYJKoZIhvcNAQELBQAw
...
 > -----END CERTIFICATE-----
 > 
File#buildkitd.toml:
 > debug = true
 > insecure-entitlements = ["network.host", "security.insecure"]
 > 
 > [registry]
 > 
 >   [registry."harbor.local"]
 >     ca = ["/etc/buildkit/certs/harbor.local/ca.crt"]
 >     insecure = true
 > 

But when cache tries to export:


 > importing cache manifest from harbor.local/example-self-hosted-saas-app/example-self-hosted-saas-app:buildcache:
------
------
 > exporting cache to registry:
------
WARNING: No output specified with docker-container driver. Build result will only remain in the build cache. To push result image into registry use --push or to load image into docker use --load
 3 warnings found (use docker --debug to expand):
 - LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 22)
 - LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 13)
 - LegacyKeyValueFormat: "ENV key=value" should be used instead of legacy "ENV key value" format (line 21)
ERROR: failed to build: failed to solve: failed to fetch oauth token: Post "https://harbor.local/service/token": tls: failed to verify certificate: x509: certificate signed by unknown authority
Error: Process completed with exit code 1.

Try adding the certificate to the certificate trust chain on your local machine. Here's how to do it on Ubuntu:

sudo cp ca.crt /usr/local/share/ca-certificates
sudo update-ca-certificates

ethan256 avatar Jul 07 '25 00:07 ethan256

This is not running on my local machine, it's running on a k3s cluster produced by https://github.com/humansoftware/self-host-saas-k3s Here is how I create runners: https://github.com/humansoftware/self-host-saas-k3s/blob/main/roles/github_actions/templates/runnerdeployment.yaml.j2#L24

In my previous attempts, I tried something like bellow:

- name: runner
          image: summerwind/actions-runner:latest
          volumeMounts:
            - name: harbor-ca
              mountPath: /etc/buildkit/certs/{{harbor_domain}}/ca.crt
              subPath: ca.crt
            # Mount to a location for update-ca-certificates
            - name: harbor-ca
              mountPath: /usr/local/share/ca-certificates/harbor-ca.crt
              subPath: ca.crt
          lifecycle:
            postStart:
              exec:
                command:
                  - /bin/sh
                  - -c
                  - |
                    update-ca-certificates && su runner -c /usr/bin/entrypoint.sh
          securityContext:
            runAsUser: 0

So update-ca-certificates was being run on my runner (I checked), but it still didn't work. When buildx starts a new container, it copies the certificate from my runner to the container, as inspect shows that happened successfully, but then the command update-ca-certificates would have to run inside the created container, not inside my runner's one.

This is confirmed in the documentation: https://docs.docker.com/reference/cli/docker/buildx/create/#buildkitd-config

Note that if you create a docker-container builder and have specified certificates for registries in the buildkitd.toml configuration, the files will be copied into the container under /etc/buildkit/certs and configuration will be updated to reflect that.

Correct me if I am wrong, but isn't this a problem in the default image container spawed by buildx? I can see the following in the setup logs:

/usr/local/bin/docker buildx inspect --bootstrap --builder builder-841865e2-48d2-4dca-b55d-8625b8f6c9fe
  #1 [internal] booting buildkit
  #1 pulling image moby/buildkit:buildx-stable-1
  #1 pulling image moby/buildkit:buildx-stable-1 4.9s done
  #1 creating container buildx_buildkit_builder-841865e2-48d2-4dca-b55d-8625b8f6c9fe0
  #1 creating container buildx_buildkit_builder-841865e2-48d2-4dca-b55d-8625b8f6c9fe0 2.1s done
  #1 DONE 7.0s
  Name:          builder-841865e2-48d2-4dca-b55d-8625b8f6c9fe
  Driver:        docker-container
  Last Activity: 2025-07-06 23:16:17 +0000 UTC

So moby/buildkit:buildx-stable-1 should somehow be using the CA certificate and it's not - maybe a bug in this image or this is the image that has to run update-ca-certificates ?

mvallebr avatar Jul 07 '25 07:07 mvallebr