全国免费咨询:

13245491521

VR图标白色 VR图标黑色
X

中高端软件定制开发服务商

与我们取得联系

13245491521     13245491521

2024-06-03_麻了,三方接口不动声色将http改为了https,被坑了~

您的位置:首页 >> 新闻 >> 行业资讯

麻了,三方接口不动声色将http改为了https,被坑了~ 早上刚来,就看到仓库那边不停发消息说,我们的某个功能用不了了。赶紧放下早餐加紧看。 原来是调的一个三方接口报错了: javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXpathbuildingfailed:sun.security.provider.certpath.SunCertPathBuilderException:unabletofindvalidcertificationpathtorequestedtarget atsun.security.ssl.Alert.createSSLException(Alert.java:131) atsun.security.ssl.TransportContext.fatal(TransportContext.java:353) atsun.security.ssl.TransportContext.fatal(TransportContext.java:296) atsun.security.ssl.TransportContext.fatal(TransportContext.java:291) atsun.security.ssl.CertificateMessage$T12CertificateConsumer.checkServerCerts(CertificateMessage.java:652) atsun.security.ssl.CertificateMessage$T12CertificateConsumer.onCertificate(CertificateMessage.java:471) atsun.security.ssl.CertificateMessage$T12CertificateConsumer.consume(CertificateMessage.java:367) atsun.security.ssl.SSLHandshake.consume(SSLHandshake.java:376) atsun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444) atsun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:422) atsun.security.ssl.TransportContext.dispatch(TransportContext.java:183) atsun.security.ssl.SSLTransport.decode(SSLTransport.java:154) atsun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1279) atsun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1188) atsun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:401) atsun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:373) 查看原因: 由于JVM默认信任证书不包含该目标网站的SSL证书,导致无法建立有效的信任链接。 奥...原来是他们把接口从http改为了https,导致我们获取数据报错了。再看看他们的证书,奥...新的。 image.png好了,看看我们的逻辑,这其实是一个获取对方生成的PDF文件的接口 PdfReaderpdfReader=newPdfReader(url); url就是他们给的链接,是这行代码报的错。这时候,开始研究,在网上扒拉,找到了初版方案 尝试1 写一个程序专门获取安全证书,这代码有点长,全贴出来影响阅读。我给扔我hithub上了https://github.com/lukezhao6/InstallCert/blob/main/InstallCert.java 将这个文件贴到本地,执行javac InstallCert.java将其进行编译 image.png编译完长这样: 然后再执行java InstallCert www.baidu.com (这里我们用百度举例子,实际填写的就是你想要获取证书的目标网站) 报错不用怕,因为它会去检查目标服务器的证书,如果出现了SSLException,表示证书可能存在问题,这时候会把异常信息打印出来。 在生成的时候需要输入一个1 这样,我们需要的证书文件就生成好了 image.png这时候,将它放入我们本地的 jdk的lib\security文件夹内就行了 image.png重启,这时候访问是没有问题了。阶段性胜利。 但是,但是。一顿操作下来,对于测试环境的docker,还有生产环境貌似不能这么操作。 放这个证书文件比较费事。 那就只能另辟蹊径了。 尝试2 搜到了,还有两种方案。 1.通过System.setProperty("javax.net.ssl.trustStore", "你的jssecacerts证书路径"); 2.程序启动命令-Djavax.net.ssl.trustStore=你的jssecacerts证书路径 -Djavax.net.ssl.trustStorePassword=changeit 我尝试了第一种,System.setProperty可以成功,但是读不到文件,权限什么的都是ok的。检查了蛮多地方 路径格式问题文件是否存在文件权限信任库密码系统属性优先级貌似都是没问题的,但肯定又是有问题的,因为没起作用。但是想着这样的接口有4个,万一哪天其他三个也改了,我又得来一遍。所以就算研究出来了,还是不能稳坐钓鱼台。有没有一了百了的方法嘞。 尝试3 还真找到了:这个错是因为对方网站的证书不被java信任么,那咱不校验了,直接全部信任。这样就算其他接口改了,咱也不愁。而且这个就是获取pdf,貌似安全性没那么重。那就开搞。 代码贴在了下方,上边的大概都能看懂吧,下方的我加了注释。 URLconsole=newURL(url); HttpURLConnectionconn=(HttpURLConnection)console.openConnection(); if(conninstanceofHttpsURLConnection){ SSLContextsc=SSLContext.getInstance("SSL"); sc.init(null,newTrustManager[]{newTrustAnyTrustManager()},newjava.security.SecureRandom()); ((HttpsURLConnection)conn).setSSLSocketFactory(sc.getSocketFactory()); ((HttpsURLConnection)conn).setHostnameVerifier(newTrustAnyHostnameVerifier()); } conn.connect(); InputStreaminputStream=conn.getInputStream(); PdfReaderpdfReader=newPdfReader(inputStream); inputStream.close(); conn.disconnect(); privatestaticclassTrustAnyTrustManagerimplementsX509TrustManager{ //这个方法用于验证客户端的证书。在这里,方法体为空,表示不对客户端提供的证书进行任何验证。 publicvoidcheckClientTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{ } //这个方法用于验证服务器的证书。同样,方法体为空,表示不对服务器提供的证书进行任何验证。 publicvoidcheckServerTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{ } //这个方法返回一个信任的证书数组。在这里,返回空数组,表示不信任任何证书,也就是对所有证书都不做任何信任验证。 publicX509Certificate[]getAcceptedIssuers(){ returnnewX509Certificate[]{}; } } //这个方法用于验证主机名是否可信。在这里,无论传入的主机名是什么,方法始终返回 true,表示信任任何主机名。这就意味着对于 SSL 连接,不会对主机名进行真实的验证,而是始终接受所有主机名。 privatestaticclassTrustAnyHostnameVerifierimplementsHostnameVerifier{ publicbooleanverify(Stringhostname,SSLSessionsession){ returntrue; } } 解决了解决了,这样改算是个比较不错的方案了吧。 阅读原文

上一篇:2025-04-28_英国社会住宅体系:基本情况与启示 下一篇:2024-11-08_ARRI学院 | 摄影机用户认证培训招生简章(北京站)

TAG标签:

21
网站开发网络凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设网站改版域名注册主机空间手机网站建设网站备案等方面的需求...
请立即点击咨询我们或拨打咨询热线:13245491521 13245491521 ,我们会详细为你一一解答你心中的疑难。
项目经理在线

相关阅读 更多>>

猜您喜欢更多>>

我们已经准备好了,你呢?
2022我们与您携手共赢,为您的企业营销保驾护航!

不达标就退款

高性价比建站

免费网站代备案

1对1原创设计服务

7×24小时售后支持

 

全国免费咨询:

13245491521

业务咨询:13245491521 / 13245491521

节假值班:13245491521()

联系地址:

Copyright © 2019-2025      ICP备案:沪ICP备19027192号-6 法律顾问:律师XXX支持

在线
客服

技术在线服务时间:9:00-20:00

在网站开发,您对接的直接是技术员,而非客服传话!

电话
咨询

13245491521
7*24小时客服热线

13245491521
项目经理手机

微信
咨询

加微信获取报价