Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使SeleniumWebDriver动态选择客户端证书,而无需直观地检测弹出窗口_Java_Internet Explorer_Selection_Client Certificates_Selenium Iedriver - Fatal编程技术网

Java 如何使SeleniumWebDriver动态选择客户端证书,而无需直观地检测弹出窗口

Java 如何使SeleniumWebDriver动态选择客户端证书,而无需直观地检测弹出窗口,java,internet-explorer,selection,client-certificates,selenium-iedriver,Java,Internet Explorer,Selection,Client Certificates,Selenium Iedriver,我正在尝试使用Java和Selenium来测试一个需要客户端证书的网站。 当我浏览到我的网站时,我会看到一个类似下面的弹出窗口,用于选择正确的证书 我的要求如下: 按名称选择证书 在不同版本的Windows/IE/Edge上 理想情况下,不会显示弹出窗口;i、 例如,解决方案将涉及调用一些API或设置一些配置来锁定要使用的正确证书 我自己的解决方案想法: 我尝试了一个解决方案,该方案基于使用(确实有效)直观地检测正确的证书,但我想知道是否有更好的解决方案不依赖于直观地检测弹出窗口。如果

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

我的要求如下:

  • 按名称选择证书
  • 在不同版本的Windows/IE/Edge上
理想情况下,不会显示弹出窗口;i、 例如,解决方案将涉及调用一些API或设置一些配置来锁定要使用的正确证书


我自己的解决方案想法:
  • 我尝试了一个解决方案,该方案基于使用(确实有效)直观地检测正确的证书,但我想知道是否有更好的解决方案不依赖于直观地检测弹出窗口。如果Microsoft决定更改此弹出窗口的外观,则在多个版本的Windows中发生故障的可能性较小,并且是未来的证明

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

    • 备份整个商店
    • 删除IE可以使用的所有客户端证书(我需要的证书除外)
    • 进行不再需要任何证书选择的登录
    • 恢复备份的存储
    有人知道怎么做吗(在Java中,可能调用CLI命令)

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

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


    • 我不能肯定,但如果硒不可能做到这一点,我也不会感到惊讶

      这个问题并没有让我充满希望:

      你越是远离网页,转向本机浏览器,然后转向操作系统控件,Selenium就变得越无能

      正如链接问题的唯一答案所述:您可以禁用浏览器中的弹出窗口,这可能是可行的解决方案,也可能不是可行的解决方案

      如果您不想走这条路,人们通常会求助于Java机器人来处理selenium驱动程序无法完成的事情,例如与打印对话框和其他此类控件交互

      见mouseMove,mousePress,mouseerelease 您可以调用其中的每一个,为mouseMove提供按钮位置。

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

      您可以在测试运行的同一JVM中设置一个内存中人中间代理服务器,甚至在不同端口上设置多个实例,每个实例分配给不同的客户端证书。然后,在创建WebDriver实例时,请使用适合您的浏览器的。注意,浏览器将显示安装在代理本身而不是目标服务器上的服务器证书,因此可能存在一些无效的证书错误,应在WebDriver设置中禁止这些错误。或者-代理可以简单地使用有效的服务器证书,如果您可以使用它的密钥,在这种情况下,连接对于测试脚本是完全透明的

      提供Java所需功能的一个简单代理服务器是。也许类似的东西提供了一个更完整的解决方案,具有现成的API

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

      第一步:
      扩展
      org.littleshoot.proxy.MitmManager
      类,使用客户端证书(例如p12文件或PEM文件)将其插入到代码中。工作示例可在网站上公开获取

      第二步:
      使用您选择的客户端证书和服务器证书启动代理服务器:

      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并发实例的每个客户端证书创建另一个代理

      第三步:
      使用代理启动WebDriver。主要浏览器(如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);
      
      org.openqa.selenium.Proxy Proxy=newproxy();
      proxy.setSslProxy(“127.0.0.1:5555”);
      proxy.setNoProxy(“”;//覆盖本地主机的默认无代理127.0.0.1
      FirefoxOptions=新的FirefoxOptions();
      选项。设置代理(代理);
      WebDriver=newfirefoxdriver(选项);
      
      第四步:
      在运行测试时,浏览器不会因为任何证书提示而打扰您。利润


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

      您是否查看过:
      SSLContexts.custom().loadTrustMaterial(新文件(路径)、密码、新TrustSelSignedStrategy()).build()?这将返回一个SSLContext。如果这是一个好方法,我可以在这方面帮助您,我使用Selenium开发了一个SSL自签名证书。请参阅:(示例2)@Bob如何向Selenium注册此SSLContext?这个解决方案会让Internet Explorer在不询问弹出窗口的情况下使用文件中的客户端证书吗?我很担心。机器人解决方案类似于我的SikuliX解决方案,是我想要避免的事情。我希望java能够以一种干净的方式操作证书存储,从而能够恢复初始状态,或者理想情况下可以使用一些IE配置自动获取所需的证书。