Chlenmedriver in Selenium和SSL证书

时间:2011-07-21 09:51:22

标签: google-chrome selenium ssl-certificate

我正在使用Selenium来测试一个拥有HTTP Auth,现在甚至是SSL证书的网站。

作为HTTP Basic Authentification的解决方法,我使用ChromeDriver - http://code.google.com/p/selenium/wiki/ChromeDriver并打开格式的网址

https://username:password@my-test-site.com

但是现在出于安全原因,需要在PC上安装客户端证书才能登录该应用程序。

然而,ChromeDriver无法看到“选择证书”提示,我甚至无法将其切换为警报。

有人解决了这个问题吗?

4 个答案:

答案 0 :(得分:6)

您可以通过添加包含以下内容的注册表项,告知Chrome浏览器使用特定客户端证书作为特定网址:

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls\1 = "{\"pattern\":\"https://www.example.com\",\"filter\":{\"ISSUER\":{\"CN\":\"cn of issuer\"}}}"

您可以通过在同一分支下添加其他密钥来添加其他条目。

在Linux上有点复杂,因为您需要在以下位置修改json格式的首选项:

~/.config/chromium/Default/Preferences

看起来上述选项仅适用于加入Active Directory域的计算机。如果上述步骤不起作用您可以尝试使用预配置的模板从以下网址引入可供下载的更改:https://www.chromium.org/administrators/policy-templates

答案 1 :(得分:5)

您可以告诉Chrome使用--ignore-certificate-errors命令行开关忽略不受信任的证书错误,而不是安装客户端证书。

为此,请按以下方式创建ChromeDriver的实例:

DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors"));
driver = new ChromeDriver(capabilities);

答案 2 :(得分:1)

我用下面的代码解决了这个问题

DesiredCapabilities cap = DesiredCapabilities.chrome();
ImmutableMap<String, String> commandLineArguments = ImmutableMap.<String, 
String>builder()
    .put("web-security", "false")
    .put("ssl-protocol", "any")
    .put("ignore-ssl-errors", "true")
    .put("webdriver-loglevel", "DEBUG")
    .put("ssl-client-certificate-file", certificatePath)
    .put("ssl-client-key-passphrase", certificatePassword)
    .build();
String[] params = commandLineArguments.entrySet().stream()
    .map(e -> String.format("--%s=%s", e.getKey(), e.getValue()))
    .collect(Collectors.toList())
    .toArray(new String[0]);
cap.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, params);
cap.setCapability(ChromeOptions.CAPABILITY, options);
WebDriver driver = new PhantomJSDriver(cap);
driver.get(Url);

但我必须使用以下命令将我的pfx证书转换为pem

openssl pkcs12 -in client_ssl_cert.pfx -out client_ssl_cert.pem -clcerts

答案 3 :(得分:0)

要基于Manvi的答案,我无法使用PEM证书或PFX证书来使它正常工作,因此我不得不使用 openssl

提取证书

openssl pkcs12 -clcerts -nokeys -in "SourceFile.PFX" -out certificate.crt -password pass:"MyPassword" -passin pass:"MyPassword"

提取密钥

openssl pkcs12 -nocerts -in "SourceFile.PFX" -out private.key -password pass:"MyPassword" -passin pass:"MyPassword" -passout pass:TemporaryPassword

代码

File path=new File(phantomJSBinaryFile);
System.setProperty("phantomjs.binary.path",path.getAbsolutePath());

ChromeOptions cap =new ChromeOptions();
ImmutableMap<String, String> commandLineArguments = ImmutableMap.<String, 
String>builder()
    .put("web-security", "false")
    .put("ssl-protocol", "any")
    .put("ignore-ssl-errors", "true")
    .put("webdriver-loglevel", "INFO")
    .put("ssl-client-certificate-file", certificatePath) //certificate.cer
    .put("ssl-client-key-file", keyPath) //private.key
    .put("ssl-client-key-passphrase", pwd)
    .build();

String[] params = commandLineArguments.entrySet().stream()
    .map(e -> String.format("--%s=%s", e.getKey(), e.getValue()))
    .collect(Collectors.toList())
    .toArray(new String[0]);

cap.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, params);
//cap.setCapability(ChromeOptions.CAPABILITY, options);

WebDriver driver = new PhantomJSDriver(cap);
driver.get(url);
System.out.println(driver.getTitle());