安全相关

安全

Elasticsearch-PHP 客户端提供两种安全模式:HTTP 认证和 SSL 加密。

HTTP 认证

如果你的 Elasticsearch 服务是通过 HTTP 来认证的,那么你需要给 ES-PHP 提供证书,那样在服务端的请求才会被验证。 在实例化客户端时,认证证书作为主机序列的一部分提供:

  1. $hosts = [
  2. 'http://user:pass@localhost:9200', // HTTP Basic Authentication
  3. 'http://user2:pass2@other-host.com:9200' // Different credentials on different host
  4. ];
  5. $client = ClientBuilder::create()
  6. ->setHosts($hosts)
  7. ->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 证书:

  1. $hosts = [
  2. 'https://localhost:9200' (1)
  3. ];
  4. $client = ClientBuilder::create()
  5. ->setHosts($hosts)
  6. ->build();
  1. 注意:这里用的是 https 而非 http

如果服务器的根证书已经过期,你就需要使用证书 Bundle。对于客户端来说,最好的方法是使用 composer/ca-bundle。一旦安装好 ca-bundle,你要告诉客户端使用你提供的证书来替代系统的 Bundle:

  1. $hosts = ['https://localhost:9200'];
  2. $caBundle = \Composer\CaBundle\CaBundle::getBundledCaBundlePath();
  3. $client = ClientBuilder::create()
  4. ->setHosts($hosts)
  5. ->setSSLVerification($caBundle)
  6. ->build();

自签名证书

自签名证书是一种没有被公共的 CA 签名的证书。他们通过你自己的组织进行签名。当你可以确保你的根证书安全的前提下,自签名证书可以作为内部目的来使用。但是当自签名证书被暴露给大众的时候我们就不能使用了,因为这样中间人很容易去攻击。

如果你要使用自签名证书,那么你需要提供证书给客户端。这与指定新根包的语法相同,但你应该指向你的证书:

  1. $hosts = ['https://localhost:9200'];
  2. $myCert = 'path/to/cacert.pem';
  3. $client = ClientBuilder::create()
  4. ->setHosts($hosts)
  5. ->setSSLVerification($myCert)
  6. ->build();

使用认证和 SSL

同时使用 HTTP 认证和 SSL 也是有可能的。在 URI 中指定 https , 根据需要配置 SSL 配置项和认证证书。例如,下面的代码段将会使用到基础的 HTTP 验证和自签名证书:

  1. $hosts = ['https://user:pass@localhost:9200'];
  2. $myCert = 'path/to/cacert.pem';
  3. $client = ClientBuilder::create()
  4. ->setHosts($hosts)
  5. ->setSSLVerification($myCert)
  6. ->build();