“怎么开启认证,但不开启 HTTPS?”

答案是:完全可以。
这在技术上称为 “明文传输 + 身份验证”

  • 认证 (Authentication):ES 会检查用户名和密码(或 Token)。
  • 传输 (Transport):密码和数据在网线上传输时是明文的(未加密),容易被抓包窃听。

⚠️ 高危警告:这种配置绝对禁止在公网或不安全的网络环境中使用。因为黑客可以轻易截获您的密码。它仅适用于完全可信的本地回环 (localhost)物理隔离的内网


🛠️ 配置步骤 (以 Elasticsearch 8.x 为例)

在 ES 8.x 中,安全功能默认开启且强制 HTTPS。要实现了“只认证不加密”,您需要显式关闭 SSL

1. 修改 elasticsearch.yml

您需要做两件事:

  1. 确保 xpack.security.enabledtrue (默认就是)。
  2. 显式关闭 HTTP 层的 SSL。
# elasticsearch.yml

# 1. 开启安全功能 (包含认证、授权)
# 8.x 默认就是 true,建议显式写上以示明确
xpack.security.enabled: true

# 2. 【关键】显式关闭 HTTP SSL
# 这样 ES 就会监听 http:// 而不是 https://
xpack.security.http.ssl.enabled: false

# 3. (可选) 如果您集群节点间通信也不想加密,也关掉 Transport SSL
xpack.security.transport.ssl.enabled: false
2. 重启 Elasticsearch
sudo systemctl restart elasticsearch
3. 初始化密码 (如果还没做过)

如果是第一次开启安全功能,需要重置内置用户密码:

bin/elasticsearch-reset-password -u elastic
# 记下输出的密码
4. 验证与使用

现在,ES 监听在 http:// (默认 9200),但访问时需要密码。

使用 Curl 测试:

# 注意:这里是 http:// 不是 https://
# 必须带上 -u 参数提供用户名密码,否则报 401
curl -u elastic:您的密码 http://localhost:9200/_cluster/health
  • 如果去掉 -u:返回 401 Unauthorized (认证生效了)。
  • 如果抓包:可以看到 elastic:您的密码 是明文显示的 (Base64 编码,极易解码)。

Java 客户端配置:

// 1. 不需要配置 SSLContext,不需要加载证书
// 2. 只需要配置基本的用户名密码

CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
    AuthScope.ANY, 
    new UsernamePasswordCredentials("elastic", "您的密码")
);

RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http")) // 注意这里是 "http"
    .setHttpClientConfigCallback(httpClientBuilder -> 
        httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
    );

RestHighLevelClient client = new RestHighLevelClient(builder);

📊 三种安全模式对比

为了严谨,我们总结一下 ES 的三种常见安全配置状态:

模式 配置项 安全性 适用场景 风险
裸奔模式 xpack.security.enabled: false (无认证,无加密) 本地单机开发测试 任何人可删库,数据明文
明文认证模式
(您问的)
xpack.security.enabled: true
http.ssl.enabled: false
(有认证,无加密) 严格隔离的内网、本机调试 密码易被窃听,内网中间人攻击
全副武装模式
(推荐)
xpack.security.enabled: true
http.ssl.enabled: true
(有认证,有加密) 所有生产环境 无明显风险 (需管理证书)

总结

要实现“开启认证但不开启 HTTPS”:

  1. 保持 xpack.security.enabled: true
  2. 设置 xpack.security.http.ssl.enabled: false
  3. 客户端连接时使用 http:// 协议,并携带用户名密码。

再次提醒:除非您非常清楚自己在做什么(例如仅在 localhost 调试),否则请务必开启 HTTPS。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐