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

Posted

技术标签:

【中文标题】在给定的 java 代码中禁用 SSL 连接【英文标题】:Disable SSL connection in the given java code 【发布时间】:2014-12-16 06:01:09 【问题描述】:

我在下面的代码中遇到安全证书错误 (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();
    
  

【问题讨论】:

我放弃了尝试建立安全连接。 root cert 、 keytool 等让我发疯。没有任何效果,我放弃了。幸运的是,我只需要制作一个肮脏的临时脚本,而无需制作任何东西。所以,这对我来说不是问题。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

看看如何(其中之一):

    生成正确信任的 SSL 证书(在您从应用程序访问的服务器上)。 或 生成自签名 SSL 证书,并将此证书添加到应用程序或应用程序主机中的受信任证书中。 或 忽略/绕过 SSL 验证(使用 SSLSocketFactories)。

请记住,除非在适当受信任的环境(客户端和服务器)中完成,否则第 2 步可能存在潜在的安全风险,而第 3 步完全消除了 SSL 提供的安全功能。在做出选择之前,请确保您知道最终要实现的目标。

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

【讨论】:

请给我一些代码。我已经在我的回答中解决了我的问题,但我真的不明白我在做什么。

以上是关于在给定的 java 代码中禁用 SSL 连接的主要内容,如果未能解决你的问题,请参考以下文章

java连接https时禁用证书验证.

尽管禁用了“强制安全结帐”,但 woocommerce 中的 SSL 连接错误

MySQL启用SSL连接

在 HttpsURLConnection 中禁用 SSL 作为协议

MySQL建立SSL连接问题,设置useSSL=false显式禁用SSL,或者设置useSSL=true

SAP ABAP 如何启用SSL HTTPS连接