本地运行的Java客户端无法访问AWS部署的HTTPS服务端点问题咨询
问题根因
- TLS版本/加密套件不兼容:你使用的AdoptOpenJDK 8u292默认禁用了TLS 1.0/1.1,同时新增了TLS 1.3预览支持,若AWS侧负载均衡(ALB/CLB)配置的TLS策略和本地Java支持的套件不匹配,会导致SSL握手过程中服务端主动断开连接。
- 老版本HTTP客户端不支持SNI:从报错栈帧可看出你调用链路使用的
commons-httpclient 3.x本身不支持SNI扩展,若AWS负载均衡绑定了多个HTTPS域名,服务端无法识别你要访问的域名对应的证书,会直接中断连接。 - 证书配置异常:虽然你已提前导入证书,可能存在导入的证书链不完整(缺失根证书/中间证书)、导入到了错误的JRE密钥库、应用启动时指定了自定义密钥库未同步导入证书等问题,导致SSL证书校验失败触发连接关闭。
- AWS侧访问控制拦截:AWS WAF、安全组、网络ACL可能限制了你本地公网IP的访问,或拦截了符合特定规则的请求(如请求体大小超标、SOAP请求头不符合要求),导致连接被主动重置。
解决方案
- 修复SNI兼容问题
如果可以升级依赖,优先将commons-httpclient 3.x替换为支持SNI的Apache HttpClient 4.x及以上版本;如果无法修改依赖,可在应用启动参数中添加以下配置,强制Axis2启用SNI支持:
-Daxis2.transport.http.sni-enabled=true -Dorg.apache.axis2.transport.http.HTTPSender.disableDefaultClient=true
- 调整TLS版本配置
如果是TLS 1.3兼容导致的握手失败,可在应用启动参数中添加以下配置,强制客户端使用TLS 1.2发起请求:
-Djdk.tls.client.protocols=TLSv1.2
如果需要兼容更低版本TLS,可修改JRE安装目录下jre/lib/security/java.security文件,删除jdk.tls.disabledAlgorithms配置项中的TLSv1, TLSv1.1条目。
3. 验证证书导入正确性
执行以下命令确认证书已正确导入到当前应用使用的JRE默认密钥库中:
keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts -alias <你的证书别名>
默认密钥库访问密码为changeit,如果查询不到对应证书,需重新导入完整的证书链(根证书+中间证书+服务端证书)。
4. 排查AWS侧访问规则
- 检查AWS负载均衡关联的安全组,确认已放通你本地公网IP的443端口入方向访问权限
- 查看AWS WAF日志,确认对应请求是否被WAF规则拦截,若被拦截可调整对应WAF规则
- 检查负载均衡的空闲超时配置,若请求处理时长超过默认超时阈值,可适当调大超时参数避免连接被主动断开。
内容的提问来源于stack exchange,提问作者Subodh Joshi
相关产品推荐
相关产品推荐

