常见集成网络问题与解决方案
集成网络问题与解决方案
一、基础知识
1、ping、telnet、curl
ping: 通过发送ICMP请求包到目标主机并等待目标主机的回应来评估主机之间的网络通信状况,只可以判断目标服务器是否可达,及确认网站的DNS解析是否正常,无法判断目标服务器上的特定服务是否可用。(注意:有的远程主机因禁止被Ping而导致Ping不通。但Curl命令能正常响应,那么服务也是能正常使用的。),例如:
// 间隔返回数据包证明成功 ping www.baidu.comtelnet: 通过指定的端口连接到目标服务器。如果Telnet命令成功建立连接,表示目标服务器的指定端口是可用的,可以判断目标服务器上特定服务端口的开放性。例如:
// 返回Connected字样证明成功 telnet www.baidu.com 443curl: curl命令发送相应协议(如Http、Https)的请求到目标服务器,并检查返回的响应状态码和内容。如果curl命令能够成功获取到目标服务器的有效响应,表示该服务在目标服务器上可用。如果不通,可能是防火墙拦截;或者网络地址不存在。例如:
// 返回状态码为200 OK为成功 curl -ki www.baidu.com
2、常见错误
Connection time out:网络响应超时
分析是否服务可用,然后判断是否端口开放。
Connection refused: connect网络连接拒绝
分析服务是否在重启
分析服务是否存在防火墙进行了IP限制,流量控制等
Connection Reset:连接被重置
容器是否申请外网访问白名单
客户端和服务端请求的TLS协议是否一致,可以考虑增加jvm参数解决https.protocols=TLSv1,TLSv1.1,TLSv1.2
可以通过curl –ki 分析服务端返回的结果,是否存在端口开放问题,IP是否开放白名单,防火墙是否开启等
3、https基础知识
3.1 https流程
HTTPS(Hypertext Transfer Protocol Secure)是⼀种⽹络安全传输协议,是⼀种⽤于在不可信⽹络上进⾏安全通信的传输 协议,HTTPS经由HTTP进⾏通讯,使⽤SSL/TLS协议对数据进⾏加密。
3.2 https主要作用
HTTPS的主要作⽤是在不安全的⽹络上创建⼀个安全信道,并可在使⽤适当的加密套件和服务器证书可被验证且可被信 任时,对窃听和中间⼈攻击提供合理的防护。
HTTPS的信任基于预先安装在操作系统中的证书颁发机构(CA)。因此,與⼀個網站之間的HTTPS連線僅在這些情况下 可被信任:
浏览器正确地实现了HTTPS且操作系统中安装了正确且受信任的证书颁发机构;
证书颁发机构仅信任合法的⽹站;
被访问的⽹站提供了⼀个有效的证书,也就是说它是⼀个由操作系统信任的证书颁发机构签发的(⼤部分浏览器会对 ⽆效的证书发出警告);
该证书正确地验证了被访问的⽹站(例如,访问 https://example.com 时收到了签发给 example.com ⽽不是其它域名的证 书);
此协议的加密层(SSL/TLS)能够有效地提供认证和⾼强度的加密。
3.3 TLS/SSL
SSL安全套接层(Secure Sockets Layer)与TLS传输层安全协议(Transport Layer Security)都是⼀种⽤于保障数据安全传输 的协议。
SSL由⽹景公司(Netscape)公司设计,⼀直发布到SSLv3.0版本,后⾯其有安全漏洞被许多公司禁⽤。
TLS由IETF发布,SSL是TLS的前⾝。
下⾯是其发布时间表:
二、网络问题分析步骤
1、网络问题排查流程
(1)⼀定要先搞清楚是哪个⽅向的⽹络访问出错。确定好哪个是调⽤客户端,哪个是服务端。
(2)根据调⽤客户端收到的报错⽇志,分析是⽹络问题还是证书问题。
(3)⽹络问题分析,通过控制变量法确定是不是仅在服务器上存在⽹络问题。在服务器命令⾏访问具体url看是否复现问 题,从⽽定位是否应⽤程序影响;对⽐⾃⼰的测试机器和服务器机器上的访问差异,从⽽定位是否为特定⽹段或防⽕墙影 响。
(4)https问题
https访问报错,不⼀定是https的问题,先确认是否是证书问题,http是否访问正常,通常https问题有明显的报错
CA 不被信任 ⾃签名证书,会提⽰系统不信任其安全证书。使⽤⾃签名,使⽤权威机构颁发的证书,⼀般不会出 现这种情况
中间证书缺失或错误 部分浏览器或者客户端正常,部分访问异常,查看返回的证书是正确的
2、常用工具
curl
浏览器F12
postman
openssl
⽹络抓包(可视化⼯具:wireshark 命令⾏⽰例:tcpdump "host 117.78.24.40 or host 117.78.24.34" -w ./curious.pcap)
2.1 curl命令使用说明
curl 的用法指南 - 阮一峰的网络日志 (ruanyifeng.com)
查出⼝IP地址及IP所在区域:
curl ipinfo.io curl http://www.cip.cc/
常⽤:-i 打印响应头信息 -v 打印通信过
2.2 SSL服务器证书
安装检查器 :https://www.myssl.cn/tools/check-server-cert.html
查看 证书信息
openssl s_client -showcerts -connect ***:443 -servername ***
三、网络白名单申请(以苍穹和EAS集成为例)
苍穹与EAS之间的集成需要保证两个系统所在的部署服务器之间能互相访问。
1、苍穹公有云,EAS私有云
1.1 公有云苍穹要能访问到私有云EAS
(1)私有云EAS要开放网络允许公有云苍穹访问 (如果EAS有防火墙,需要将公有云苍穹的出口IP加入到EAS防火墙的白名单,苍穹出口IP:生产xxx,沙箱xxx,详情咨询公有云运维)
(2)公有云苍穹一般不允许访问外部系统,需要申请权限。
(公有云苍穹用户请注意)由于公司安全加固,苍穹访问外部系统例如EAS、泛微等,需要申请开通访问权限(只能金蝶员工申请),申请文档请参考《苍穹互联网访问白名单申请指导》见附件。苍穹互联网访问白名单申请指导 https://vip.kingdee.com/article/127044235555571200
1.2 私有云EAS要能访问到公有云苍穹
(1)私有云EAS要可以访问到公有云苍穹,具体表现为:在EAS服务器上可以访问公有云苍穹的域名,比如curl https://***.kdcloud.com(公有云苍穹访问地址根据实际情况替换填写)能够返回结果;
再如EAS服务器或其同网段的机器可以直接在浏览器访问公有云苍穹 https:// ***.kdcloud.com(公有云苍穹访问地址根据实际情况替换填写)。如果客户对外访问有限制,需要在客户那边申请对外访问的权限,则将公有云苍穹的域名提供给客户进行申请即可,由于苍穹使用cdn,所以没有IP加端口的模式。
注意:私有云EAS所在服务器是否能根据域名访问公有云苍穹,若不能,要配置好EAS服务器关于公有云苍穹的域名解析。否则会报无法找到xxx的IP地址,解决方案参考第四章。
(2)苍穹公有云入口没有限制,如果表现为无法访问则可能是EAS服务器网络有问题,需用户内部运维排查;
2、苍穹与EAS 均为私有云
推荐将苍穹和EAS部署在同一局域网内,无需暴露公网
3、苍穹私有云,EAS公有云
与上述场景1类似
3.1 私有云苍穹要能访问到公有云EAS
私有云苍穹要可以访问到公有云EAS,具体表现为:在私有云苍穹服务器上可以访问公有云EAS,比如curl https://xxxx.xxxx.com能够返回结果,再如私有云苍穹服务器或其同网段的机器可以直接在浏览器访问公有云EAS https://xxxx.xxxx.com。
注意:私有云苍穹所在服务器是否能根据域名访问公有云EAS,若不能,要配置好服务器关于公有云EAS的域名解析。
3.2 公有云EAS要能访问到私有云苍穹
(1)私有云苍穹要开放网络允许公有云EAS访问;(如果私有云苍穹有防火墙,需要将公有云EAS的出口IP加入到苍穹防火墙的白名单,公有云EAS出口IP:***,详情咨询EAS公有云运维)
(2)公有云EAS一般不允许访问外部系统,需要申请权限。
EAS Cloud公有云环境默认不支持主动访问公网。如因业务需要对接第三方服务或系统的,请提交运维工单(任务类型:防火墙配置)申请开通访问对接第三方服务的权限,工单内容注明第三方服务的域名及其用途。
工单内容示例:https://www.yunzhijia.com 对接云之家。
工单提交地址https://ops.kdeascloud.com
参考链接:https://club.kdcloud.com/article/14205?productLineId=29&isKnowledge=2&islogin=true
四、典型网络问题
1、eg1: java.net.SocketException: Connection reset
问题背景:
通过集成云的NetUtil访问外部系统,如腾讯文档,报Connection reset
网络请求失败,URL是:https://docs.qq.com/oauth/...,原因是:Connection reset Caused by: java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.net.SocketInputStream.read(SocketInputStream.java:141) at sun.security.ssl.InputRecord.readFully(InputRecord.java:465) at sun.security.ssl.InputRecord.read(InputRecord.java:503) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347) at kd.isc.iscb.util.misc.NetUtil.getResponseCode(NetUtil.java:488) ... 113 more
解决方案:
原因:检查该容器是否开放了https://docs.qq.com/的白名单
(1)可以在容器中输入以下命令:
telnet docs.qq.com 443
如果返回以下信息,证明连通
(2)在容器中输入curl -ki https://docs.qq.com/,如果网络通畅,则会 返回以下html信息
反之,如果不通,则会返回
此时,需要申请容器访问外网的白名单。
如果上述步骤之后还不行,检查是否防火墙拦截。
(3)如果是eas调用苍穹报错,还有可能是protocols问题,参考
2、eg2: Connection Reset
问题背景:
某系统外部系统API调用返回Connection Reset
解决方案:
(1)初次尝试通过增加容器参数解决
-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2
但是容器重启后又会提示Connection Reset
(2)通过tcpdump抓取网络包进行分析
tcpdump -nn host *** and port 443 -w /tmp/xxxx.pcap
-nn:指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-w 直接将包写入文件中,并不分析和打印出来
(3)通过获取headdump文件进行堆栈分析
jmap -dump:format=b,file=xxxx.hprof pid
结合问题场景回看了下之前的抓包数据,目前初步猜测:
1、d365升级后,https的安全策略加强了,对加密算法有更高的要求。
2、如果Client Hello支持的加密算法不满足d365的安全策略,会中断连接。 # 中断方式有点粗暴,直接RST。
3、苍穹发起的https握手请求,正常和异常的请求有差异。
1)有或者没有Session ID
2)支持的加密算法集不同。 判断应该加密算法集的原因导致。
怀疑:
1、苍穹的某个后台事务会修改JDK TLS的缺省加密算法集。
2、该算法集不满足d365的安全策略,导致握手失败。 进一步诊断建议:
解决方案:
1、正常和异常时分别收集一次heapdump,用于对比分析,确认问题。
2、利用arthas定位修改缺省加密算法集的代码。 > 需要第1步分析后确定需要跟踪的类和方法
(4)arthas分析
当出现Reset时,用arthas工具连接java进程,执行如下ognl命令。context输出如果不是如下SSLContextImpl$DefaultSSLContext,说明被修改。
// 此处是调用 HttpsURLConnection. getDefaultSSLSocketFactory()方法。用于判断DefaultSSLContext是否被修改过。
[arthas@1]$ ognl @javax.net.ssl.HttpsURLConnection@getDefaultSSLSocketFactory() @SSLSocketFactoryImpl[ context=@DefaultSSLContext[sun.security.ssl.SSLContextImpl$DefaultSSLContext@52bed7ad], theFactory=null, propertyChecked=@Boolean[true], DEBUG=@Boolean[false], theFactory=null, ]。
然后执行如下ognl,将HttpsURLConnection的默认SSLSocket工厂类还原成默认值。
[arthas@1]$ ognl "@javax.net.ssl.HttpsURLConnection@setDefaultSSLSocketFactory(new sun.security.ssl.SSLSocketFactoryImpl())" null #
这里输出null表示执行成功。 再验证出现Reset的功能是否恢复正常,如果恢复正常,可确定是有代码修改了HttpsURLConnection的默认SSLSocket工厂类。
如下命令用于监控试图修改SSLSocket工厂类的代码堆栈。
// 开启unsafe开关,谨慎使用,官方提示会有搞挂JVM,该参数开启是允许执行JDK类的指令。 [arthas@1]$ options unsafe true // 获取修改SSLSocket的代码调用堆栈 [arthas@1]$ stack javax.net.ssl.HttpsURLConnection setDefaultSSLSocketFactory | tee /实际路径 /stack.txt &
通过jobs命令,获取后台任务的有效期和状态。
[arthas@1]$ jobs
最终监测到stack.txt中具体调用 HttpsURLConnection. setDefaultSSLSocketFactory()的方法
[arthas@1]$ sc -d zjmi.cloud.util.HttpRequestUti
sc:search_class简写,该命令可以获取jvm中的class信息
-d:输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的 ClassLoader 等详细信息。如果一个类被多个 ClassLoader 所加载,则会出现多次
[arthas@1]$ jad zjmi.cloud.util.HttpRequestUti
可以在线获取反编译的java源码
3、eg1: PKIX path building failed:unable to find valid certification
path to requested target
问题背景:
和EAS集成时,报“EAS反调苍穹报错, PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target”。
kd.isc.iscb.util.except.IscBizException: EAS反调苍穹时报错,url:https://xxxxx/ierp,错误内容:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at kd.isc.connector.eas.Util.testCallbackIerp(Util.java:312) at kd.isc.connector.eas.e.RemoteDeploy.exec(RemoteDeploy.java:46) at kd.isc.connector.eas.e.RemoteDeploy.exec(RemoteDeploy.java:1) at kd.isc.iscb.util.connector.server.AbstractCommandExecutor.exec(AbstractCommandExecutor.java:15) at kd.isc.iscb.util.connector.server.CommandDispatcher.execute(CommandDispatcher.java:146) at kd.isc.iscb.util.connector.server.CommandDispatcher.access$1(CommandDispatcher.java:141) at kd.isc.iscb.util.connector.server.CommandDispatcher$1.run(CommandDispatcher.java:121) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 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:1949) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
解决方案:
请EAS和苍穹集成的用户关注,如果您使用的EAS是862版本且需要使用https协议来进行集成,由于EAS在862版本对证书的验证更加严格,升级到EAS862后,如果苍穹端地址https颁发机构的证书不在EAS jdk的信任列表中,可能会出现集成管理中EAS连接配置部署异常,出现这个问题的概率极低,如有问题请找郭玲反馈,集成服务云将协调eas运维来解决。
SSL服务器证书安装检查器:https://www.myssl.cn/tools/check-server-cert.html
参考链接:https://vip.kingdee.com/link/s/l7QlO
4、eg2: PKIX path building failed, unable to find valid certification path to requested target
问题描述:
EAS反调苍穹时报错,url:https://xxx/ierp,错误内容:网络请求失败,URL是:https://xxx/ierp/...,原因是:sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 提示:上述异常由“EAS系统(eas)”数据源抛出。若需要更详细的日志分析报错,请在连接配置“集团EAS(JTEAS)”所对应的系统中获取更多日志。
kd.isc.iscb.util.except.IscBizException: at kd.isc.connector.eas.Util.testCallbackIerp(Util.java:367) at kd.isc.connector.eas.e.TestCommand.exec(TestCommand.java:22) at kd.isc.iscb.util.connector.server.AbstractCommandExecutor.exec(AbstractCommandExecutor.java:15) at kd.isc.iscb.util.connector.server.CommandDispatcher.execute(CommandDispatcher.java:143) at kd.isc.iscb.util.connector.server.CommandDispatcher.access$1(CommandDispatcher.java:139) at kd.isc.iscb.util.connector.server.CommandDispatcher$1.run(CommandDispatcher.java:119) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)[object Object]
解决方案:
除了eas端没有导入证书,苍穹端的nginx配置的https证书也有问题,缺失了中间证书导致。改回发的整个证书链配置,苍穹的nginx重启后就好了。
参考链接:https://kirayhz.notion.site/164377fffd5847b1b5314b618cc25275
5、No name matching *** found
问题描述:
苍穹跟第3方系统(https地址)集成的时候,常遇到以下SSL证书相关报错
解决方案:
以上报错的主要原因是客户端不能认证第3方系统的SSL证书,要把第3方系统CA证书导入到java的证书库中。
步骤:
1、找第3方系统负责人拿https的CA证书。
2、找到这台报错的部署了jdk的linux服务器,把CA证书导入到java的证书库
3、重启java程序(jvm证书库的导入需要重启后才会生效)
查看java证书库位置
使用keytool命令将CA证书导入证书库。
参考链接:https://vip.kingdee.com/link/s/l7L9G
6、无法找到域名对应的IP地址
问题背景:
苍穹费用通过集成服务云访问EAS报未找到EAS的IP地址。
解决办法:
苍穹服务器不认识eas服务器域名:***.tech,需要host配置ip,避免DNS域名解释不稳定问题。
可以通过host -t A或dig命令找到对应的EAS IP地址,例如www.baidu.com的IP地址可以通过如下命令获得
host -t A www.baidu.com // 或者 dig www.baidu.com
需要联系苍穹运维配置一下host的域名解析,格式:
14.215.177.39 www.baidu.com 14.215.177.38 www.baidu.com
并重启容器。
7、UnknownHostException
问题背景:
EAS反调苍穹时报错,url:https://ygXX.kdcloud.com,错误内容,UnknownHostException, java.lang.RuntimeException: java.lang.RuntimeException: EAS反调苍穹时报错,url:https://ygXX.kdcloud.com, 错误内容:
at kd.isc.connector.eas.Util.testCallbackIerp(Util.java:307) at kd.isc.connector.eas.e.TestCommand.exec(TestCommand.java:22) at kd.isc.iscb.util.connector.server.AbstractCommandExecutor.exec(AbstractCommandExecutor.java:15) at kd.isc.iscb.util.connector.server.CommandDispatcher.execute(CommandDispatcher.java:123) at kd.isc.iscb.util.connector.server.CommandDispatcher.access$0(CommandDispatcher.java:118) at kd.isc.iscb.util.connector.server.CommandDispatcher$1.run(CommandDispatcher.java:100) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1157) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:627) at java.lang.Thread.run(Thread.java:798) Caused by: java.net.UnknownHostException: ygXX.kdcloud.com at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:209) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:404) at java.net.Socket.connect(Socket.java:643) at com.ibm.jsse2.qc.connect(qc.java:223) at com.ibm.jsse2.pc.connect(pc.java:57)
解决方案:
EAS回调苍穹的时候并不认识苍穹域名该解析成哪个IP
EAS服务器的DNS配上苍穹的域名解析(找现场运维网络人员支持)
EAS 服务器上(windows作为服务端): C:\Windows\System32\drivers\etc绑定苍穹的 “IP 域名” (windows上 ) cmd下刷新DNS缓存: ipconfig /flushdns EAS服务器上(Linux作为服务端): 在/etc/hosts中添加记录绑定苍穹的 “IP 域名 “
参考链接:https://vip.kingdee.com/link/s/M51sB
8、Received fatal alert: handshake_failure
问题背景:
EAS使用的部分JDK版本会出现调用苍穹https时报传输加密层的握手错误“Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure”导致EAS连接配置部署失败,所以当苍穹从http协议切换到https协议时,需要特别慎重并在测试环境验证没有问题后再切换。
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at com.ibm.jsse2.o.a(o.java:22) at com.ibm.jsse2.o.a(o.java:34) at com.ibm.jsse2.SSLSocketImpl.b(SSLSocketImpl.java:378) at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:479) at com.ibm.jsse2.SSLSocketImpl.h(SSLSocketImpl.java:437) at com.ibm.jsse2.SSLSocketImpl.a(SSLSocketImpl.java:142) at com.ibm.jsse2.SSLSocketImpl.startHandshake(SSLSocketImpl.java:686) at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:98) at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:13) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1026) at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:25) Caused by: javax.net.ssl.SSLException: Received fatal alert: internal_error at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1979) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1086) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) at kd.isc.iscb.util.misc.NetUtil.sendRequestData(NetUtil.java:521) ... 23 more
解决办法:
(1)查看EAS自带JDK版本有哪些,如果有高版本JDK可以通过切换到高版本JDK看是否能解决(需要特别慎重并在测试环境验证没有问题后再切换)
(2)若第1种办法无法解决, 可修改eas实例配置 eas/server/profiles/server*/config/vm.properties, 增加一行配置:
https.protocols=TLSv1,TLSv1.1,TLSv1.2
修改后重启所有服务器实例再进行测试。(修改前请注意备份)
参考链接:https://vip.kingdee.com/link/s/MEZBT
9、server certificate change is restricted during renegotiation
问题背景:
EAS单据反写报错( EAS-苍穹) 同步,触发日志异常
java.lang.RuntimeException: server certificate change is restricted during renegotiation at kd.isc.iscb.util.dt.D.e(D.java:272) at kd.isc.iscb.util.misc.NetUtil.asyncHttpInvoke(NetUtil.java:176) at kd.isc.iscb.util.connector.server.ConnectorCallback.call(ConnectorCallback.java:129) at kd.isc.iscb.util.connector.server.ConnectorCallback.call(ConnectorCallback.java:143) at kd.isc.iscb.util.connector.RemoteEventPusher.push(RemoteEventPusher.java:25) at kd.isc.iscb.util.connector.EventBindingUtil.pushData(EventBindingUtil.java:326) at kd.isc.iscb.util.connector.EventBindingUtil.pushData(EventBindingUtil.java:315) at kd.isc.iscb.util.connector.EventBindingUtil.pushAll(EventBindingUtil.java:271) at kd.isc.iscb.util.connector.EventBindingUtil.pushAll(EventBindingUtil.java:233) at kd.isc.connector.eas.e.PushDataJobHandler.execute(PushDataJobHandler.java:41) at com.kingdee.bos.service.job.core.ThreadWorker.execute(ThreadWorker.java:186) at com.kingdee.bos.service.job.core.ThreadWorker.run(ThreadWorker.java:121) at java.lang.Thread.run(Thread.java:745) Caused by: javax.net.ssl.SSLHandshakeException: server certificate change is restricted during renegotiation at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
解决方案:
修改eas实例配置 eas/server/profiles/server*/config/vm.properties, 增加配置(修改前请注意备份):
jdk.tls.allowUnsafeServerCertChange=true sun.security.ssl.allowUnsafeRenegotiation=true https.protocols=TLSv1,TLSv1.1,TLSv1.2
修改后重启所有服务器实例再进行测试。
参考链接:https://vip.kingdee.com/link/s/MEZBT
10、Received fatal alert: internal_error
问题背景:
EAS反调苍穹时报错,url:https://publicispoc.test.kdcloud.com,错误内容:网络请求失败,URL是:https://publicispoc.test.kdcloud.com/api/...,原因是:Received fatal alert: internal_error
Running HTTPHandler-1 kd.isc.iscb.util.except.IscBizException: at kd.isc.connector.eas.Util.testCallbackIerp(Util.java:367) at kd.isc.connector.eas.e.RemoteDeploy.exec(RemoteDeploy.java:46) at kd.isc.connector.eas.e.RemoteDeploy.exec(RemoteDeploy.java:1) at kd.isc.iscb.util.connector.server.AbstractCommandExecutor.exec(AbstractCommandExecutor.java:15) at kd.isc.iscb.util.connector.server.CommandDispatcher.execute(CommandDispatcher.java:143) at kd.isc.iscb.util.connector.server.CommandDispatcher.access$1(CommandDispatcher.java:139) at kd.isc.iscb.util.connector.server.CommandDispatcher$1.run(CommandDispatcher.java:119) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) …… Caused by: javax.net.ssl.SSLException: Received fatal alert: internal_error at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1091) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) at kd.isc.iscb.util.misc.NetUtil.sendRequestData(NetUtil.java:523) ... 23 more
解决方案:
修改eas实例配置 eas/server/profiles/server*/config/vm.properties, 增加配置(修改前请注意备份):
jdk.tls.allowUnsafeServerCertChange=true sun.security.ssl.allowUnsafeRenegotiation=true https.protocols=TLSv1,TLSv1.1,TLSv1.2
修改后重启所有服务器实例再进行测试。
参考链接:https://vip.kingdee.com/link/s/MEZBT
11、SSL peer shut down incorrectly
问题背景:
某客户EAS部署反调苍穹提示:原因是:Remote host closed connection during handshake //原因:SSL peer shut down incorrectly。
解决方案1:
此处是EAS回调苍穹https的地址,无法获取主机信息,怀疑是host解析问题。
代理服务器是不是有转发日志,以及代理服务器是否可以请求苍穹回调地址,在代理服务器上的hosts文件。Hosts的IP解析优先级比DNS高
删除代理服务器上面的nginx配置的四层代理环境的域名配置即可。
解决方案2:
修改eas实例配置 eas/server/profiles/server*/config/vm.properties, 增加配置(修改前请注意备份):
jdk.tls.allowUnsafeServerCertChange=true sun.security.ssl.allowUnsafeRenegotiation=true https.protocols=TLSv1,TLSv1.1,TLSv1.2
修改后重启所有服务器实例再进行测试。
也可以加上javax.net.debug=ssl:handshake:data,那么jdk在网络调用过程会打印握手失败的原因,这里可能是协商https版本或者证书安全问题导致的失败。
12、ping不通,telnet和curl都是可以的
问题背景:
网络测试发现ping不同,telnet和curl均正常。
解决方案:
目标服务器是否关闭ping回显,或开启了防火墙拦截。
ping是基于ICMP协议的。telnet是基于tcp协议的。其次两者数据包也不一样,防火墙可以针对不同的协议,端口进行拦截。所以两者没有必然联系。
对于这种情况,只要能正常集成,无需理会。
13、SSL peer shut down incorrectly
问题描述:
EAS连接配置获取账套提示“SSL peer shut down incorrectly”
kd.isc.iscb.util.except.IscBizException: 网络请求失败,URL是:https://IP:6888/isc/...,原因是:Remote host closed connection during handshake
// 原因:SSL peer shut down incorrectly
http-request-pool-3586/traceId:13c2401e6237e825/time:1665470028638 kd.isc.iscb.util.except.IscBizException: at kd.isc.iscb.platform.core.connector.eas.Util.getDataCenterList(Util.java:207) at kd.isc.iscb.formplugin.dc.DatabaseLinkFormPlugin.getDataCenterList(DatabaseLinkFormPlugin.java:675) at kd.isc.iscb.formplugin.dc.DatabaseLinkFormPlugin.openDataCenterListForm(DatabaseLinkFormPlugin.java:267) at kd.isc.iscb.formplugin.dc.DatabaseLinkFormPlugin.afterDoOperation(DatabaseLinkFormPlugin.java:243) at kd.bos.form.plugin.FormViewPluginProxy.lambda$fireAfterDoOperation$9(FormViewPluginProxy.java:267) at kd.bos.form.plugin.FormViewPluginProxy.invokeMethod(FormViewPluginProxy.java:163) at kd.bos.form.plugin.FormViewPluginProxy.fireAfterDoOperation(FormViewPluginProxy.java:265) at kd.bos.form.operate.FormOperate.afterInvokeOperation(FormOperate.java:425) at kd.bos.form.operate.FormOperate.execute(FormOperate.java:305) at kd.bos.mvc.form.FormView.invokeOperation(FormView.java:621) at kd.bos.mvc.bill.BillView.invokeOperation(BillView.java:190) at kd.bos.mvc.form.FormView.invokeOperation(FormView.java:540) at kd.bos.form.control.Toolbar.itemClick(Toolbar.java:97) ...... at kd.isc.iscb.util.misc.NetUtil.handleIOException(NetUtil.java:551) at kd.isc.iscb.util.misc.NetUtil.getResponseCode(NetUtil.java:490) at kd.isc.iscb.util.misc.NetUtil.handleResponse(NetUtil.java:345) at kd.isc.iscb.util.misc.NetUtil.innerAccess(NetUtil.java:341) at kd.isc.iscb.util.misc.NetUtil.httpAccess(NetUtil.java:319) at kd.isc.iscb.util.misc.NetUtil.httpRead(NetUtil.java:254) at kd.isc.iscb.util.misc.NetUtil.httpRead(NetUtil.java:250) at kd.isc.iscb.platform.core.connector.eas.Util.getDataCenterList(Util.java:205) ... 108 more Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:994) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395) Caused by: java.io.EOFException: SSL peer shut down incorrectly at sun.security.ssl.InputRecord.read(InputRecord.java:505) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975) ... 124 more
解决方案:
EAS连接配置是,协议选择错误,EAS使用的是HTTP协议,却选择成了HTTPS协议;
如果EAS门户的登陆地址是 http://IP:6888/portal是这样登陆,代表HTTP协议
如果EAS门户的登陆地址是 https://IP:6888/portal是这样登陆,代表HTTPS协议
因此,连接配置时选择正确的协议。
14、302 Found
问题背景:
网络测试ping不通,telnet通,输入地址curl报"302 Found"。
解决方案:
302代表临时重定向了,说明地址可能不对,可以用
curl -L url
看到重定向后的地址。
发现地址是https://***/k3cloud,既输错了协议,又写错了端口号。
之后容器内输入curl -ki url,发现得到了正确的返回;界面输入正确的地址,curl也成功了。
注意:某些客户可能设置了访问白名单,别的电脑可能curl该地址会报403 Forbidden。
15、PKIX path validation failed:validity check failed
问题描述:
某客户访问EAS报如下错误
网络请求失败,URL是:https://***/isc/...,原因是:sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed // 原因:NotAfter: Fri May 19 07:59:59 GMT+08:00 2023 提示:上述异常由“EAS系统(eas)”数据源抛出。若需要更详细的日志分析报错,请在连接配置“EAS(001)”所对应的系统中获取更多日志。 ISC_TASK_WORKER-700/traceId:756bbd1e5f196fd1/time:1684998416734 错误码:REQUEST_SEND_ERROR@CommonErrorkd.isc.iscb.util.except.IscBizException: at kd.isc.iscb.util.misc.NetUtil.handleIOException(NetUtil.java:598) at kd.isc.iscb.util.misc.NetUtil.sendRequestData(NetUtil.java:578) at kd.isc.iscb.util.misc.NetUtil.sendRequest(NetUtil.java:556) at kd.isc.iscb.util.misc.NetUtil.sendRequest(NetUtil.java:547) at kd.isc.iscb.util.misc.NetUtil.innerAccess(NetUtil.java:350) at kd.isc.iscb.util.misc.NetUtil.httpAccess(NetUtil.java:329) at kd.isc.iscb.util.misc.NetUtil.httpPost(NetUtil.java:312) at kd.isc.iscb.util.misc.NetUtil.httpInvoke(NetUtil.java:302) at kd.isc.iscb.util.misc.NetUtil.asyncHttpInvoke(NetUtil.java:185) at kd.isc.iscb.util.misc.NetUtil.asyncHttpInvoke(NetUtil.java:178) at kd.isc.iscb.util.connector.client.AbstractRemoteContext.invoke(AbstractRemoteContext.java:24) at kd.isc.iscb.platform.core.connector.AbstractRemoteContextProxy.invoke(AbstractRemoteContextProxy.java:22) at kd.isc.iscb.util.connector.client.RemoteSystem.retrieveData(RemoteSystem.java:289) at kd.isc.iscb.platform.core.connector.eas.EasProxyConnectionFactory.query(EasProxyConnectionFactory.java:126) at kd.isc.iscb.platform.core.connector.ConnectionManager.query(ConnectionManager.java:181) at kd.isc.iscb.platform.core.syndata.EntitySynData.query(EntitySynData.java:138) at kd.isc.iscb.platform.core.syndata.EntitySynData.queryData(EntitySynData.java:108) at kd.isc.iscb.platform.core.syndata.AbstractSynData.invoke(AbstractSynData.java:95) at kd.isc.iscb.platform.core.syndata.SynDataUtil.executeSyncData(SynDataUtil.java:83) at kd.isc.iscb.platform.core.syndata.SyncDataJob.run(SyncDataJob.java:35) at kd.isc.iscb.platform.core.job.Job.runX(Job.java:71) at kd.isc.iscb.platform.core.job.JobRunner.run(JobRunner.java:76) at kd.isc.iscb.platform.core.job.JobRunner.innerExecute(JobRunner.java:66) at kd.isc.iscb.platform.core.job.JobRunner.access$000(JobRunner.java:21) at kd.isc.iscb.platform.core.job.JobRunner$1.run(JobRunner.java:57) at kd.isc.iscb.util.trace.TraceTask.invoke(TraceTask.java:24) at kd.isc.iscb.util.trace.TraceManager.trace(TraceManager.java:24) at kd.isc.iscb.platform.core.trace.TraceStack.traceJob(TraceStack.java:63) at kd.isc.iscb.platform.core.job.JobRunner.doJob(JobRunner.java:54) at kd.isc.iscb.platform.core.job.AbstractJobProxy.run(AbstractJobProxy.java:45) at kd.isc.iscb.platform.core.task.TaskWorker.innerExecute(TaskWorker.java:160) at kd.isc.iscb.platform.core.task.TaskWorker.execute(TaskWorker.java:141) at kd.isc.iscb.platform.core.task.TaskWorker.access$400(TaskWorker.java:34) at kd.isc.iscb.platform.core.task.TaskWorker$Worker.executeTask(TaskWorker.java:192) at kd.isc.iscb.platform.core.task.TaskWorker$Worker.run(TaskWorker.java:181) at kd.bos.threads.impl.ThreadPoolImpl.lambda$execute$0(ThreadPoolImpl.java:57) at kd.bos.threads.impl.RequestContextRunnable.run(RequestContextRunnable.java:60) at kd.bos.thread.ThreadLifeCycleManager$RunnableWrap.run(ThreadLifeCycleManager.java:267) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316) at sun.sec
常见集成网络问题与解决方案
本文2024-09-23 00:50:24发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-142070.html