在selenium docker镜像中安装无头chrome的证书

问题描述 投票:0回答:2

我正在使用 python 和 selenium 运行 headless chrome。对于我的自动化测试,我们正在非生产环境中进行测试,如果不在您的计算机上安装 .crt 证书,则无法访问该环境:

Current User>Trusted Root Certificate Authority

在 Dockerfile 中,我安装的证书如下:

FROM selenium/standalone-chrome-debug:latest

RUN sudo apt-get update && sudo apt-get install -y python3 python3-pip 
RUN sudo apt-get update && sudo pip3 install pytest pytest-html selenium behave allure-behave

COPY . /home

ADD /certs/*.crt /usr/local/share/ca-certificates/
RUN sudo chmod 644 /usr/local/share/ca-certificates/*.crt && sudo apt-get update && sudo update-ca-certificates && sudo apt-get update 

为了使无头镀铬工作,我使用以下参数作为镀铬选项:

    elif data.get('browser') == 'container':
        chrome_options.add_argument("--headless")
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        chrome_options.add_argument('add_experimental_option("excludeSwitches",["ignore-certificate-errors"])')
        chrome_options.add_argument('window-size=1200x600')
        context.driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_options)

问题: 现在,当我在安装了此 .crt 证书的个人计算机上以无头模式运行测试时,我的测试可以正常工作。当我尝试在无头模式的容器内运行它时,其中这些证书安装在 Dockerfile 中,我的测试失败,并截取此非生产环境的屏幕截图给我一个空白图像(全白屏幕)。这意味着容器中的无头 Chrome 由于证书问题而无法加载网站。

如果我尝试截取任何其他不需要任何证书的网站的屏幕截图,它会按预期工作。

我是否需要添加任何其他步骤来确保 .crt 证书正确安装在“受信任的根证书颁发机构”中,以便在容器中的无头模式下也能正常工作。

从容器内部:

  • 我可以看到 .crt 文件复制到
    /usr/local/share/ca-certificates
    目录。
  • 我什至可以使用curl命令并看到DOM被它访问,因此证书文件正在工作。
  • 仅当将 chrome 与 selenium 一起使用时,我无法访问此网址。我的猜测是 Chrome 需要一些额外的配置才能使用该证书。
python selenium dockerfile certificate google-chrome-headless
2个回答
4
投票

经过更多挖掘后,我发现证书被复制到容器内的以下目录(我必须进入容器中的 bash shell 并针对以下步骤进行一些故障排除):

/usr/local/share/ca-certificates

为了测试证书是否有效,我尝试在非产品环境 url(来自容器内部)上使用curl,这也有效。此时,我确信证书位于容器中并且正在工作,但 chrome 由于某种原因无法使用这些证书。

为了解决这个问题,我使用 chrome 选项将这些功能添加到 chrome 中:

capabilities = chrome_options.to_capabilities()         #cap
capabilities['acceptInsecureCerts'] = True              #cap

它开始按预期工作。要查看我必须添加才能完成这项工作的所有参数和功能,下面是 chrome 的完整配置:

    elif data.get('browser') == 'container':
        #chrome_options.addArguments("--headless", "--window-size=1920,1200","--ignore-certificate-errors")
        chrome_options.add_argument("--headless")
        chrome_options.add_argument('--disable-gpu')
        chrome_options.add_argument('--no-sandbox')
        chrome_options.add_argument('--disable-dev-shm-usage')
        #chrome_options.add_argument('--allow-running-insecure-content')
        #chrome_options.add_argument('--disable-web-security')
        #chrome_options.add_experimental_option('useAutomationExtension', False)
        chrome_options.add_argument('add_experimental_option("excludeSwitches",["ignore-certificate-errors"])')
        chrome_options.add_argument('window-size=1200x600')
        capabilities = chrome_options.to_capabilities()         #cap
        capabilities['acceptInsecureCerts'] = True              #cap
        context.driver = webdriver.Chrome(executable_path="/usr/bin/chromedriver", chrome_options=chrome_options)

0
投票

从 Chrome v107 开始更新

Chrome 不使用系统信任存储;它使用 Chrome 根存储,它从 NSS 数据库读取

运行以下命令不再足以让 Chrome/Selenium 信任 CRT 文件。

ADD your_ca_root.crt /usr/local/share/ca-certificates/foo.crt
RUN chmod 644 /usr/local/share/ca-certificates/foo.crt && update-ca-certificates

要让 crt 受到信任,您有两种选择。

  1. 使用 [chrome GUI] 2 并手动将 CRT 文件添加到 Chrome。
  2. 使用
    ~/.pki/nssdb
    以编程方式将其添加到位于
    certutil
    的 NNS 存储。

这是使用硒图像的示例,数据库已定位

/home/seluser/.pki/nssdb

(确保替换占位符名称)

FROM  selenium/standalone-chrome:latest

# install ca-certificates and libnss3-tools for certutils
RUN sudo apt-get update && sudo apt-get install -y ca-certificates libnss3-tools

# add your certificate to the system trust store 
ADD your_ca_root.crt /usr/local/share/ca-certificates/foo.crt
RUN sudo chmod 644 /usr/local/share/ca-certificates/foo.crt && sudo update-ca-certificates

# (OPTIONAL) initialize the NSS database if it doesn't exist
# RUN mkdir -p /home/seluser/.pki/nssdb

# (OPTIONAL) initialize NSS database if it doesnt exist
# RUN certutil -N --empty-password -d sql:/home/seluser/.pki/nssdb

# add your CA certificate to the NSS database
RUN certutil -d sql:/home/seluser/.pki/nssdb -A -t "C,," -n $CHANGE_FOO_CERT_NAME -i /usr/local/share/ca-certificates/foo.crt

硒文档

https://github.com/SeleniumHQ/docker-selenium/blob/trunk/README.md#install-certificates-for-chromium-based-browsers

© www.soinside.com 2019 - 2024. All rights reserved.