当Jsoup遇到SSL加密站点

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/phone13144830339/article/details/80332851
今日推荐