版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/phone13144830339/article/details/80332851
import java.io.IOException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
/**
* @author LuCheng
* @date 2018年5月15日 上午10:53:25
*/
public class JsoupSSL {
public static void main(String[] args) throws IOException {
Document document = Jsoup.connect("<url>").validateTLSCertificates(true).get();
System.out.println(document);
}
/**
* 现在很多站点都是SSL对数据传输进行加密,这也让普通的HttpConnection无法正常的获取该页面的内容,
* 而Jsoup起初也对此没有做出相应的处理,
* 想了一下是否可以让Jsoup可以识别所有的SSL加密过的页面,查询了一些资料,发现可以为本地HttpsURLConnection配置一个“万能证书”,其原理是就是:
* 重置HttpsURLConnection的DefaultHostnameVerifier,使其对任意站点进行验证时都返回true
* 重置httpsURLConnection的DefaultSSLSocketFactory, 使其生成随机证书
* 后来Jsoup Connection提供了validateTLSCertificates(boolean validate)//是否进行TLS证书验证,不推荐
*/
static {
try {
// 重置HttpsURLConnection的DefaultHostnameVerifier,使其对任意站点进行验证时都返回true
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
// 创建随机证书生成工厂
//SSLContext context = SSLContext.getInstance("TLS");
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null, new X509TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
} }, new SecureRandom());
// 重置httpsURLConnection的DefaultSSLSocketFactory, 使其生成随机证书
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}
}