首页 文章

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

提问于
浏览
0

我在下面的代码中收到安全证书错误(source) . 例外是:

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径引起: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();
    }
  }
}

2 回答

  • 0

    看看如何(其中一个):

    • 生成正确受信任的SSL证书(在您从应用程序访问的服务器上) . 要么

    • 生成自签名SSL证书,并将此证书添加到应用程序或应用程序主机中的受信任证书 . 要么

    • 忽略/绕过SSL验证(围绕SSLSocketFactories) .

    请记住,除非在适当的可信环境(客户端和服务器)中完成,否则步骤2可能是潜在的安全风险,并且步骤3完全取消了SSL提供的安全功能 . 在选择之前,请确保您知道最终想要达到的目标 .

    此外,由于最近发现的POODLE漏洞,请避免使用SSL3 .

  • 0

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

    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
    

    然后,根据您使用的WebClient类的版本,尝试以下代码行之一:

    wclient.setUseInsecureSSL(true);
    wclient.getOptions().setUseInsecureSSL(true);
    

    Note - Disabling security is very dangerous. So don't do this in production code.

相关问题