我们使用的解决方案非常干净,简单且可在浏览器和操作系统之间移植 - 使用代理服务器为您处理SSL握手。
您可以在测试运行的同一 JVM 中设置内存中人代理服务器,甚至可以在不同的端口上设置多个实例,每个实例分配给不同的客户端证书。然后,在创建 WebDriver 实例时,请使用适合您的浏览器的 setProxy 方法。请注意,浏览器将显示安装在代理本身(而不是目标服务器上)上的服务器证书,因此可能存在一些应在 WebDriver 设置中禁止显示的无效证书错误。或者 - 代理可以简单地使用有效的服务器证书,如果其密钥可供您使用,在这种情况下,连接对于测试脚本是完全透明的。
一个简单的代理服务器提供了Java中所需的功能,那就是LittleProxy。也许像BrowserMob这样的东西提供了一个更完整的解决方案,具有现成的API。
使用LittleProxy的示例只需要几行(几十行)样板:
步骤1:
使用客户端证书(例如p12文件或PEM文件)使用可以插入代码的内容来扩展类。在此存储库中公开提供的工作示例。org.littleshoot.proxy.MitmManager
步骤 2:
使用您选择的客户端证书和服务器证书启动代理服务器:
org.littleshoot.proxy.impl.DefaultHttpProxyServer.DefaultHttpProxyServer.bootstrap()
.withIdleConnectionTimeout(FIVE_MINUTES)
.withName(clientCertFile.getName())
.withPort(port)
.withAllowLocalOnly(localConnectionOnly)
.withManInTheMiddle(new MutualAuthenticationCapableMitmManager(
usingPKCS12File(clientCertFile, clientCertPassword),
usingPemKeyPair(serverKeyPair[0], serverKeyPair[1])))
.start();
为需要重用相同端口或通过 startnig 并发实例为每个客户端证书创建另一个代理。
步骤3:
使用代理启动WebDriver。主流浏览器(IE、Firefox、Chrome)也以类似的方式支持该设置:
org.openqa.selenium.Proxy proxy = new Proxy();
proxy.setSslProxy("127.0.0.1:5555");
proxy.setNoProxy("<-loopback>"); // overwrite the default no-proxy for localhost, 127.0.0.1
FirefoxOptions options = new FirefoxOptions();
options.setProxy(proxy);
WebDriver driver = new FirefoxDriver(options);
步骤4:
运行测试时,浏览器永远不会因任何证书提示而打扰您。利润。
如果使用这种技术,请格外小心,以确保机密的安全,特别是代理服务器本身对第三方无法访问。在安全的企业网络之外公开密钥从来都不是一个好主意,无论它们是真的(!!!)还是假的。