【问题标题】:Authenticating Selenium WebDriver (Java) with .p12 certificate使用 .p12 证书对 Selenium WebDriver (Java) 进行身份验证
【发布时间】:2018-02-28 20:03:56
【问题描述】:

我花了几天时间寻找解决方案。

我有一个项目,我正在尝试为其创建 Selenium WebDriver 测试套件。本网站旨在通过 2 因素身份验证进行保护。这两个因素将用于交付证书,该证书将通过服务器进行身份验证。

目前,我们已经有了它,以便我们使用以 "https://" 开头的 url 访问服务器。当我们转到 url(在 Firefox 中)时,我们会看到一个标记为“用户标识请求”的弹出窗口,其中包含一个带有“选择证书以作为标识显示:”标签的下拉菜单。

之前,我通过转到选项->隐私和安全->证书->查看证书,选择“您的证书”选项卡,单击“导入”,浏览到“client1.p12”文件并输入密码。通过这样做,我现在可以在“选择要出示的证书……”下拉菜单中看到相应的证书。

我的问题是如何设置 Selenium WebDriver 来选择证书。上面描述的弹出窗口是一个 Windows 组件(不是 html),所以我不能简单地单击并选择证书。我也在尝试为 geckodriver 使用 headless 选项。

我能找到的最佳解决方案如下:

DesiredCapabilities capabilities = new DesiredCapabilities();

capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);

capabilities.setCapability("ssl-client-certificate-file", "<path-to-client1.p12>");
capabilities.setCapability("ssl-client-key-passphrase", "<password>");
WebDriver driver = new FirefoxDriver(capabilities);
driver.get(<url>);

不幸的是,我在最后一行“driver.get();”得到了一个“org.openqa.selenium.WebDriverException”

【问题讨论】:

    标签: authentication firefox selenium-webdriver ssl-certificate


    【解决方案1】:

    我已经找到了部分解决方案。在其他情况下,这可能是我所需要的,但由于我将在最后描述的原因,这里还不够。

    这个问题有两个方面。首先,我需要设置 Selenium 来接受服务器的证书。其次,我需要让 Selenium 将 .p12 证书传送到服务器。

    为了接受服务器的证书,我做了如下的事情:

    DesiredCapabilities capabilities = DesiredCapabilities.firefox();
    capabilities.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS, true);
    . . . 
    FirefoxOptions firefoxOptions = new FirefoxOptions();
    . . . 
    firefoxOptions.addCapabilities(capabilities);
    . . .
    driver = new FirefoxDriver(firefoxOptions);
    . . . 
    driver.get(nbisURL);
    

    为了将 .p12 证书发送到服务器,我使用了 firefox 配置文件。这里描述了部分过程:https://seleniumbycharan.wordpress.com/2015/07/12/how-to-create-custom-firefox-profile-in-selenium-webdriver/

    基本上,我创建了一个配置文件(“eAgency-Client1”),如文章中所述,这导致了一个打开的 Firefox 浏览器。在那个浏览器中,我按照我在原始帖子中描述的方式设置了证书。然后我设置 selenium 以使用该配置文件:

    ProfilesIni profile = new ProfilesIni();
    FirefoxProfile ffProfile = profile.getProfile("eAgency-Client1");
    ffProfile.setPreference("security.default_personal_cert", "Select Automatically");
    . . . 
    FirefoxOptions firefoxOptions = new FirefoxOptions();
    . . . 
    firefoxOptions.setProfile(ffProfile);
    . . .
    driver = new FirefoxDriver(firefoxOptions);
    

    因此,将上述两个 sn-ps 交错得到我的解决方案。

    我现在遇到的问题是我似乎无法在其他机器上使用该配置文件,因此这个 Selenium 测试套件不可移植。

    我在 Jenkins 中运行测试套件。 Jenkins 在没有 GUI 的 CentOS 服务器上运行。我将“eAgency-Client1”配置文件从本地 Windows 机器复制到 CentOS 服务器的适当位置,并适当地修改了 CentOS 上的profiles.ini 文件。

    (我大致遵循http://forum.notebookreview.com/threads/migrate-firefox-profile-from-windows-to-linux.444601/ 此处给出的建议。但是,我需要将配置文件添加到 Jenkins firefox 实例,方法是将其复制到 /var/lib/jenkins/.mozilla/firefox .我也没有复制整个Mozilla目录。只是配置文件,之后我修改了profiles.ini文件。)

    我知道配置文件已成功复制,因为 . . .

    FirefoxProfile ffProfile = profile.getProfile("eAgency-Client1");
    

    。 . .不返回空值。当我访问该站点时,麻烦就来了。当我去该站点并获取页面源时,我可以看到表明我没有发送证书的标准错误:

    <html><head><title>400 No required SSL certificate was sent</title></head>
    <body bgcolor="white">
    <center><h1>400 Bad Request</h1></center>
    <center>No required SSL certificate was sent</center>
    <hr><center>nginx/1.10.2</center>
    
    
    </body></html>
    

    我没有在我的本地机器上获得这个源。我的本地机器可以顺利到达它需要去的地方。在本地,我没有收到“400 Bad Request”。

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 2022-08-19
      • 2013-08-15
      相关资源
      最近更新 更多