- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- CSS服务权限管理
-
使用Elasticsearch搜索数据
- Elasticsearch使用流程
- Elasticsearch集群规划建议
- 创建Elasticsearch集群
- 访问Elasticsearch集群
- 导入数据至Elasticsearch集群
- 使用Elasticsearch集群搜索数据
- 增强Elasticsearch集群搜索能力
- 配置Elasticsearch集群网络
- 备份与恢复Elasticsearch集群数据
- 扩缩容Elasticsearch集群
- 升级Elasticsearch集群版本
- 管理Elasticsearch集群
- 管理Elasticsearch集群索引策略
- Elasticsearch集群监控与日志管理
- 查看Elasticsearch集群审计日志
- 使用OpenSearch搜索数据
- 使用Logstash迁移数据
- CSS服务资源监控
- 最佳实践
- API参考
- SDK参考
-
常见问题
- 产品咨询
- CSS集群访问
- CSS集群迁移
-
CSS集群搜索引擎使用
- CSS服务中为什么新创建的索引分片集中分配到单节点上?
- CSS服务中Elasticsearch 7.x集群如何在index下创建type?
- CSS服务中如何配置Elasticsearch索引副本数量?
- CSS服务中Elasticsearch集群分片过多会有哪些影响?
- 如何查看CSS集群的分片数以及副本数?
- CSS服务中Elasticsearch集群的节点node.roles为i表示什么意思?
- CSS服务中如何设置Elasticsearch集群的默认分页返回最大条数?
- CSS服务中如何更新Elasticsearch生命周期策略?
- CSS服务中如何设置Elasticsearch集群慢查询日志的阈值?
- CSS服务中如何清理Elasticsearch索引数据?
- CSS服务中如何清理Elasticsearch缓存?
- 使用delete_by_query命令删除Elasticsearch集群数据后,为什么磁盘使用率反而增加?
- CSS服务的Elasticsearch集群是否支持script dotProduct?
-
CSS集群管理
- 如何查看CSS集群所分布的可用区?
- CSS服务中Filebeat版本与集群版本的关系是什么?
- 如何获取CSS服务的安全证书?
- CSS服务中如何转换CER安全证书的格式?
- CSS服务中Elasticsearch和OpenSearch集群支持修改安全组吗?
- CSS服务中Elasticsearch集群如何设置search.max_buckets参数?
- CSS服务中如何修改Elasticsearch和OpenSearch集群的TLS算法?
- CSS服务中如何开启Elasticsearch和OpenSearch集群的安全审计日志?
- CSS服务中是否支持停止集群?
- CSS集群冻结索引后如何查询OBS上的索引占用量?
- 如何查看Elasticsearch和OpenSearch集群的系统默认插件列表
- CSS集群备份与恢复
- CSS集群监控与运维
-
故障排除
-
访问集群类
- 无法正常打开Kibana
- Elasticsearch针对filebeat配置调优
- Spring Boot使用Elasticsearch出现Connection reset by peer问题
- 为什么集群创建失败
- Elasticsearch集群出现写入拒绝“Bulk Reject”,如何解决?
- Elasticsearch集群创建index pattern卡住,如何解决?
- 云搜索控制台页面提示系统繁忙
- Elasticsearch集群报错:unassigned shards all indices
- es-head插件连接Elasticsearch集群报跨域错误
- 单节点集群打开Cerebro界面显示告警
- ECS无法连接到集群
- 集群不可用
- 数据导入导出类
-
功能使用类
- 无法备份索引
- 无法使用自定义词库功能
- 快照仓库找不到
- 集群一直处于快照中
- 数据量很大,如何进行快照备份?
- 集群突现load高的故障排查
- 使用ElasticSearch的HLRC(High Level Rest Client)时,报出I/O Reactor STOPPED
- Elasticsearch集群最大堆内存持续过高(超过90%)
- Elasticsearch集群更改规格失败
- 安全集群索引只读状态修改报错
- Elasticsearch集群某一节点分配不到shard
- 集群索引插入数据失败
- CSS创建索引报错“maximum shards open”
- 删除索引报错“403 Forbidden”是什么原因?
- Kibana中删除index pattern报错Forbidden
- 执行命令update-by-query报错“Trying to create too many scroll contexts”
- Elasticsearch集群无法创建pattern
- 端口访问类
-
访问集群类
- 视频帮助
- 产品术语
-
更多文档
-
用户指南(阿布扎比区域)
- 产品介绍
- 快速入门
- 权限管理
- 创建并接入集群
- 集群形态变更
- 导入数据到Elasticsearch
- 管理Elasticsearch类型集群
- 向量检索
- 使用Kibana相关操作
- 查询Elasticsearch SQL
- 增强特性
- 监控
- 审计
-
常见问题
- 产品咨询类
-
功能使用相关
- Elasticsearch是否支持不同VPC之间的数据迁移?
- 如何跨Region迁移CSS集群?
- 如何设置云搜索服务的慢查询日志的阈值?
- 如何更新CSS生命周期策略?
- 如何批量设置索引副本数为0?
- 为什么新创建的索引分片全部被分配到一个node节点上?
- 如何查询快照信息?
- 购买的低版本集群是否可以升级为高版本集群
- 集群被删除后是否还能恢复?
- 如何修改Elasticsearch集群的TLS算法?
- ES集群如何设置search.max_buckets参数?
- Elasticsearch集群中某个客户端节点的node.roles为i表示该节点是ingest节点吗?
- Elasticsearch 7.x集群如何在index下创建type?
- 安全模式集群相关
- 资源使用和更改相关
- 组件使用
- Kibana使用相关
- 访问集群相关
- 端口使用
- 修订记录
- API参考(阿布扎比区域)
-
用户指南(巴黎、阿姆斯特丹区域)
- 产品介绍
- 快速入门
- 权限管理
- 创建并接入集群
- 集群形态变更
- 导入数据到Elasticsearch
- 管理Elasticsearch类型集群
- 向量检索
- 使用Kibana相关操作
- 查询Elasticsearch SQL
- 增强特性
- 监控
- 审计
- 最佳实践
-
常见问题
- 产品咨询类
-
功能使用相关
- Elasticsearch是否支持不同VPC之间的数据迁移?
- 如何跨Region迁移CSS集群?
- 如何设置云搜索服务的慢查询日志的阈值?
- 如何更新CSS生命周期策略?
- 如何批量设置索引副本数为0?
- 为什么新创建的索引分片全部被分配到一个node节点上?
- 如何查询快照信息?
- 购买的低版本集群是否可以升级为高版本集群
- 集群被删除后是否还能恢复?
- 如何修改Elasticsearch集群的TLS算法?
- Elasticsearch集群如何设置search.max_buckets参数?
- Elasticsearch集群中某个客户端节点的node.roles为i表示该节点是ingest节点吗?
- Elasticsearch 7.x集群如何在index下创建type?
- 安全模式集群相关
- 资源使用和更改相关
- 组件使用
- Kibana使用相关
- 访问集群相关
- 端口使用
- 修订记录
- API参考 (巴黎、阿姆斯特丹区域)
-
用户指南(吉隆坡区域)
- 产品介绍
- 快速入门
- 权限管理
- 创建并接入集群
- 集群形态变更
- 导入数据到Elasticsearch
- 管理Elasticsearch类型集群
- 向量检索
- 使用Kibana相关操作
- 查询Elasticsearch SQL
- 增强特性
- 监控
- 审计
-
常见问题
- 产品咨询类
-
功能使用相关
- Elasticsearch是否支持不同VPC之间的数据迁移?
- 如何跨Region迁移CSS集群?
- 如何设置云搜索服务的慢查询日志的阈值?
- 如何更新CSS生命周期策略?
- 如何批量设置索引副本数为0?
- 为什么新创建的索引分片全部被分配到一个node节点上?
- 如何查询快照信息?
- 购买的低版本集群是否可以升级为高版本集群
- 集群被删除后是否还能恢复?
- 如何修改Elasticsearch集群的TLS算法?
- ES集群如何设置search.max_buckets参数?
- Elasticsearch集群中某个客户端节点的node.roles为i表示该节点是ingest节点吗?
- Elasticsearch 7.x集群如何在index下创建type?
- 安全模式集群相关
- 资源使用和更改相关
- 组件使用
- Kibana使用相关
- 访问集群相关
- 端口使用
- 修订记录
- API参考(吉隆坡区域)
-
用户指南(安卡拉区域)
- 产品介绍
- 快速入门
- 权限管理
- 查看集群运行状态和存储容量状态
- 集群列表概览
- 部署跨AZ集群
- Elasticsearch
- 导入数据到Elasticsearch
- 监控
- 审计
-
常见问题
- 产品咨询类
-
功能使用相关
- Elasticsearch是否支持不同VPC之间的数据迁移?
- 如何跨Region迁移CSS集群?
- 如何设置云搜索服务的慢查询日志的阈值?
- 如何更新CSS生命周期策略?
- 如何批量设置索引副本数为0?
- 为什么新创建的索引分片全部被分配到一个node节点上?
- 如何查询快照信息?
- 购买的低版本集群是否可以升级为高版本集群
- 集群被删除后是否还能恢复?
- 如何修改Elasticsearch集群的TLS算法?
- ES集群如何设置search.max_buckets参数?
- Elasticsearch集群中某个客户端节点的node.roles为i表示该节点是ingest节点吗?
- Elasticsearch 7.x集群如何在index下创建type?
- 安全模式集群相关
- 资源使用和更改相关
- 组件使用
- Kibana使用相关
- 访问集群相关
- 端口使用
- 修订记录
- API参考(安卡拉区域)
-
用户指南(阿布扎比区域)
- 通用参考
链接复制成功!
配置Elasticsearch集群独享型负载均衡
云搜索服务集成了共享型负载均衡器的能力,支持绑定公网访问和开启终端节点服务。相比共享型负载均衡器,独享型负载均衡器功能更丰富、性能更强,本章主要介绍如何配置集群的独享型负载均衡。
场景描述
- 非安全模式集群也支持集成弹性负载均衡服务的能力。
- 支持用户使用自定义证书进行HTTPS双向认证。
- 支持7层流量监控及告警配置,方便用户随时查看监控情况。
不同安全模式的集群对接独享型负载均衡器共有8种不同的服务形态,不同服务形态对应的ELB能力如表1所示,8种组合的配置概览如表2所示。
集群安全模式 |
ELB最终对外提供的服务形态 |
ELB负载均衡 |
ELB流量监控 |
ELB双向认证 |
---|---|---|---|---|
非安全 |
无认证 |
支持 |
支持 |
不支持 |
单向认证 双向认证 |
支持 |
支持 |
支持 |
|
安全+HTTP |
密码认证 |
支持 |
支持 |
不支持 |
单向认证+密码认证 双向认证+密码认证 |
支持 |
支持 |
支持 |
|
安全+HTTPS |
单向认证+密码认证 双向认证+密码认证 |
支持 |
支持 |
支持 |
集群安全模式 |
ELB最终对外提供的服务形态 |
ELB监听器 |
后端服务器组 |
||||
---|---|---|---|---|---|---|---|
前端协议 |
前端端口 |
SSL解析方式 |
后端协议 |
健康检查端口 |
健康检查路径 |
||
非安全 |
无认证 |
HTTP |
9200 |
无认证 |
HTTP |
9200 |
/ |
单向认证 |
HTTPS |
9200 |
单向认证 |
HTTP |
9200 |
||
双向认证 |
HTTPS |
9200 |
双向认证 |
HTTP |
9200 |
||
安全+HTTP |
密码认证 |
HTTP |
9200 |
无认证 |
HTTP |
9200 |
/_opendistro/_security/health |
单向认证+密码认证 |
HTTPS |
9200 |
单向认证 |
HTTP |
9200 |
||
双向认证+密码认证 |
HTTPS |
9200 |
双向认证 |
HTTP |
9200 |
||
安全+HTTPS |
单向认证+密码认证 |
HTTPS |
9200 |
单向认证 |
HTTPS |
9200 |
|
双向认证+密码认证 |
HTTPS |
9200 |
双向认证 |
HTTPS |
9200 |
CSS集群对接独享型负载均衡的操作步骤如下:
- 如果规划ELB监听器的前端协议是HTTPS,则需要准备签名证书并上传至ELB管理控制台:准备并上传自签名证书
- 在ELB管理控制台创建独享型负载均衡器:创建独享型负载均衡器
- Elasticsearch或OpenSearch集群开启负载均衡:集群对接负载均衡器
- 通过独享型负载均衡实例接入集群:通过Curl命令接入集群
本文还提供了通过独享型负载均衡实例接入集群的Java客户端代码示例:通过负载均衡器的HTTPS双向认证方式接入集群的代码示例(Java)
约束限制
- 如果ELB绑定了公网,则不推荐接入非安全模式的集群。非安全模式的集群使用HTTP通信且不需要安全认证即可访问,如果对接公网访问存在安全风险。
- 开启了HTTPS访问的安全模式的集群不支持HTTP类型的前端协议认证,如果需要使用HTTP类型的前端协议,需要将集群的“安全模式”变更为“非安全模式”,具体操作请参见更改Elasticsearch集群安全模式。在变更安全模式前,请先关闭“负载均衡”,安全模式变更完成后再开启“负载均衡”。
准备并上传自签名证书
当规划的ELB监听器的前端协议为HTTPS时,需要参考本节准备自签名证书,作为服务器证书或CA证书上传至ELB。
建议使用云证书管理服务CCM购买的证书,或者其他权威机构颁发的证书。
- 登录到任意一台安装有OpenSSL工具和JDK的Linux客户端。
- 执行如下命令制作自签名证书。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
mkdir ca mkdir server mkdir client #使用OpenSSL制作CA证书 cd ca #创建CA证书的openssl配置文件ca_cert.conf cat >ca_cert.conf <<EOF [ req ] distinguished_name = req_distinguished_name prompt = no [ req_distinguished_name ] O = ELB EOF #创建CA证书私钥文件ca.key openssl genrsa -out ca.key 2048 #创建CA证书的csr请求文件ca.csr openssl req -out ca.csr -key ca.key -new -config ./ca_cert.conf #创建自签名的CA证书ca.crt openssl x509 -req -in ca.csr -out ca.crt -sha1 -days 5000 -signkey ca.key #把ca证书格式转为p12格式 openssl pkcs12 -export -clcerts -in ca.crt -inkey ca.key -out ca.p12 #把ca证书格式转为jks格式 keytool -importkeystore -srckeystore ca.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore ca.jks #使用CA证书签发服务器证书 cd ../server #创建服务器证书的openssl配置文件server_cert.conf,CN字段根据需求改为服务器对应的域名、IP地址 cat >server_cert.conf <<EOF [ req ] distinguished_name = req_distinguished_name prompt = no [ req_distinguished_name ] O = ELB CN = 127.0.0.1 EOF #创建服务器证书私钥文件server.key openssl genrsa -out server.key 2048 #创建服务器证书的csr请求文件server.csr openssl req -out server.csr -key server.key -new -config ./server_cert.conf #使用CA证书签发服务器证书server.crt openssl x509 -req -in server.csr -out server.crt -sha1 -CAcreateserial -days 5000 -CA ../ca/ca.crt -CAkey ../ca/ca.key #把服务端证书格式转为p12格式 openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12 #把服务证书格式转为jks格式 keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore server.jks #使用CA证书签发客户端证书 cd ../client #创建客户端证书的openssl配置文件client_cert.conf,CN字段根据需求改为服务器对应的域名、IP地址 cat >client_cert.conf <<EOF [ req ] distinguished_name = req_distinguished_name prompt = no [ req_distinguished_name ] O = ELB CN = 127.0.0.1 EOF #创建客户端证书私钥文件client.key openssl genrsa -out client.key 2048 #创建客户端证书的csr请求文件client.csr openssl req -out client.csr -key client.key -new -config ./client_cert.conf #使用CA证书签发客户端证书client.crt openssl x509 -req -in client.csr -out client.crt -sha1 -CAcreateserial -days 5000 -CA ../ca/ca.crt -CAkey ../ca/ca.key #把客户端证书格式转为浏览器可识别的p12格式 openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 #把客户端证书格式转为jks格式 keytool -importkeystore -srckeystore client.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore client.jks
- 上传自签名证书,具体操作请参见创建证书。
创建独享型负载均衡器
- 登录弹性负载均衡管理控制台。
- 参考创建独享型负载均衡器,创建独享型负载均衡器。CSS集群对接独享型负载均衡器所需要关注的参数如表3所示,其他参数请根据实际需要填写。
表3 独享型负载均衡器的配置说明 参数
配置说明
取值样例
实例类型
选择“独享型”。
独享型
计费模式
性能独享型负载均衡器的收费类型。
按需计费
区域
选择CSS集群所在的区域。
-
跨VPC后端
开启跨VPC后端才能连接CSS集群。
开启
网络类型
负载均衡器对外提供服务所使用的网络类型。
CSS服务支持“IPv4私网”和“IPv6网络”。
- 当选择“IPv6网络”时,CSS服务对接负载均衡器后,集群对接的负载均衡实例会显示“私有IP”和“IPv6地址”。只有当独享型负载均衡器绑定了“共享带宽”,才会显示“公网IP”。
- 当选择“IPv4私网”时,CSS服务对接负载均衡器后,集群对接的负载均衡实例会显示“私有IP”和“公网IP”。
说明:
CSS服务仅“华东二”区域支持“IPv6网络”,其他区域只支持“IPv4私网”。
IPv4私网
所属VPC
所属虚拟私有云。无论选择哪种网络类型,均需配置此项。
需要选择和CSS集群同一VPC。
-
子网
选择创建负载均衡实例的子网。无论选择哪种网络类型,均需配置此项。
需要选择和CSS集群同一子网。
-
规格
建议选择功能和性能更优的应用型规格。
应用型(HTTP/HTTPS)
“小型 I”
集群对接负载均衡器
- 登录云搜索服务管理控制台。
- 在“集群管理”页面选择需要对接负载均衡器的集群,单击集群名称进入集群“基本信息”页面。
- 在左侧菜单栏,选择“负载均衡”,打开负载均衡开关,在弹窗中配置负载均衡基础信息。
表4 配置负载均衡 参数
说明
负载均衡器
选择前面创建的独享型负载均衡器。CSS集群属于托管资源,所选的负载均衡器必须开启“跨VPC后端”能力才能正常使用。
委托
选择IAM委托,当前账号授权CSS服务访问和使用ELB资源。
- 当首次配置委托时,可以单击“自动创建委托”新建委托“css-elb-agency”直接使用。
- 当已有自动创建的委托时,可以单击“委托一键授权”,自动删除委托中“ELB Administrator”系统角色或“ELB FullAccess”系统策略的权限,并自动新增如下自定义策略授权委托到最小化权限。
"elb:loadbalancers:list", "elb:loadbalancers:get", "elb:certificates:list", "elb:healthmonitors:*", "elb:members:*", "elb:pools:*", "elb:listeners:*"
- 执行“自动创建委托”和“委托一键授权”的用户需要如下最小权限。
"iam:agencies:listAgencies", "iam:roles:listRoles", "iam:agencies:getAgency", "iam:agencies:createAgency", "iam:permissions:listRolesForAgency", "iam:permissions:grantRoleToAgency", "iam:permissions:listRolesForAgencyOnProject", "iam:permissions:revokeRoleFromAgency", "iam:roles:createRole"
- 使用委托的用户需要如下最小权限。
"iam:agencies:listAgencies", "iam:agencies:getAgency", "iam:permissions:listRolesForAgencyOnProject", "iam:permissions:listRolesForAgency"
图1 开启负载均衡 - 单击“确定”,开启负载均衡。
- 在“监听器配置”区域,您可以单击右侧
配置监听器的相关信息。
表5 配置监听器 参数
配置说明
前端协议
客户端与负载均衡监听器建立流量分发连接的协议。支持选择“HTTP”或“HTTPS”。
根据实际业务需要选择协议。
前端端口
客户端与负载均衡监听器建立流量分发连接的端口。
根据实际业务需要自定义。
SSL解析方式
客户端到服务器端认证方式。仅“前端协议”选择“HTTPS”才需要配置。
根据实际业务需要选择解析方式。
服务器证书
服务器证书用于SSL握手协商,需提供证书内容和私钥。仅“前端协议”选择“HTTPS”才需要配置服务器证书。
选择准备并上传自签名证书创建的服务器证书。
CA证书
CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者。仅“SSL解析方式”选择“双向认证”时,才需要配置CA证书。
选择准备并上传自签名证书创建的CA证书。
在开启HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,HTTPS连接才能成功。
图2 配置监听器 - (可选)在监听器配置区域,单击“访问控制”后的“设置”跳转到负载均衡器的监听器列表,单击监听器访问控制列的“设置”,配置允许通过负载均衡实例访问集群的IP地址组,不设置的话默认允许所有的IP地址访问。
- 在健康检查区域,您可以查看各个节点IP的健康检查结果。
表6 健康检查结果状态说明 健康检查结果
说明
正常
节点IP连接正常。
异常
节点IP连接,不可用
通过Curl命令接入集群
- 在云搜索服务管理控制台,单击左侧导航栏的“集群管理”。
- 在集群管理列表页面,单击需要访问的集群名称,进入集群基本信息页面。
- 在左侧菜单栏选择“负载均衡”,获取并记录负载均衡实例的“私有IP”、“IPv6地址”或“公网IP”,以及监听器配置的“前端协议/端口”。
说明:
如果ELB绑定了公网,则不推荐接入非安全模式的集群。非安全模式的集群使用HTTP通信且不需要安全认证即可访问,如果对接公网访问存在安全风险。
- 在ECS服务器中执行如下Curl命令测试能否通过独享型负载均衡实例接入集群。
表7 不同集群的接入命令 集群安全模式
ELB最终对外提供的服务形态
接入集群的Curl命令
非安全
无认证
curl http://IP:port
单向认证
curl -k --cert ./client.crt --key ./client.key https://IP:port
双向认证
curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:port
安全+HTTP
密码认证
curl http://IP:port -u user:pwd
单向认证+密码认证
curl -k --cert ./client.crt --key ./client.key https://IP:port -u user:pwd
双向认证+密码认证
curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:port -u user:pwd
安全+HTTPS
单向认证+密码认证
curl -k --cert ./client.crt --key ./client.key https://IP:port -u user:pwd
双向认证+密码认证
curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://IP:port -u user:pwd
表8 变量说明 变量名
说明
IP
负载均衡实例的IP地址。
port
监听器配置的“前端协议/端口”。
user
集群的用户名,仅安全集群需要配置。
pwd
用户名对应的密码,仅安全集群需要配置。
当可以正常返回集群信息时,表示连接成功。
ESSecuredClientWithCerDemo代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
import org.apache.commons.io.IOUtils; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.HttpHost; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyStore; import java.security.SecureRandom; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManagerFactory; public class ESSecuredClientWithCerDemo { private static final String KEY_STORE_PWD = ""; private static final String TRUST_KEY_STORE_PWD = ""; private static final String CA_JKS_PATH = "ca.jks"; private static final String CLIENT_JKS_PATH = "client.jks"; private static final String ELB_ADDRESS = "127.0.0.1"; private static final int ELB_PORT = 9200; private static final String CSS_USERNAME = "user"; private static final String CSS_PWD = ""; public static void main(String[] args) { // 建立客户端 RestHighLevelClient client = initESClient(ELB_ADDRESS, CSS_USERNAME, CSS_PWD); try { // 查询 match_all,相当于 {\"query\": {\"match_all\": {}}} SearchRequest searchRequest = new SearchRequest(); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(QueryBuilders.matchAllQuery()); searchRequest.source(searchSourceBuilder); // query SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println("query result: " + searchResponse.toString()); SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); } System.out.println("query success"); Thread.sleep(2000L); } catch (InterruptedException | IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(client); } } private static RestHighLevelClient initESClient(String clusterAddress, String userName, String password) { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); SSLContext ctx = null; try { KeyStore ks = getKeyStore(CLIENT_JKS_PATH, KEY_STORE_PWD, "JKS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); kmf.init(ks, KEY_STORE_PWD.toCharArray()); KeyStore tks = getKeyStore(CA_JKS_PATH, TRUST_KEY_STORE_PWD, "JKS"); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); tmf.init(tks); ctx = SSLContext.getInstance("SSL", "SunJSSE"); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), new SecureRandom()); } catch (Exception e) { e.printStackTrace(); } SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(ctx, new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }); SecuredHttpClientConfigCallback httpClientConfigCallback = new SecuredHttpClientConfigCallback(sessionStrategy, credentialsProvider); RestClientBuilder builder = RestClient.builder(new HttpHost(clusterAddress, ELB_PORT, "https")) .setHttpClientConfigCallback(httpClientConfigCallback); RestHighLevelClient client = new RestHighLevelClient(builder); return client; } private static KeyStore getKeyStore(String path, String pwd, String type) { KeyStore keyStore = null; FileInputStream is = null; try { is = new FileInputStream(path); keyStore = KeyStore.getInstance(type); keyStore.load(is, pwd.toCharArray()); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(is); } return keyStore; } } |
SecuredHttpClientConfigCallback代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.common.Nullable; import java.util.Objects; class SecuredHttpClientConfigCallback implements RestClientBuilder.HttpClientConfigCallback { @Nullable private final CredentialsProvider credentialsProvider; /** * The {@link SSLIOSessionStrategy} for all requests to enable SSL / TLS encryption. */ private final SSLIOSessionStrategy sslStrategy; /** * Create a new {@link SecuredHttpClientConfigCallback}. * * @param credentialsProvider The credential provider, if a username/password have been supplied * @param sslStrategy The SSL strategy, if SSL / TLS have been supplied * @throws NullPointerException if {@code sslStrategy} is {@code null} */ SecuredHttpClientConfigCallback(final SSLIOSessionStrategy sslStrategy, @Nullable final CredentialsProvider credentialsProvider) { this.sslStrategy = Objects.requireNonNull(sslStrategy); this.credentialsProvider = credentialsProvider; } /** * Get the {@link CredentialsProvider} that will be added to the HTTP client. * * @return Can be {@code null}. */ @Nullable CredentialsProvider getCredentialsProvider() { return credentialsProvider; } /** * Get the {@link SSLIOSessionStrategy} that will be added to the HTTP client. * * @return Never {@code null}. */ SSLIOSessionStrategy getSSLStrategy() { return sslStrategy; } /** * Sets the {@linkplain HttpAsyncClientBuilder#setDefaultCredentialsProvider(CredentialsProvider) credential provider}, * * @param httpClientBuilder The client to configure. * @return Always {@code httpClientBuilder}. */ @Override public HttpAsyncClientBuilder customizeHttpClient(final HttpAsyncClientBuilder httpClientBuilder) { // enable SSL / TLS httpClientBuilder.setSSLStrategy(sslStrategy); // enable user authentication if (credentialsProvider != null) { httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); } return httpClientBuilder; } } |
pom.xml代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>1</groupId> <artifactId>ESClient</artifactId> <version>1.0-SNAPSHOT</version> <name>ESClient</name> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <elasticsearch.version>7.10.2</elasticsearch.version> </properties> <dependencies> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> </dependencies> </project> |