为什么 Portainer 忽略我的证书,即使我指定了 --sslcert 和 --sslkey?

Why is Portainer ignoring my certificate even though I have specified --sslcert and --sslkey?

我在 docker 容器中安装了 Portainer CE 2.9.2 运行。我使用 --sslcert 和 --sslkey 选项启动它以指定我自己的证书,但浏览器一直显示内置证书,由本地主机而不是我的证书自签名。

我正在使用 Ansible 的社区 Docker 模块启动 Portainer。语法几乎与 docker compose 相同。这是 Ansible 剧本中的任务:

  - name: Run Portainer
    docker_container:
      image: portainer/portainer-ce
      name: portainer
      hostname: portainer
      state: started
      restart: yes
      restart_policy: unless-stopped
      ports:
      - 8000:8000
      - 9000:9000
      - 9443:9443
      volumes:
      - /opt/docker/portainer/certs:/certs
      - /opt/docker/portainer/data:/data
      - /var/run/docker.sock:/var/run/docker.sock
      command:
        --sslcert /certs/uno.home.crt --sslkey /certs/uno.home.key

使用 docker inspect,我可以看到它已获取命令行参数并且 /certs 绑定安装在那里。

  "Args": [
    "--sslcert",
    "/certs/uno.home.crt",
    "--sslkey",
    "/certs/uno.home.key"
  ]
...

  "HostConfig": {
    "Binds": [
        "/opt/docker/portainer/certs:/certs:rw",
        "/opt/docker/portainer/data:/data:rw",
        "/var/run/docker.sock:/var/run/docker.sock:rw"
    ]

我还可以验证容器内是否存在证书文件。

$ docker cp portainer:/certs .
$ ls certs
uno.home.crt  uno.home.key

但是,当我在端口 9443 上打开浏览器时,我得到一个由本地主机签名的证书,而不是我放在 /opt/docker/portainer/certs 目录中的证书。

我不认为这是我的证书的问题,因为我使用了与 Nginx 反向代理设置完全相同的证书并且它按预期工作。我最好的猜测是 Portainer 忽略了我的证书而选择了它的内置证书,因为无论我是否使用 --sslcert / --sslkey 选项,浏览器显示的证书都是相同的。但是,我不知道我哪里出错了。

日志文件显示没有错误:

$ docker logs portainer
level=info msg="2021/11/05 00:12:36 [INFO] [main,compose] [message: binary is missing, falling-back to compose plugin] [error: docker-compose binary not found]"
2021/11/05 00:12:36 server: Reverse tunnelling enabled
2021/11/05 00:12:36 server: Fingerprint 79:94:35:05:71:59:7a:eb:e9:03:a2:61:ad:1a:c5:11
2021/11/05 00:12:36 server: Listening on 0.0.0.0:8000...
level=info msg="2021/11/05 00:12:36 [INFO] [cmd,main] Starting Portainer version 2.9.2"
level=info msg="2021/11/05 00:12:36 [DEBUG] [chisel, monitoring] [check_interval_seconds: 10.000000] [message: starting tunnel management process]"
level=info msg="2021/11/05 00:12:36 [DEBUG] [internal,init] [message: start initialization monitor ]"
level=info msg="2021/11/05 00:12:36 [INFO] [http,server] [message: starting HTTPS server on port :9443]"
level=info msg="2021/11/05 00:12:36 [INFO] [http,server] [message: starting HTTP server on port :9000]"

我在网上找到的所有示例都说 docker 撰写样式配置应该这样完成:

command:
    --ssl
    --sslcert /certs/portainer.crt
    --sslkey /certs/portainer.key

除了文件名和 --ssl,这就是我所拥有的。在 Portainer 日志中看到一条消息说它是一个已弃用的选项并且只被接受是为了向后兼容,我删除了 --ssl

我想它忽略我的证书这一事实可能是一个错误,但如果这只是我的用户错误,我不想提交错误报告。任何人都可以看到我在这个东西的配置中哪里出错了吗?

这确实是一个错误,已由 Portainer 团队修复。 https://github.com/portainer/portainer/issues/6021