Java开发
Jsoup的使用教程(6)-HTTPS请求认证
2025-01-22 30 0
简介 Jsoup的使用教程(6)-HTTPS请求认证
以 https://为前缀的 URL 使用的是 HTTPS 协议。HTTPS 在 HTTP 的基础上加入了 SSL(安全套接层)。SSL 的作用是保障网络通信的安全性,其广泛应用于客户端与服 务器之间的身份认证和加密数据传输。
SSL 支持双向认证(服务器认证与客户端认证),将服务器证书下载到客户端, 再将客户端的证书返回到服务器。目前,访问网站并不常用客户端证书,大部分用户 都没有自己的客户端证书,但 HTTPS 总要求使用客户端证书。其中,使用最多的客 户端证书是 X.509 证书。
查看 Jsoup 源码,发现在 org.jsoup.helper.HttpConnection 类中提供实现信任管理器的 initUnSecureTSL()方法。使用这种方法,可以成功请求以 https:// 为前缀的 URL。
但仔细阅读 org.jsoup.helper.HttpConnection 类中的 createConnection()方法对应的 源码时,发现 initUnSecureTSL()方法的调用是需要一定条件的,只有在 req.validateTLSCertificates()执行的结果为 false 的情况下,才 会执行 initUnSecureTSL()方法。而 validateTLSCertificates()方法实际返回的是静态类 Request 中的 validateTSLCertificates 成员变量(默认情况下为 true)。
因此,需要将 validateTSLCertificates 的值设置为 false 才能调用 initUnSecureTSL() 方法。在 org.jsoup.helper.HttpConnection 类中提供了设置 validateTSLCertificates 值的 方法:
public Connection validateTLSCertificates(boolean value) {
req.validateTLSCertificates(value);
return this;
}
Connection connect = Jsoup.connect("https://cn.*******.com")
.validateTLSCertificates(false);
Document document = connect.get();
System.out.println(document);
另外,也可以在 Jsoup 创建 Connection 连接之前,调用自己编写的创建信任管理 器(不验证证书)的方法,也可以成功地请求以 https:// 为前缀的 URL
public class JsoupConnectSSLInit {
public static void main(String[] args) throws IOException {
initUnSecureTSL();
String url = "https://cn.*******.com";
//创建连接
Connection connect = Jsoup.connect(url); //请求网页
Document document = connect.get(); //输出HTML System.out.println(document.html());
}
private static void initUnSecureTSL() {
// 创建信任管理器(不验证证书)
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
//检查客户端证书
public void checkClientTrusted(final X509Certificate[] chain, final String authType) {
//do nothing 接受任意客户端证书
}
//检查服务器端证书
public void checkServerTrusted(final X509Certificate[] chain, final String authType) {
//do nothing 接受任意服务端证书
}
//返回受信任的X509证书
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
try {
// 创建SSLContext对象,并使用指定的信任管理器初始化
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
//基于信任管理器,创建套接字工厂
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
//为HttpsURLConnection配置套接字工厂
HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
} catch (Exception e) {
e.printStackTrace();
}
}
}