前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[已解决]java请求爬取https网站报错javax.net.ssl.SSLHandshakeException的解决办法

[已解决]java请求爬取https网站报错javax.net.ssl.SSLHandshakeException的解决办法

作者头像
小小鱼儿小小林
发布2020-09-01 15:21:39
1.2K0
发布2020-09-01 15:21:39
举报
文章被收录于专栏:灵儿的笔记灵儿的笔记

前言

在爬取https网站的时候,今天遇到了一个之前没有见过的异常javax.net.ssl.SSLHandshakeException,具体细节请看如图

代码语言:javascript
复制
2020-06-01 23:18:17.032 DEBUG org.springframework.web.servlet.DispatcherServlet
- Successfully completed request
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExce
ption: unable to find valid certification path to requested target
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.
java:1341)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.jav
a:153)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.
java:1312)
        at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82
)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream
(HttpConnection.java:828)
        at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodB
ase.java:2116)
        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.j
ava:1096)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(Htt
pMethodDirector.java:398)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMe
thodDirector.java:171)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.jav
a:397)

产生原因是jdk的证书库里并没有将该站点的证书作为受信任的安全证书。

解决方法是导该站点的证书,将此证书导入到java的信任证书库中。

注意事项:

要注意的是,在win7或更高的系统中,运行一定要以管理员身份运行CMD,Mac os 要用sudo -i 命令切换为 root用户,否则会报以下错

代码语言:javascript
复制
keytool错误: java.io.FileNotFoundException:   

操作步骤:

把证书导入java的cacerts证书库的步骤:

第一步:用浏览器打开网站,把要导入java证书库的证书下载 在该网页安全警报弹出窗口上查看证书--详细信息--复制到文件 会弹出一个证书导出向导对话框,按提示一直下一步直到完成。 我把证书保存在C盘,名字为NEXT_CertKey.cer 或是 xxxx.der。

第二步:将上面导出的证书导入java中的cacerts证书库 windows cmd进入D:\Program Files\Java\jdk1.7.0_67\bin 目录

(这里要找到你们的jdk安装目录)

敲入如下命令回车执行 keytool -import -alias cacerts -keystore D:\Program Files\Java\jdk1.7.0_67\jre\lib\security\cacerts -file C:\NEXT_CertKey.cer -trustcacerts 此时命令行会提示你输入cacerts证书库密码, java中cacerts证书库默认密码为changeit, Y确认即可,OK,认证已添加至keystore。

代码语言:javascript
复制
我在本地测试的时候,用上面的好像有点问题,但是用下面的是可以的,大家可以两种方法都试一下,看下哪种可以导入进去

keytool -import -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -file D:/jxust_CertKey.cer -alias ssodemo 

演示效果如图所示

mac os 终端进入 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security

sudo keytool -import -alias cacerts -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/security/cacerts -file /Users/xuwenfeng/Desktop/RuckusWirelessZoneDirectorSN-491508001359 -trustcacerts


参考文章

https://www.iteye.com/blog/bewithme-2227487

感谢原作者的分享,让技术人能够更快的解决问题

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 操作步骤:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档