webmagic 爬取https的网站抛avax.net.ssl.SSLHandshakeException异常

webmagic 抓取带有https的网站,抛出的异常javax.net.ssl.SSLHandshakeException。

初步解决办法:

1,在自己的项目中新建httpclient文件夹,新建类HttpClientGenerator, 复制webmagic源码中的 HttpClientGenerator.

2.修改 HttpClientGenerator 的代码,需要修改 buildSSLConnectionSocketFactory 这个方法。

java 复制代码
private SSLConnectionSocketFactory buildSSLConnectionSocketFactory() {
		try {
            return new SSLConnectionSocketFactory(createIgnoreVerifySSL(), new String[]{"SSLv2Hello","SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"},
                    null,
                    new DefaultHostnameVerifier()); // 优先绕过安全证书
		} catch (KeyManagementException e) {
            logger.error("ssl connection fail", e);
        } catch (NoSuchAlgorithmException e) {
            logger.error("ssl connection fail", e);
        }
		return SSLConnectionSocketFactory.getSocketFactory();
	}

3,修改 HttpClientDownloader 中引用的 HttpClientGenerator 为你修改后的类。

4.设置爬虫 Spider 的 Downloader 为 你修改的 HttpClientDownloader。

做以上修改之后如果问题依然没解决,报错:

SSLException: Certificate for *** doesn't match any of the subject alternative

此错误是说明校验证书和域名失败,绕过就可以了。

正常情况下SSL连接会验证码所有证书信息

.register("https", new SSLConnectionSocketFactory(sslcontext)).build();

修改HttpClientGenerator的构造方法跳过验证,注释掉的代码为源码:

java 复制代码
 public HttpClientGenerator() {
//        Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
//                .register("http", PlainConnectionSocketFactory.INSTANCE)
//                .register("https", buildSSLConnectionSocketFactory())
//                .build();
//        SSLContext sslcontext = sslContext(keyStorePath, keyStorePassword);
        SSLContext sslcontext = null;
        try {
            sslcontext = createIgnoreVerifySSL();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        } catch (KeyManagementException e) {
            throw new RuntimeException(e);
        }
        Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.INSTANCE)
                //  只忽略域名验证码
                .register("https", new SSLConnectionSocketFactory(sslcontext, NoopHostnameVerifier.INSTANCE)).build();

        connectionManager = new PoolingHttpClientConnectionManager(reg);
        connectionManager.setDefaultMaxPerRoute(100);
    }
相关推荐
所愿ღ3 分钟前
SSM框架-Spring2
java·开发语言·笔记·spring
Flittly7 分钟前
【SpringSecurity新手村系列】(6)基于角色的权限控制、权限拦截注解与自定义无权限页面
java·spring boot·安全·spring·安全架构
草根站起来12 分钟前
GeoTrust G2 TLS CN RSA4096 SHA256 2022 CA1
ssl
栗少18 分钟前
Python 入门教程(面向有 Java 经验的开发者)
java·开发语言·python
小毛驴85020 分钟前
命令行中使用 Maven 启动 Spring Boot 应用
java·spring boot·maven
小王师傅6620 分钟前
【Java结构化梳理】泛型-上
java·开发语言
歪楼小能手24 分钟前
Android16在开机向导最后添加一个声明界面
android·java·平板
TE-茶叶蛋26 分钟前
Maven install 的原理
java·maven
想带你从多云到转晴26 分钟前
06、数据结构与算法---二叉树
java·数据结构·算法