【问题标题】:How do I get web browsers in third-party containers in DDEV to accept my mkcert SSL certificate?如何让 DDEV 中第三方容器中的 Web 浏览器接受我的 mkcert SSL 证书?
【发布时间】:2019-05-24 17:08:01
【问题描述】:

我使用的是 DDEV 1.8.0。

我使用 justinribeiro/chrome-headless 运行 Behat 测试。它通过一个名为 docker-compose.chrome.yaml 的附加 Docker Compose 文件包含在我的 DDEV 项目中。内容如下:

---
version: '3.6'
services:
  chrome:
    image: justinribeiro/chrome-headless
    restart: unless-stopped
    container_name: ddev-${DDEV_SITENAME}-chrome
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
      com.ddev.app-url: $DDEV_URL
    volumes:
      - ddev-global-cache:/mnt/ddev-global-cache
    external_links:
      - "ddev-router:fps.ddev.local"
      - "ddev-router:dev.fillpdf-service.com"
    cap_add:
      - SYS_ADMIN
    ports:
      - '9222:9222'
networks:
  default:
    external:
      name: ddev_default

chrome 服务不包含 mkcert,因此使用此容器的 Behat 测试失败,因为无头 Chrome 实例拒绝 SSL 证书。如何让 Chrome 和 cURL/wget 识别 mkcert CA 颁发的证书?

【问题讨论】:

    标签: ddev


    【解决方案1】:

    让 mkcert 在第三方容器中工作相当简单。 headless Chrome、Chromium、Firefox 和其他不使用 Linux 系统存储的浏览器不太直观。

    首先,让我们看看我们必须做出哪些改变才能让一切正常工作。必要时,我会在每个文件下包含简要说明。我会在最后一起解释。

    .ddev/docker-compose.chrome.yaml:

    ---
    version: '3.6'
    services:
      chrome:
        build:
          context: ./chrome-build
        restart: unless-stopped
        container_name: ddev-${DDEV_SITENAME}-chrome
        labels:
          com.ddev.site-name: ${DDEV_SITENAME}
          com.ddev.approot: $DDEV_APPROOT
        volumes:
          - ddev-global-cache:/mnt/ddev-global-cache
        external_links:
          - "ddev-router:fps.ddev.local"
          - "ddev-router:dev.fillpdf-service.com"
        cap_add:
          - SYS_ADMIN
        ports:
          - '9222:9222'
    networks:
      default:
        external:
          name: ddev_default
    

    我们将image 选项更改为build,并将其指向一个我们即将创建的新文件夹。

    新文件夹:.ddev/chrome-build/Dockerfile

    .ddev/chrome-build/Dockerfile

    FROM justinribeiro/chrome-headless
    ADD chrome-startup.sh /
    
    ENV MKCERT_VERSION=v1.3.0
    USER root
    RUN apt-get update && apt-get install -y curl openssl libnss3-tools && curl -sSL https://github.com/FiloSottile/mkcert/releases/download/$MKCERT_VERSION/mkcert-$MKCERT_VERSION-linux-amd64 -o /usr/local/bin/mkcert && chmod +x /usr/local/bin/mkcert && apt-get purge -y curl && apt-get clean && chmod +x /chrome-startup.sh
    ENTRYPOINT [ "/chrome-startup.sh" ]
    

    .ddev/chrome-build/chrome-startup.sh

    #!/bin/bash
    if [[ ! -f /.mkcert-configured ]]; then
      #!/usr/bin/env bash
      # Install for root (system).
      CAROOT="/mnt/ddev-global-cache/mkcert" mkcert -install
    
      # Install for user: chrome.
      su chrome -c 'mkdir -p $HOME/.local/share/mkcert'
      cp -R /mnt/ddev-global-cache/mkcert/* /home/chrome/.local/share/mkcert/
      chown -R chrome: /home/chrome/.local/share/mkcert
      # Create the NSS trust store BEFORE running mkcert; mkcert doesn't reliably
      # work otherwise.
      su chrome -c 'mkdir -p $HOME/.pki/nssdb'
      su chrome -c 'certutil -d sql:$HOME/.pki/nssdb -N --empty-password'
      su chrome -c 'cd $HOME && TRUST_STORES=nss mkcert -install'
    
      touch /.mkcert-configured
    fi
    
    # Run headless Chrome in the foreground (the original container's command).
    su chrome -c 'google-chrome --headless --disable-gpu --remote-debugging-address=0.0.0.0 --remote-debugging-port=9222'
    

    Dockerfile 在justinribeiro/chrome-headless 之上构建一个自定义容器。我们安装 mkcert 先决条件、mkcert 本身和可选的libnss3-tools 先决条件。在这种情况下,这对我们来说不是可选的。

    我们还将用户上下文更改为 root,因为我们需要 root 才能启动脚本工作。

    chrome-startup.sh 脚本安装 mkcert。我们必须在启动时安装它,因为我们依赖于包含证书的已安装卷。它在构建时不可用。它在系统范围内安装它,然后为 chrome 用户安装它,无头 Chrome 实际运行在这个容器中。

    在为chrome 用户安装时,一个值得注意的棘手部分是我们必须手动创建 Firefox、无头 Chrome 和 Chromium 使用的 NSS DB。 mkcert -install 命令应该自动创建它,但并非总是如此。但是,如果我们先创建 NSS DB,它确实可以正常工作。

    添加这些文件后,只需使用ddev startddev restart,将Behat 配置为在http://192.168.65.2:9222 上使用无头Chrome,您现在应该可以将Behat\MinkExtension.base_url 设置为https://mysite.ddev.local (其中mysite 替换为您的项目名称)。 Headless Chrome 现在应该接受 SSL 证书。我没有详细解释 Behat 配置,因为它超出了这个答案的范围。

    Behat 现在应该可以工作(或继续工作)。

    您还可以测试无头 Chrome 是否手动识别您的 SSL 证书。

    SSH 进入容器:ddev ssh -s chrome

    打印网站内容:su chrome -c 'google-chrome --headless --disable-gpu --dump-dom https://mysite.ddev.local'

    如果证书验证失败,您将看到包含以下内容的输出:

    [0524/160648.082825:ERROR:cert_verify_proc_nss.cc(975)] CERT_PKIXVerifyCert for dev.fillpdf-service.com failed err=-8179
    

    如果您看到的是一堆 HTML,则表示它正在工作!

    【讨论】:

      猜你喜欢
      • 2016-08-24
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 2016-09-16
      相关资源
      最近更新 更多