当前位置: 首页 > 知识库问答 >
问题:

在给定的java代码中禁用SSL连接

翟奇
2023-03-14

我在下面的代码中得到安全证书错误(源代码)。例外情况是:

javax.net.ssl.sslHandShakeException:Sun.Security.Validator.ValidatorException:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径

如何禁用安全证书检查?

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;

public class WebRobot {
  public static void login(String username, String password) {
    String loginUrl = "http://example.com";
    int loginFormNum = 1;
    String usernameInputName = "nameinput";
    String passwordInputName = "passinput";
    String submitLoginButtonValue = "Sign In";

    // create the HTMLUnit WebClient instance
    WebClient wclient = new WebClient();

    // configure WebClient based on your desired
    wclient.getOptions().setPrintContentOnFailingStatusCode(false);
    wclient.getOptions().setCssEnabled(false);
    wclient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    wclient.getOptions().setThrowExceptionOnScriptError(false);

    try {
      // get the login page by connect to the URL 
      final HtmlPage loginPage = (HtmlPage)wclient.getPage(loginUrl);

      // get the login form by its form number. mine is 1 (form[1])
      final HtmlForm loginForm = loginPage.getForms().get(loginFormNum);

      // get the text input field by the name and set the value
      final HtmlTextInput txtUser = loginForm.getInputByName(usernameInputName);
      txtUser.setValueAttribute(username);

      // get the password input field by the name and set the value
      final HtmlPasswordInput txtpass = loginForm.getInputByName(passwordInputName);
      txtpass.setValueAttribute(password);

      // get the submit button by the text value
      final HtmlSubmitInput submitLogin = loginForm.getInputByValue(submitLoginButtonValue);

      // after we set the name & password then we click the submit button
      // it will return a page (redirect or message alert or somethin, different sites different behaviour)
      // or it could throws an exception
      final HtmlPage returnPage = submitLogin.click();  

      // we can analyze the return page based on the body
      // ex: mine is check if its body contains less than 5 elements
      final HtmlElement returnBody = returnPage.getBody(); 
      if (returnBody==null || returnBody.getChildElementCount()<5) {
        // bla.. bla.. bla..
      }

    } catch(FailingHttpStatusCodeException e) {
      e.printStackTrace();
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}

共有1个答案

湛安宁
2023-03-14

在执行此操作之前,必须添加以下代码:

System.setProperty("jsse.enableSNIExtension", "false");

行前:

// get the login page by connect to the URL
final HtmlPage loginPage = (HtmlPage) wclient.getPage(loginUrl);

如果不这样做,就会得到一个错误:

javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
wclient.setUseInsecureSSL(true);
wclient.getOptions().setUseInsecureSSL(true);

注-禁用安全性是非常危险的。所以不要在生产代码中这样做。

 类似资料:
  • 在JSP页面中使用EL表达式可以完成一些基本的功能,并且会使JSP页面变得更加整洁。但在某些时候,开发人员总爱在JSP页面中编写一些Java代码。虽然Java代码功能强大,但在JSP页面中加入大量的Java代码会使用页面更加混乱。因此,良好的编程习惯是在JSP页面中只使用EL表达式或标签。为了更有效地规范这个习惯,在web.xml中提供了一个<scripting-invalid>元素可以关闭JSP

  • 为了节省电池,我想在给定时间(比如晚上11点)关闭所有连接(蓝牙、wifi、移动网络)和其他耗电功能。 最好的方法是什么?我考虑的是在引导后启动的服务,因此我不必手动重新启动该服务。一开始,我甚至不需要一个UI应用程序——我可以硬编码关闭的时间。也许以后可以通过GUI更改时间会更好,但这并不是真的必要。 因此,服务需要做一些事情的唯一时间是在我想要的时间,但是为了检测它需要在后台连续运行的时间而不

  • 我尝试使用REST-assured来执行一些需要SSL身份验证的API调用。我收到: . p12文件 密码 .cert.pem文件 .key.pem文件 当我把这一切放在例如。邮递员,它只是工作。现在我想在我的Java代码中使用这个...这就是我被困的地方。我看到人们使用单独的工具来导入密钥等,但我想在代码中做任何事情:) 我发现有人在使用: 其中KEY_STORE_*是P12文件密码(?),信任

  • 问题内容: 我正在尝试使用pyserial将数据发送到arduino。但是,当我打开COM端口时,它会将DTR设置为低电平并重置板。但是,我已经设置了arduino代码,因此必须按住两个按钮1秒钟,使其进入串行接收模式。如果可能的话,我宁愿不必在arduino引导时进行串行输入。 显然,您可以修改serialWin32.py文件,更改以下内容: 至: 但是,有什么方法可以直接在我的python脚本

  • 我已经搜索了,但没有找到任何关于如何在Visual Studio代码中禁用引用(或完全禁用codelens)的信息,它们对我来说非常无用和烦人。

  • 我正在研究MQTT协议。我配置了它的服务器,并使用端口1883上的Mosquito库用java进行了通信。现在,我想让这种通信更加安全。据我所知,8883端口是为其基于tls的安全通信保留的。它需要X.509证书。为此,我找到了以下教程。 http://www.embedded101.com/Blogs/PaoloPatierno/entryid/366/mqtt-over-ssl-tls-wit