2

HtmlUnit (Java ライブラリ) を使用して Web サイトにログインしようとしていますが、無視できると思われる例外が発生します。例外は「javax.net.ssl.SSLPeerUnverifiedException: ピアが認証されていません」です。これを「www.thesite.com」をサポートする証明書に絞り込みましたが、「somedomain.thesite.com」を使用しています。私が信じているエラーは、証明書が一部の JavaScript 関数で使用する他のサブドメインに名前を付けていないことが原因です。手動で Firefox を使用している場合、これらの例外が表示されず、何か他のことが起こっていると思われるのは非常に奇妙です。

以下は私が使用しているコードです:

// <editor-fold desc="User Credentials and site.">
String user = "auser";
String password = "apassword";

String mainUrl = "https://www.awebsite.com/";

// Setup Ajax & Cookies
AjaxController ajaxController = new AjaxController();
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiesEnabled(true);

// Setup WebClient
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
webClient.setAppletEnabled(true);
webClient.setCssEnabled(true);
webClient.setJavaScriptEnabled(true);
webClient.setAjaxController(ajaxController);
webClient.setThrowExceptionOnScriptError(false);
webClient.setThrowExceptionOnFailingStatusCode(false);
webClient.setCookieManager(cookieManager);

/*
 * Provider p = new sun.security.pkcs11.SunPKCS11();
 * Security.addProvider(p);
 */

//webClient.set
HtmlPage page = null;

try {
    webClient.setUseInsecureSSL(true);
    page = webClient.getPage(mainUrl);

    // fill in form
    HtmlForm htmlForm = page.getFormByName("thisForm");
    HtmlInput userField = htmlForm.getInputByName("Username");
    HtmlInput passwordField = htmlForm.getInputByName("Password");

    // Enter login and password
    userField.setValueAttribute(user);
    passwordField.setValueAttribute(password);

    //HtmlPage mainMenuPage = htmlForm.click();
    HtmlElement element = htmlForm.getInputByValue("Login");

    page = element.click();
    webClient.waitForBackgroundJavaScript(5000); // pause if

    System.err.println(page.asText());
    System.err.println(page.asXml());

} catch (Exception ex) {
    ex.printStackTrace();
}

webClient.closeAllWindows();

}

ご覧のとおり、「webClient.setUseInsecureSSL(true);」を有効にしました。HtmlUnit ライブラリにあります。私はこれがそれを行うべきだと思います。しかし、この時点で私は立ち往生しています。

これが私が得ている例外エラーです:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:352)
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776)
    at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:152)
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1439)
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1358)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:307)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373)
    at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358)
    at com.mycompany.extract.Program.main(Program.java:62)

アイデアや提案はありますか?このエラーの後、プログラムは単に続行しません。証明書が悪いかどうかは気にしません (別のサブドメインを使用するだけで有効な証明書です)。証明書は私の制御範囲外です。

4

1 に答える 1

0

問題は、そのサブドメインの有効な証明書が必要なことです。入手して、使用している Java のバージョンの jssecacerts に追加してください。

これは、InstallCert.java を使用して行いました。http://miteff.com/install-certおよびおそらくここ: http://pinchii.com/home/tag/jssecacerts/に役立つドキュメントがいくつかあります。

「InstallCert.java」を Google で簡単に検索すると、多くの結果が得られます。

幸運を!

于 2013-01-17T23:58:49.720 に答える