Java Rest服务连接Azure VPN内ElasticSearch遇Connection refused问题
排查ElasticSearch连接被拒绝(Connection refused)的潜在原因
问题背景
我有一台启用安全功能的ElasticSearch服务器,另有部署在Tomcat中的Java Restful服务,通过HTTP RestClient尝试连接该服务器(版本差异不应构成问题)。两者均运行在Azure的同一VPN内。已将ElasticSearch服务器的证书导入Java应用实例的JDK密钥库,但连接时抛出如下异常:
java.net.ConnectException: Connection refused at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[?:1.8.0_362] at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:716) ~[?:1.8.0_362] at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvent(DefaultConnectingIOReactor.java:171) ~[httpcore-nio-4.4.5.jar:4.4.5] at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvents(DefaultConnectingIOReactor.java:145) ~[httpcore-nio-4.4.5.jar:4.4.5] at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:348) ~[httpcore-nio-4.4.5.jar:4.4.5] at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:192) ~[httpasyncclient-4.1.2.jar:4.1.2] at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64) ~[httpasyncclient-4.1.2.jar:4.1.2] at java.lang.Thread.run(Thread.java:750) [?:1.8.0_362]
经验证,在Java应用所在实例执行以下curl请求可正常访问:
sudo curl --cacert /path/to/my/http_ca.crt -u elastic https://x.x.x.x:9200
导入Java密钥库的CA证书与curl使用的相同,测试环境相同配置可正常连接,说明代码无问题。
潜在故障原因
- Tomcat使用的JDK与导入证书的JDK不一致:服务器可能存在多JDK环境,你可能将证书导入了系统默认JDK的密钥库,但Tomcat实际运行依赖的是另一个JDK。检查Tomcat启动脚本(如
catalina.sh、setenv.sh)中的JAVA_HOME配置,确认其指向的JDK路径,再验证该JDK下jre/lib/security/cacerts是否已导入目标证书。 - ElasticSearch绑定的IP非VPN内部地址:检查ElasticSearch配置文件
elasticsearch.yml中的network.host参数,确认其设置为VPN内可访问的IP(如0.0.0.0或具体私有IP),而非仅绑定127.0.0.1导致外部无法连接。 - 防火墙/安全组限制Tomcat进程出站流量:curl以root用户执行可正常访问,但Tomcat通常以普通用户(如
tomcat)运行,可能被本地防火墙(如ufw、iptables)或Azure网络安全组(NSG)限制了9200端口的出站权限。需确认相关规则是否允许Tomcat进程的IP/用户访问目标端口。 - 密钥库导入操作不规范:导入证书时可能未指定正确的密钥库路径,或密码输入错误导致Java无法读取证书。可通过以下命令验证证书是否存在于目标密钥库:
(替换为实际密钥库路径和证书别名)keytool -list -keystore /path/to/tomcat/jdk/jre/lib/security/cacerts -alias elastic-ca - ElasticSearch安全配置限制请求来源:检查
elasticsearch.yml中是否配置了IP白名单或SSL验证规则(如xpack.security.transport.ssl.verification_mode),确保Java应用的VPN私有IP在允许访问的范围内。 - Tomcat SSL配置冲突:若Tomcat自身配置了SSL服务,可能覆盖了RestClient的SSL上下文,导致连接失败。检查Tomcat的
server.xml中的SSL连接器配置,确认未干扰全局SSL上下文设置。
内容的提问来源于stack exchange,提问作者Shobhana Sriram
相关产品推荐
相关产品推荐

