安全相关
安全
Elasticsearch-PHP 客户端提供两种安全模式:HTTP 认证和 SSL 加密。
HTTP 认证
如果你的 Elasticsearch 服务是通过 HTTP 来认证的,那么你需要给 ES-PHP 提供证书,那样在服务端的请求才会被验证。 在实例化客户端时,认证证书作为主机序列的一部分提供:
$hosts = [
'http://user:pass@localhost:9200', // HTTP Basic Authentication
'http://user2:pass2@other-host.com:9200' // Different credentials on different host
];
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
每个主机提供证书,允许他们有自己的一套证书。 发送到群集的所有请求都将使用相应的证书,具体取决于与之通信的节点。
SSL 加密
配置 SSL 会有些复杂。首先你需要确定你的签名证书是第三方认证机构 Certificate Authority (CA) 签名的证书还是你自签名证书。
注意: libcurl 版本注意事项。如果你觉得客户端已经正确配置 SSL,但是没有起效,请检查你的 libcurl 版本。在某些平台上,一些设置可能有效也可能无效,这取决于 libcurl 版本号。例如直到 libcurl 7.37.1,OSX 平台的 libcurl 才添加
--cacert
选项。--cacert
选项对应 PHP 的CURLOPT_CAINFO
常量, 这就意味着自定义的证书在低版本下是无法使用的。如果你现在正面临这个问题,请更新你的 libcurl,然后/或者查看 CURL 更新日志 有无增加该选项。
第三方认证的 CA 证书
如果你的证书是公共 CA 签名证书,且你的服务器用的是最新的根证书,你只需要在 host 中使用 https。客户端会自动识别 SSL 证书:
$hosts = [
'https://localhost:9200' (1)
];
$client = ClientBuilder::create()
->setHosts($hosts)
->build();
- 注意:这里用的是
https
而非http
如果服务器的根证书已经过期,你就需要使用证书 Bundle。对于客户端来说,最好的方法是使用 composer/ca-bundle。一旦安装好 ca-bundle,你要告诉客户端使用你提供的证书来替代系统的 Bundle:
$hosts = ['https://localhost:9200'];
$caBundle = \Composer\CaBundle\CaBundle::getBundledCaBundlePath();
$client = ClientBuilder::create()
->setHosts($hosts)
->setSSLVerification($caBundle)
->build();
自签名证书
自签名证书是一种没有被公共的 CA 签名的证书。他们通过你自己的组织进行签名。当你可以确保你的根证书安全的前提下,自签名证书可以作为内部目的来使用。但是当自签名证书被暴露给大众的时候我们就不能使用了,因为这样中间人很容易去攻击。
如果你要使用自签名证书,那么你需要提供证书给客户端。这与指定新根包的语法相同,但你应该指向你的证书:
$hosts = ['https://localhost:9200'];
$myCert = 'path/to/cacert.pem';
$client = ClientBuilder::create()
->setHosts($hosts)
->setSSLVerification($myCert)
->build();
使用认证和 SSL
同时使用 HTTP 认证和 SSL 也是有可能的。在 URI 中指定 https
, 根据需要配置 SSL 配置项和认证证书。例如,下面的代码段将会使用到基础的 HTTP 验证和自签名证书:
$hosts = ['https://user:pass@localhost:9200'];
$myCert = 'path/to/cacert.pem';
$client = ClientBuilder::create()
->setHosts($hosts)
->setSSLVerification($myCert)
->build();