Perl Search::Elasticsearch 不适用于具有自签名证书的启用 SSL 的节点

Perl Search::Elasticsearch doesn't work with SSL enabled node with Self-signed certificate

我正在为 Elasticsearch 使用 Perl 包装器:“Search::Elasticsearch” 我创建一个对象如下:

use Search::Elasticsearch;
my $e = Search::Elasticsearch->new( nodes => "192.168.0.66:9200", debug => 1);

它工作正常,我可以使用这个对象查询 Elasticsearch 节点。然后我尝试使用自签名证书连接到启用了 SSL 的 Elasticsearch 节点。我使用以下命令:

use Search::Elasticsearch;
my $e = Search::Elasticsearch->new( nodes => "192.168.0.66:9200", use_https => 1, userinfo => "testuser:testpwd", debug => 1);

但是不行。

如果我用curl来查询Elasticsearch,我使用下面的命令:

curl https://testuser:testpwd@192.168.0.67:9200

这也不行。当我将 -k 开关与 curl 一起使用时:

curl https://testuser:testpwd@192.168.0.67:9200 -k

然后它工作正常。我从 Elasticsearch 节点收到响应。

现在我想使用相同的过程使用 Perl 模块查询相同的启用 SSL 的 Elasticsearch 节点:Search::Elasticsearch。什么是正确的语法以及定义“-k”开关的方式和位置?

使用 -k--insecure 的同义词,因此 curl 不验证证书。那么问题是,在允许不安全连接的情况下通过加密的 SSL 通道查询有多大用处?

这首先违背了使用 SSL 的目的,对吧?

如果您有签署证书的 CA(您应该这样做),那么您应该将其与 --cacert curl 开关一起使用

curl --cacert /path/to/cacert.pem https://testuser:testpwd@192.168.0.67:9200

或者使用 Perl,您还可以 specify the CA cert in the ssl_options

use Search::Elasticsearch;
use IO::Socket::SSL;
 
my $es = Search::Elasticsearch->new(
    nodes => [
        "192.168.0.66:9200"
    ],
    userinfo => "testuser:testpwd",
    debug => 1,
    ssl_options => {
        SSL_verify_mode     => SSL_VERIFY_PEER,
        SSL_ca_file         => '/path/to/cacert.pem',
        SSL_verifycn_scheme => 'http',
    }
);