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 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
code2cat5 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe5 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码5 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
wewowilling5 小时前
认识微服务
java·运维·微服务·springcloud
代码什么用5 小时前
Java Web 7-10
java·servlet
蜗牛互联网7 小时前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
java·人工智能·后端
SL_staff8 小时前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays10118 小时前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找