java - 如何使用 Jsoup 通过 HTTPS 连接?

标签 java android https web-scraping jsoup

它在 HTTP 上运行良好,但是当我尝试使用 HTTPS 源时,它会引发以下异常:

10-12 13:22:11.169: WARN/System.err(332): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
10-12 13:22:11.179: WARN/System.err(332):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:477)
10-12 13:22:11.179: WARN/System.err(332):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:328)
10-12 13:22:11.179: WARN/System.err(332):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.setupSecureSocket(HttpConnection.java:185)
10-12 13:22:11.179: WARN/System.err(332):     at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:433)
10-12 13:22:11.189: WARN/System.err(332):     at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl$HttpsEngine.makeConnection(HttpsURLConnectionImpl.java:378)
10-12 13:22:11.189: WARN/System.err(332):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205)
10-12 13:22:11.189: WARN/System.err(332):     at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:152)
10-12 13:22:11.189: WARN/System.err(332):     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:377)
10-12 13:22:11.189: WARN/System.err(332):     at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:364)
10-12 13:22:11.189: WARN/System.err(332):     at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:143)

以下是相关代码:

try {
    doc = Jsoup.connect("https url here").get();
} catch (IOException e) {
    Log.e("sys","coudnt get the html");
    e.printStackTrace();
}

最佳答案

如果您想以正确的方式进行操作,并且/或者您只需要处理一个站点,那么您基本上需要获取相关网站的 SSL 证书并将其导入您的 Java keystore 。这将生成一个 JKS 文件,然后您在使用 Jsoup(或 java.net.URLConnection)之前将其设置为 SSL 信任库。

您可以从网络浏览器的商店中获取证书。假设您使用的是 Firefox。

  1. 使用 Firefox 访问相关网站,在您的情况下为 https://web2.uconn.edu/driver/old/timepoints.php?stopid=10
  2. 在地址栏左侧,您会看到蓝色的“uconn.edu”(这表示有效的 SSL 证书)
  3. 点击查看详情,然后点击更多信息按钮。
  4. 在出现的安全对话框中,单击查看证书按钮。
  5. 在出现的证书面板中,转到详细信息选项卡。
  6. 单击证书层次结构的最深项,在本例中为“web2.uconn.edu”,最后单击导出按钮。

现在你有了一个 web2.uconn.edu.crt 文件。

接下来,打开命令提示符并使用 keytool 命令(它是 JRE 的一部分)将其导入 Java keystore :

keytool -import -v -file /path/to/web2.uconn.edu.crt -keystore /path/to/web2.uconn.edu.jks -storepass drowssap

-file 必须指向您刚刚下载的 .crt 文件的位置。 -keystore 必须指向生成的 .jks 文件的位置(您又希望将其设置为 SSL 信任库)。 -storepass 是必需的,您可以输入任何您想要的密码,只要它至少为 6 个字符。

现在,您有了一个 web2.uconn.edu.jks 文件。您最终可以在连接之前将其设置为 SSL 信任库,如下所示:

System.setProperty("javax.net.ssl.trustStore", "/path/to/web2.uconn.edu.jks");
Document document = Jsoup.connect("https://web2.uconn.edu/driver/old/timepoints.php?stopid=10").get();
// ...

作为一个完全不同的选择,特别是当您需要处理多个站点时(即您正在创建一个万维网爬虫),那么您还可以指示 Jsoup(基本上,java.net.URLConnection) 以盲目信任所有 SSL 证书。另请参阅此答案最底部的“处理不受信任或配置错误的 HTTPS 站点”部分:Using java.net.URLConnection to fire and handle HTTP requests

关于java - 如何使用 Jsoup 通过 HTTPS 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7744075/

相关文章:

android - 微调器未显示正确数据

Spring RestTemplate SSL

java - JAXB 将 xml 列表元素解码为单个 Kotlin 对象

java - 保存按钮状态(启用和禁用)

android - 如何使用volley从android上传用户指定数量的图像或文档?

android - 如何与Unity一起存储简单的数据?

.htaccess - 通过 http 更改为 https - safari 显示我们的网站感觉不对

java - 使用自签名证书 : hostName not verified 的 Android Https 连接

java - 静态 block 中不允许使用公共(public)修饰符?

Java plist解析: how to determine if an NSObject is an array or a dictionary