如何使 Selenium WebDriver 动态选择客户端证书而不用视觉检测弹出窗口

2024-04-24

我正在尝试使用 Java 和 Selenium 来测试需要客户端证书的网站。 当我浏览我的网站时,我会看到一个如下所示的弹出窗口,以选择正确的证书。

我的要求如下:

  • 按名称选择证书
  • 在不同版本的 Windows / IE / Edge 上

理想情况下,永远不会显示弹出窗口;即,解决方案将涉及调用某些 API 或设置某些配置来固定要使用的正确证书。


我自己的解决思路:

  • 我尝试了一种基于视觉检测正确证书的解决方案SikuliX https://github.com/RaiMan/SikuliX-2014(确实有效)但我想知道是否有更好的解决方案不依赖于视觉检测弹出窗口。在多个版本的 Windows 中不太可能出现故障,并且如果 Microsoft 决定更改此弹出窗口的外观,这也是未来的证明。

  • 我的另一个想法(但我不知道如何/是否可能)是删除除一个证书之外的所有已安装的证书,以便永远不会显示弹出窗口:

    • 备份整个商店
    • 删除 IE 可以使用的所有客户端证书(我需要的除外)
    • 进行登录,不再需要任何证书选择
    • 恢复备份的存储

    有谁知道如何做到这一点(在Java中,可能调用CLI命令)?

  • 是否可以启动(使用 Selenium Java)一个只知道我需要的单个证书的 Internet Explorer 窗口?

  • 是否可以在 Internet Explorer 中为给定域设置默认证书?


我们使用的解决方案非常干净、简单,并且可以在浏览器和操作系统之间移植 - 使用代理服务器来为您处理 SSL 握手。

您可以在运行测试的同一 JVM 中设置内存中的中间人代理服务器,甚至可以在不同端口上设置多个实例,每个实例分配给不同的客户端证书。然后,在创建 WebDriver 实例时,使用设置代理方法 https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/ie/InternetExplorerOptions.html#setProxy-org.openqa.selenium.Proxy-适合您的浏览器。请注意,浏览器将显示安装在代理本身而不是目标服务器上的服务器证书,因此可能存在一些应在 WebDriver 设置中抑制的无效证书错误。或者 - 如果您可以使用代理的密钥,则代理可以简单地使用有效的服务器证书,在这种情况下,连接对于测试脚本来说是完全透明的。

一种简单的代理服务器可以提供 Java 所需的功能:小代理 https://github.com/mrog/LittleProxy。也许像浏览器Mob https://github.com/lightbody/browsermob-proxy通过现成的 API 提供更完整的解决方案。

使用 LittleProxy 的示例只需要几行(十几行)样板文件:

Step 1:
Extend org.littleshoot.proxy.MitmManager您可以使用客户端证书(例如 p12 文件或 PEM 文件)将某些内容插入代码中。公开的工作示例位于这个仓库 https://github.com/JockX/MutualAuthenticationCapableMitmManager.

Step 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();

为您需要重用相同端口或通过启动并发实例的每个客户端证书创建另一个代理。

Step 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);

Step 4:
运行测试时,浏览器永远不会通过任何证书提示来打扰您。利润。

如果使用此技术,请格外小心以确保机密安全,尤其是第三方无法访问代理服务器本身。在安全的企业网络之外暴露密钥从来都不是一个好主意,无论它们是真实的(!!!)还是假的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 Selenium WebDriver 动态选择客户端证书而不用视觉检测弹出窗口 的相关文章

随机推荐

  • 是否可以在新的密钥库中安装现有的私钥和 ssl 证书?

    我们在服务器故障期间丢失了用于生成 CSR 的原始密钥库 我们有私钥 key 文件 和原始 CSR csr 文件 的备份 是否可以用这些重建密钥库 由于创建证书链的所有说明都需要原始密钥库 这适用于 Tomcat 7 0 27 Thanks
  • 切换分支时发生致命 Git 错误

    错误信息 致命 git checkout 更新路径与切换分支 强制不兼容 如何解决这个 Git 签出错误 通过明确指定 git checkout HEAD blah 而不是仅仅说 git checkout blah 假设您确实想查看文件 然
  • Android 创建 JSON 对象的 JSON 数组

    您好 有谁知道如何创建一个包含对象的数组 每个对象中都包含多个对象 我似乎无法理解它 结构应该是这样的 Array object subobject subobject object subobject subobject 这是我到目前为止
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • i18next 翻译问题

    我仍然尝试使用 i18next 来翻译我的 jQuery 应用程序 解决了一些一般问题后 此处解决 如何使用i18next 翻译问题 https stackoverflow com questions 13005791 how to use
  • 在后台从 url 加载一个大 plist

    我从 url 加载一个大的 plist 文件 我必须等待几秒钟才能使用该应用程序 有什么解决办法吗 如何在后台加载它 是GCD我需要的 如何实施 My code NSString urlStr NSString alloc initWith
  • 带猫头鹰旋转木马的 Fancybox (lazyLoad)

    我正在使用带有lazyLoad选项的Fancybox v3 5 4和Owl carousel v2 3 4 当我们点击照片时 Fancybox 就会弹出照片 然后 如果我们点击几次 下一步 以获取 Fancybox 上的下一张照片 然后关闭
  • Java:URLConnection合理的超时时间

    默认情况下 URLConnection 的超时时间为 0 无限制 XXXXX 的合理值是多少 URL url URLConnection uCon url openConnection uCon setConnectTimeout XXXX
  • 在 O(n) 时间和 O(1) 空间中生成数组的随机排列

    我们必须生成数组 1 2 3 n in O 1 space 我能够做到O n space I did O n 空间解决方案 首先存储数组 然后将其随机化 但是如何在不存储数组的情况下做到这一点O 1 space 我只是生成随机数 而不是存储
  • 随着新数据的出现,如何增量训练 FANN?

    我使用 FANN 库构建并训练了一个神经网络 这是初步培训 大部分数据将在线收集 当在线数据可用时我想要improve使用这些新数据的网络 不是重新训练 而是使之前的训练更加准确 如何用FANN来做这种增量训练呢 从更改为的文件进行训练 s
  • Flask - POST 错误 405 方法不允许

    我刚刚开始学习 Flask 我正在尝试创建一个表单 该表单将允许POST method 这是我的方法 app route template methods GET POST def template if request method PO
  • 这是一个可以将括号中的文本与嵌套括号匹配的正则表达式[重复]

    这个问题在这里已经有答案了 我需要一些帮助来编写一个正则表达式 该正则表达式将括号中的字符串与嵌套括号匹配并以模式开头 注意 父 括号中的文本可以没有嵌套括号 例子 Some text pattern SOME TEXT THAT I WA
  • 如何在python中更改ttk.progressBar颜色

    有谁知道如何更改 ttk progressBar 的颜色 它现在显示绿色 我希望它是蓝色的 import ttk self progressBar ttk Progressbar frame3 length 560 maximum 100
  • Bigquery - json_array 来自字段的额外多个元素

    我的表有一个 JSON 字段 如下所示 每个条目中可以有任意数量的评论 entry 1234 comment 6789 seconds 1614864327 nanoseconds 606000000 message hello world
  • Pandas 数据框获取每组的第一行

    我有一只熊猫DataFrame像下面这样 df pd DataFrame id 1 1 1 2 2 3 3 3 3 4 4 5 6 6 6 7 7 value first second second first second first t
  • 在 OS Hardened 机器中使用 c# 禁用任务管理器

    我使用下面的代码来禁用完美运行的信息亭应用程序的任务管理器 public void DisableTaskManager RegistryKey regkey string keyValueInt 1 string subKey Softw
  • 将数组 php 转换为 java

    我正在开发一个包含 java 文件和 php 文件的应用程序 java 文件调用 php 文件 这些文件在 ddbb 中执行查询并将结果作为数组 php 返回 但将其打印在屏幕上 我在java中把它当作一个字符串 我必须将它转换为数组或集合
  • 将字符串 ascii 转换为字符串 Hex

    假设我有这个字符串 string str 1234 我需要一个函数将该字符串转换为该字符串 0x31 0x32 0x33 0x34 我在网上搜索了很多类似的东西 但没有找到这个问题的答案 string str 1234 char charV
  • 共享图像的正确方法(使用意图)

    我在应用程序中创建图像 并希望共享这些社交网络 facebook 邮件应用程序 gmail 以及其他可以 接收 图像的应用程序 问题的根源 我认为 是我不想使用外部存储作为图像的基础 我想使用我的数据文件夹或缓存文件夹 因为它们都不需要任何
  • 如何使 Selenium WebDriver 动态选择客户端证书而不用视觉检测弹出窗口

    我正在尝试使用 Java 和 Selenium 来测试需要客户端证书的网站 当我浏览我的网站时 我会看到一个如下所示的弹出窗口 以选择正确的证书 我的要求如下 按名称选择证书 在不同版本的 Windows IE Edge 上 理想情况下 永