elasticsearch 将HTTP请求重定向到netty中的HTTPS
我正在修改elasticsearch代码,以便在不使用x-pack和反向代理的情况下配置HTTPS。 我修改了netty4HttpServerTransport文件中的initchannel()方法,https工作正常,但我想将http重定向到https。。 代码是elasticsearch 将HTTP请求重定向到netty中的HTTPS,elasticsearch,netty,elasticsearch,Netty,我正在修改elasticsearch代码,以便在不使用x-pack和反向代理的情况下配置HTTPS。 我修改了netty4HttpServerTransport文件中的initchannel()方法,https工作正常,但我想将http重定向到https。。 代码是 char[] password = "your5663".toCharArray(); KeyStore ks = KeyStore.getInstance("JKS"); ks.load(new F
char[] password = "your5663".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("C:/OpenSSL-Win64/bin/keystore1.jks"),password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
TrustManager[] tm = tmf.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
sslContext .init( kmf.getKeyManagers(), tm, null);
SSLEngine sslengine = sslContext .createSSLEngine();
sslengine.setUseClientMode(false);
String[] DEFAULT_PROTOCOLS = { "TLSv1", "TLSv1.1", "TLSv1.2","TLSv1.3" };
String[] DEFAULT_CIPHERS = {"TLS_RSA_WITH_AES_128_CBC_SHA256", "TLS_RSA_WITH_AES_128_CBC_SHA"};
sslengine.setEnabledProtocols(DEFAULT_PROTOCOLS);
sslengine.setEnabledCipherSuites(DEFAULT_CIPHERS);
SslHandler sslHandler = new SslHandler(sslengine);
ch.pipeline().addLast("ssl", sslHandler);
ch.pipeline().addAfter("ssl","handshake",new StringEventHandler());
在这段代码中,如何使http到https重定向。重定向在有效负载(http)级别工作,而不是ssl传输级别。您需要同时在协议(http和https)和http通道上侦听,您可以使用重定向状态代码进行响应。长话短说——在代码中没有直接的位置可以做到这一点 此任务通常使用代理服务器。我不确定您是否可以在elasticsearch中执行此操作,您可以尝试配置一个过滤器servlet来检查协议是否响应重定向。这可能会有帮助
另一个事实——如果重定向是针对服务客户端(而不是基于浏览器的UI),则客户端可能/将考虑重定向响应和错误响应。取决于您的环境-也许您可以公开ssl端点(无重定向),客户端将必须遵守重定向工作在有效负载(http)级别,而不是ssl传输级别。您需要同时在协议(http和https)和http通道上侦听,您可以使用重定向状态代码进行响应。长话短说——在代码中没有直接的位置可以做到这一点
此任务通常使用代理服务器。我不确定您是否可以在elasticsearch中执行此操作,您可以尝试配置一个过滤器servlet来检查协议是否响应重定向。这可能会有帮助另一个事实——如果重定向是针对服务客户端(而不是基于浏览器的UI),则客户端可能/将考虑重定向响应和错误响应。取决于您的环境-也许您可以只公开ssl端点(无重定向),客户端必须遵守
Netty为此提供了内置处理程序 您将其放在管道的前端,它会检测消息是否加密。如果是,则消息将发送到正常的SSL管道,如果不是,则可以指定其他地方发送消息,例如,到301重定向到https 您可以使用这个Netty版本,也可以创建自己的处理程序来执行类似的操作 但是,要使用Netty版本,您需要稍微重构以生成NettySslContextio.Netty.handler.ssl.SslContext
,而不是SSLEngine
大概是这样的:
char[] password = "your5663".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("C:/OpenSSL-Win64/bin/keystore1.jks"),password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
SslContext sslContext = SslContextBuilder.forServer(keyManagerFactory).build();
ch.pipeline().addLast("ssl", sslHandler);
// this is an imaginary handler you create that sends HTTP a 301 to HTTPS
// non-SSL can be detected easily because there is no SslHandler on this channel
ch.pipeline().addLast("redirectHandler", new RedirectHandler());
ch.pipeline().addLast("handshake",new StringEventHandler());
Netty对此有一个内置的处理程序 您将其放在管道的前端,它会检测消息是否加密。如果是,则消息将发送到正常的SSL管道,如果不是,则可以指定其他地方发送消息,例如,到301重定向到https 您可以使用这个Netty版本,也可以创建自己的处理程序来执行类似的操作 但是,要使用Netty版本,您需要稍微重构以生成NettySslContext
io.Netty.handler.ssl.SslContext
,而不是SSLEngine
大概是这样的:
char[] password = "your5663".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("C:/OpenSSL-Win64/bin/keystore1.jks"),password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
SslContext sslContext = SslContextBuilder.forServer(keyManagerFactory).build();
ch.pipeline().addLast("ssl", sslHandler);
// this is an imaginary handler you create that sends HTTP a 301 to HTTPS
// non-SSL can be detected easily because there is no SslHandler on this channel
ch.pipeline().addLast("redirectHandler", new RedirectHandler());
ch.pipeline().addLast("handshake",new StringEventHandler());