出现“错误::接收到致命警报:握手失败:javax.net.
ssl
.
SSL
HandshakeException”是因为在使用Java REST客户端连接到
Elasticsearch
时发生了SSL握手错误。这通常是由于
SSL证书
验证失败或
客户端
与
服务器
之间的协议不匹配引起的。
以下是解决此问题的一些常见方法:
确认
SSL证书
是否有效:确保您使用的
SSL证书
是有效的,并且是由受
信任
的证书颁发机构(
CA
)签署的。您可以通过检查证书的到期日期和颁发机构来验证证书的有效性。
禁用
SSL证书
验证(不推荐):如果您无法获取有效的
SSL证书
或不想进行证书验证,可以选择禁用
SSL证书
验证。请注意,这会降低连接的安全性。以下是一个示例代码片段,用于禁用
SSL证书
验证:
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.ssl.SSLContextBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
public class ElasticsearchClient {
public static RestClient buildClient() throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException {
// Load the SSL certificate
FileInputStream trustStoreFile = new FileInputStream(new File("/path/to/truststore.jks"));
KeyStore truststore = KeyStore.getInstance("jks");
truststore.load(trustStoreFile, "password".toCharArray());
// Create SSL context
SSLContext sslContext = SSLContextBuilder.create()
.loadTrustMaterial(truststore, null)
.build();
// Create SSL socket factory with NoopHostnameVerifier
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
// Build the RestClient
RestClientBuilder builder = RestClient.builder(new HttpHost("your-elasticsearch-host", 9200, "https"))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setSSLContext(sslContext).setSSLSocketFactory(sslSocketFactory));
return builder.build();
public static void main(String[] args) throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException {
RestClient restClient = buildClient();
// Use the RestClient to perform operations on Elasticsearch
// ...
// Close the RestClient
restClient.close();
请注意,在上面的示例代码中,您需要将/path/to/truststore.jks
替换为包含您的SSL证书的实际路径,并将"password"
替换为您的证书密码。您还需要将"your-elasticsearch-host"
替换为实际的Elasticsearch主机名或IP地址。
更新Java版本:有时,此问题可能是由于使用的Java版本过旧而引起的。尝试升级到最新的Java版本,或者至少升级到支持TLS 1.2的Java版本。
检查服务端口和协议配置:确保Elasticsearch服务器的端口和协议配置与您的Java REST客户端代码中的配置一致。例如,如果服务器使用HTTPS协议,则Java REST客户端也必须使用相同的协议。
这些是解决“接收到致命警报:握手失败:javax.net.ssl.SSLHandshakeException”错误的一些常见方法。您可以根据您的具体情况选择适合您的解决方案。