【问题标题】:How to stop Chrome's Select a certificate window?如何停止 Chrome 的选择证书窗口?
【发布时间】:2017-03-31 22:18:31
【问题描述】:

我正在开发一个 Selenium 项目,我需要测试的系统正在使用 SSL 证书。每次我尝试登录时,我们都会得到这个“选择证书”窗口,我们无法使用 WebDriver 处理。

我已尝试使用 AutoItx 单击“确定”按钮,如下所示。但是Send("{ENTER}") 并不是最好的选择。

if (AutoItX.WinWaitActive("data:, - Google Chrome", "", 10) == 0)
{
   AutoItX.WinActivate("data:, - Google Chrome");
   AutoItX.Send("{ENTER}");
}

有没有办法使用 AutoItX 点击 OK 按钮?或者有没有办法在使用 Capabilities 定义 ChromeDriver 时加载这个证书?

【问题讨论】:

    标签: google-chrome ssl selenium-webdriver automation autoit-c#-wrapper


    【解决方案1】:

    Chrome 版本 59.0.3071.86(64 位),Win 7 企业版:

    创建注册表项:

    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls  
    

    在这里创建名称为 1 的新字符串值 (REG_SZ)

    作为数值数据输入:

    {"pattern":"[*.]","filter":{}}
    

    This is how the registry then looks like.

    有关我找到的此密钥的更多信息:

    该值必须是字符串化 JSON 字典的数组。每个字典的格式必须为 { "pattern": "$URL_PATTERN", "filter" : $FILTER },其中 $URL_PATTERN 是内容设置模式。 $FILTER 限制浏览器将从哪些客户端证书中自动选择。独立于过滤器,只会选择与服务器的证书请求匹配的证书。如果 $FILTER 的格式为 { "ISSUER": { "CN": "$ISSUER_CN" } },则仅选择由具有 CommonName $ISSUER_CN 的证书颁发的客户端证书。如果 $FILTER 是空字典 {},则客户端证书的选择不受额外限制。

    Automatically select client certificates for these sites

    Chrome 版本 87.0.4280.141(64 位),Win 10 企业版:

    创建注册表项:

    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls  
    

    在这里创建名称为 1 的新字符串值 (REG_SZ)

    作为数值数据输入:

    {"pattern":"[*.]mycompany.com","filter":{"ISSUER":{"CN":"MyCompanyCA"}}}
    

    MyCompanyCA 和子域 mycompany.com 必须替换为您对应的 url 和发行公司。

    【讨论】:

    • 这适用于 windows 7 机器,但在 windows 10 上则不行。有没有办法让它在 Windows 10 电脑上运行? (铬 v59)
    • $URL_PATTERN 的格式是什么?它是正则表达式模式还是使用 * 作为通配符或只是没有特殊模式匹配功能的纯字符串?
    • REG_SZ 值将如下所示:{"pattern":"[*.]mycompany.com","filter":{"ISSUER":{"CN":"MyCompanyCA"}}} 这意味着当您访问任何 mycompany.com 子域时,它将自动使用带有 CN(常见MyCompanyCA 的名称)
    • 这个方案如何在linux上应用?
    【解决方案2】:

    如果您有多个证书并且要选择的不是第一个,那么您需要应用过滤器。

    http://www.chromium.org/administrators/policy-list-3#AutoSelectCertificateForUrls 对过滤器值有深入的描述,但您可能对它们中的大多数不感兴趣,可以使用:

    {"pattern":"[*.]","filter":{"ISSUER":{"CN":"[Issued By]"}}}
    

    [颁发者] 替换为您的客户端证书的颁发者。我一辈子都无法让 URL 模式使用比 [*.] 更具体的东西,它匹配任何 URL。

    【讨论】: