为什么Elastic会引发此异常“ elasticsearch.exceptions.ConnectionError:ConnectionError(check_hostname需要server_hostname)”?

时间:2019-11-27 10:46:20

标签: python elasticsearch ssl

我正在尝试从python脚本查询elasticsearch,并引发了异常。

我遵循了this one等官方指南。 但是,当我尝试查询elasticsearch时,没有成功。例外:

File "C:\...\connection\http_urllib3.py", line 250, in perform_request
    raise ConnectionError("N/A", str(e), e)
elasticsearch.exceptions.ConnectionError:
 ConnectionError(check_hostname requires server_hostname) caused by: ValueError(check_hostname requires server_hostname)

这是我的代码:

from elasticsearch import Elasticsearch
from elasticsearch import RequestsHttpConnection
from ssl import create_default_context
import ssl



context = create_default_context(cafile="certificate.pem")
es = Elasticsearch("https://localhost", ssl_context=context, http_auth=('username','password'))

res = es.search(index="dr_*", body = {
'size' : 10,
'query': {
    'match_all' : {}
}
})

为什么会发生?

3 个答案:

答案 0 :(得分:1)

不幸的是,我也遇到了这样的问题。

默认情况下,上下文中check_hostname的值为True,因此必须指定server_hostname。这是一个简单的解决方案,只需在创建上下文后添加以下行

context.check_hostname = False

它应该可以正常工作

答案 1 :(得分:0)

在示例中您没有提及端口。请验证您提到的教程和以下代码段:

es = Elasticsearch(
    ['localhost', 'otherhost'],
    http_auth=('user', 'secret'),
    scheme="https",
    port=443,
)

答案 2 :(得分:0)

执行 context.check_hostname = False 会使连接变得不安全。

改用这个构造函数:

Elasticsearch(
   hosts=['ip_address'],,
   http_auth=('elastic', 'pass'),
   use_ssl=True,
   verify_certs=True,
   port=9200, #make sure of the port elasticsearch is using
   ca_certs='/Users/raphaeldelio/ca.crt'
)