提问nginx 如何正确给 Elasticsearch 配置 https 访问

一、基本情况说明

Elasticsearch 7.6.1 和 nginx 使用 docker 安装。

https 访问,使用阿里云的免费证书。

nginx 配置文件中将所有 HTTP 请求通过 rewrite 指令重定向为 HTTPS 访问。

 

二、出现的问题

1)没有给   Elasticsearch  作任何 https 访问配置的情况下

前端使用  Elasticsearch 搜索功能,检索结果准确,服务器 docker  Elasticsearch 容器报以下错误:

{"type": "server", "timestamp": "2024-01-24T10:31:44,051Z", "level": "ERROR", "component": "o.w.a.d.Monitor", "cluster.name": "elasticsearch", "node.name": "d7c3518959ef", "message": "remote_ext_dict javax.net.ssl.SSLPeerUnverifiedException: Host name 'IP地址' does not match the certificate subject provided by the peer (CN=域名) error!", "cluster.uuid": "mCtcfT2QS8O80kUM0RU9Bg", "node.id": "rk0Ld6e3Q52JUY2fAUFCYw"  }

 

2)给 Elasticsearch 配置 https 访问的情况下还是报上面的错误。

我的配置如下:

1、启动 es 容器的命令

docker run –name es2 -p 9200:9200 -p 9300:9300
-e “discovery.type=single-node”
-e ES_JAVA_OPTS=”-Xms2g -Xmx2g”
-v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
-v /opt/nginx/cert/xxxxxx.key:/usr/share/elasticsearch/config/xxxxxx.key
-v /opt/nginx/cert/xxxxxx.pem:/usr/share/elasticsearch/config/xxxxxx.pem
-v /opt/elasticsearch/data:/usr/share/elasticsearch/data
-v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins
–restart=always
-d elasticsearch:7.6.1

 

2、 ES 配置文件 elasticsearch.yml

根据报错提示,将 key 和 pem 配置为 es 容器启动时文件挂载的路径

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.key: /usr/share/elasticsearch/config/xxxxxx.key
xpack.security.transport.ssl.certificate: /usr/share/elasticsearch/config/xxxxxx.pem
xpack.security.transport.ssl.certificate_authorities: [ "/usr/share/elasticsearch/config/xxxxxx.pem"]

 

3、nginx 配置文件(不会正确配置,尝试配置如下)

server {
   listen       80;
   #server_name  localhost;
   server_name  域名;
   rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。

   location / {
       root   html;
       index  index.html index.htm;
   }
}

#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
    listen 443 ssl;
    server_name 域名; 
    root html;
    index index.html index.htm;
    
    ssl_certificate cert/xxxxxx.pem;  # 证书文件的名称。
    ssl_certificate_key cert/xxxxxx.key; # 证书私钥文件的名称。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #表示使用的加密套件的类型。
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
    ssl_prefer_server_ciphers on;

    location / {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header Host $host:$server_port;
       proxy_pass http://IP地址:3000; # 代理到前端服务
       proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;
       proxy_set_header  X-Forwarded-Proto  $scheme;
   }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    error_page   404  /404x.html;
    location = /404x.html {
        root   /usr/share/nginx/html;
    }
}


server {
    listen 9200 ssl;
    server_name 域名; 
    
    ssl_certificate cert/xxxxxx.pem;  # 证书文件的名称。
    ssl_certificate_key cert/xxxxxx.key; #证书私钥文件的名称。
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    #表示使用的加密套件的类型。
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
    ssl_prefer_server_ciphers on;

    location / {
        #proxy_pass http://域名:9200; # 尝试过通过域名代理到 es 端口,报同样的错
        proxy_pass IP 地址:9200; # 代理 es 端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

以上就是我目前的情况。

网搜的方法 Elasticsearch 和 nginx 不是用 docker 安装的,版本不同;https 访问不是用阿里云的,配置不同,所以我一直没能解决这个 bug,望大佬赐教,助我早日解除这个困扰了我许久的问题。

 

请登录后发表评论

    没有回复内容