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);
    }
相关推荐
phltxy4 分钟前
Spring AI 可观测性与 Zipkin 实战
java·人工智能·spring
兰令水12 分钟前
leecodecode【面试150】【2026.6.13打卡-java版本】
java·算法·leetcode
.道阻且长.22 分钟前
C++ string 操作指南:接口解析
java·c语言·开发语言·c++
蚰蜒螟23 分钟前
Java 对象的内存密语:从字段偏移量计算到 Unsafe 访问的完整链路
java·开发语言
IT 行者24 分钟前
GitHub Spec Kit 实战(六):/speckit.implement 怎么用、怎么审、怎么发现 spec 阶段的遗漏——五部曲收官
java·驱动开发·github·ai编程·claude
星辰_mya40 分钟前
CountDownLatch深度解析
java·开发语言·后端·架构
伊甸342 分钟前
从企业级项目学敏感词过滤:DFA算法与双层缓存实战
java·算法·缓存
cfm_291443 分钟前
JVM新一代垃圾收集器深度解析:G1与ZGC
java·jvm
x***r1511 小时前
.NET 10 SDK 安装教程(dotnet-sdk-10.0.100-win-x64详细步骤)
java·服务器·前端
摇滚侠1 小时前
MyBatis 入门到项目实战 MyBatis 的缓存 56-61
java·缓存·mybatis