【发布时间】: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 等让我发疯。没有任何效果,我放弃了。幸运的是,我只需要制作一个肮脏的临时脚本,而无需制作任何东西。所以,这对我来说不是问题。