当前位置: 首页 > 工具软件 > Wagtail > 使用案例 >

Wagtail SearchBackend —— ElasticSearch7 https 连接问题

阳念
2023-12-01

SearchBackend 是 Wagtail 后台提供搜索的服务后端,支持Database ElasticSearch等。

最近进行框架升级 2.14 -> 3.0.1,升级后出现了一些问题,其中一个就是搜索功能无法正常使用了

经过调试查找Google等一堆操作后确定是一个bug(这句就是废话), 这个问题应该是从2.15版本产生的

Wagtail的主页下看看,最终发现很久之前就有人提过Issue了,瞬间痛哭流涕,他乡遇故知啊。issue中倒是也有提供了解决思路,但是感觉不太好,也并不能完全解决。

最终决定切换到Backend试一试,本地搭了个ElasticSearch,简单配置一下,功能正常使用。

WAGTAILSEARCH_BACKENDS = {
    'default': {
        'BACKEND': 'wagtail.search.backends.elasticsearch7',
        'URLS': ['http://localhost:9200'],
        'INDEX': 'wagtail_search',
        'TIMEOUT': 5,
        'OPTIONS': {},
        'INDEX_SETTINGS': {},
    }
}

于是就写申请要一个生产的elasticsearch服务,给了个地址配上去

WAGTAILSEARCH_BACKENDS = {
    'default': {
        'BACKEND': 'wagtail.search.backends.elasticsearch7',
        'URLS': ['https://user-name:pwd@10.xx.xx.104:9200'],
        'INDEX': 'wagtail_search',
        'TIMEOUT': 5,
        'OPTIONS': {
            'use_ssl': True,
            'verify_certs': False,
        },
        'INDEX_SETTINGS': {},
    }
}

因为是https嘛,所以就加了OPTIONS配置忽略证书,这点道理还是懂得。

不出意外的话这个时候就该出现意外了,
elasticsearch.exceptions.SSLError: ConnectionError([SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)) caused by: SSLError([SSL: CERTIFICATE_VERIFY_FAILED] certific ate verify failed: self signed certificate in certificate chain (_ssl.c:1129))
真是踩屎的感觉,都设置False了还检测证书,查会文档啥的感觉没错,然后又添加证书, 三选一

# provide a path to CA certs on disk
ca_certs='/path/to/CA_certs',
# PEM formatted SSL client certificate
client_cert='/path/to/clientcert.pem',
# PEM formatted SSL client key
client_key='/path/to/clientkey.pem'

毫无意外,又踩了一下,死活找不到路径。。。
运维说最好忽略证书,那就放弃吧,继续面向google开发

一顿搜索,试了几个不管用,也大致了解了为啥'verify_certs': False不生效, 好像是这个设置Flase,证书路径就是None,然后在某一步将None读取成了字符串

最后找了个能用的方法记录下来

import ssl
from elasticsearch.connection import create_ssl_context

ssl_context = create_ssl_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE

WAGTAILSEARCH_BACKENDS = {
    'default': {
        'BACKEND': 'wagtail.search.backends.elasticsearch7',
        'URLS': ['https://user-name:pwd@10.xx.xx.104:9200'],
        'INDEX': 'wagtail_search',
        'TIMEOUT': 5,
        'OPTIONS': {
            'ssl_context': ssl_context,
            'use_ssl': True,
            'verify_certs': False,
        },
        'INDEX_SETTINGS': {},
    }
}
 类似资料: