我正在使用 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 证书正确安装在“受信任的根证书颁发机构”中,以便在容器中的无头模式下也能正常工作。
从容器内部:
/usr/local/share/ca-certificates
目录。经过更多挖掘后,我发现证书被复制到容器内的以下目录(我必须进入容器中的 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)
从 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 受到信任,您有两种选择。
~/.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