Elasticsearch 8.1.2与NEST 17.7.1集成时产品校验失败问题求助
问题排查与解决
咱们先拆解你遇到的错误:"客户端无法验证服务器是否为Elasticsearch,原因是产品校验调用失败",这个问题通常和协议不匹配、证书指纹错误或者ES服务的基础配置有关,结合你的代码,我帮你一步步梳理解决:
1. 修复证书指纹里的非法字符
你代码中的证书指纹包含了GB,这是不符合十六进制规则的(合法字符只能是0-9、A-F/a-f),这会直接导致证书校验失败。你需要重新获取Elasticsearch的正确证书指纹:
- 如果是默认自签名证书,在ES安装目录的
bin文件夹下执行命令(Windows用cmd,Linux/macOS用终端):elasticsearch-certutil fingerprint - 复制输出的合法指纹(格式是冒号分隔的十六进制字符,无非法内容),替换代码里
CertificateFingerprint的对应值。
2. 把请求协议改成HTTPS
Elasticsearch 8.x版本默认强制启用HTTPS加密,你代码里用的http://localhost:9200会导致请求无法正常连接ES服务,进而返回未知状态码。修改协议为HTTPS:
var settings = new ConnectionSettings(new Uri("https://localhost:9200/")) // 其他配置保持不变
3. 替换过时的超时设置(可选)
你代码里的DeadTimeout在NEST 17.x版本中已经被标记为过时,推荐使用RequestTimeout来设置请求超时时间:
.RequestTimeout(TimeSpan.FromSeconds(300))
4. 验证Elasticsearch服务状态
确保ES服务正在运行,且可以正常访问:
- 在浏览器或终端访问
https://localhost:9200,输入你代码里的elastic用户名和对应密码,如果能返回ES的版本信息,说明服务状态正常。
修复后的完整代码示例
var settings = new ConnectionSettings(new Uri("https://localhost:9200/")) .CertificateFingerprint("替换为你获取的正确证书指纹") .BasicAuthentication("elastic", "-L-uXRg5=iOXGFgebP68") .RequestTimeout(TimeSpan.FromSeconds(300)) .DefaultIndex("people"); var client = new ElasticClient(settings); var person = new Person { Id = 1, FirstName = "Martijn", LastName = "Laarman" }; var asyncIndexResponse = await client.IndexDocumentAsync(person); return Task.CompletedTask;
按照上面的步骤修改后,应该就能解决这个验证失败的问题了。如果还有异常,可以查看ES的日志文件,获取更详细的错误信息来进一步排查。
内容的提问来源于stack exchange,提问作者nabi mohammadi
相关产品推荐
相关产品推荐

