diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/db/DBInitialize.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/db/DBInitialize.java index ea8823e9..7d8ac075 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/db/DBInitialize.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/db/DBInitialize.java @@ -64,8 +64,7 @@ public class DBInitialize implements EventListener { @Override public void onEvent(AppLoadEndEvent appLoadEndEvent) throws Throwable { - // TODO 该事件有50%的概率不触发 - System.out.println("11"); + } /** diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/proxy/ProxyConfig.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/proxy/ProxyConfig.java index 7603addf..0ec22f42 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/proxy/ProxyConfig.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/base/proxy/ProxyConfig.java @@ -47,6 +47,8 @@ public class ProxyConfig { private String domainName; private Integer httpProxyPort; private Integer httpsProxyPort; + private String keyStorePassword; + private String jksPath; } @Data diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpProxy.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpProxy.java index bb0f5668..fbbe4e05 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpProxy.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpProxy.java @@ -2,28 +2,17 @@ package org.dromara.neutrinoproxy.server.proxy.core; import cn.hutool.core.util.StrUtil; import io.netty.bootstrap.ServerBootstrap; -import io.netty.buffer.ByteBuf; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.dromara.neutrinoproxy.core.Constants; -import org.dromara.neutrinoproxy.core.ProxyMessage; import org.dromara.neutrinoproxy.server.base.proxy.ProxyConfig; -import org.dromara.neutrinoproxy.server.proxy.domain.ProxyAttachment; -import org.dromara.neutrinoproxy.server.proxy.domain.VisitorChannelAttachInfo; -import org.dromara.neutrinoproxy.server.service.FlowReportService; -import org.dromara.neutrinoproxy.server.util.ProxyUtil; -import org.noear.solon.Solon; import org.noear.solon.annotation.Component; import org.noear.solon.annotation.Inject; import org.noear.solon.core.event.AppLoadEndEvent; import org.noear.solon.core.event.EventListener; -import java.net.InetSocketAddress; - /** * @author: aoshiguchen * @date: 2023/4/2 @@ -54,7 +43,7 @@ public class HttpProxy implements EventListener { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addFirst(new BytesMetricsHandler()); - ch.pipeline().addLast(new VisitorChannelHandler()); + ch.pipeline().addLast(new HttpVisitorChannelHandler(proxyConfig.getServer().getDomainName())); } }); bootstrap.bind("0.0.0.0", proxyConfig.getServer().getHttpProxyPort()).sync(); @@ -63,142 +52,4 @@ public class HttpProxy implements EventListener { log.error("http proxy start err!", e); } } - - private class VisitorChannelHandler extends SimpleChannelInboundHandler { - - @Override - protected void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) throws Exception { - if (StrUtil.isBlank(proxyConfig.getServer().getDomainName())) { - ctx.channel().close(); - return; - } - - byte[] bytes = new byte[byteBuf.readableBytes()]; - byteBuf.readBytes(bytes); - byteBuf.resetReaderIndex(); - ProxyAttachment proxyAttachment = new ProxyAttachment(ctx.channel(), bytes, (channel, buf) -> { - Channel proxyChannel = channel.attr(Constants.NEXT_CHANNEL).get(); - if (null == proxyChannel) { - // 该端口还没有代理客户端 - ctx.channel().close(); - return; - } - - proxyChannel.writeAndFlush(ProxyMessage.buildTransferMessage(ProxyUtil.getVisitorIdByChannel(channel), bytes)); - - // 增加流量计数 - VisitorChannelAttachInfo visitorChannelAttachInfo = ProxyUtil.getAttachInfo(channel); - Solon.context().getBean(FlowReportService.class).addWriteByte(visitorChannelAttachInfo.getLicenseId(), bytes.length); - }); - - String visitorId = ProxyUtil.getVisitorIdByChannel(ctx.channel()); - if (StringUtils.isNotBlank(visitorId)) { - proxyAttachment.execute(); - return; - } - - // 用户连接到代理服务器时,设置用户连接不可读,等待代理后端服务器连接成功后再改变为可读状态 - ctx.channel().config().setOption(ChannelOption.AUTO_READ, false); - - String host = getHost(bytes); - if (StringUtils.isBlank(host)) { - ctx.channel().close(); - return; - } - log.debug("HttpProxy host: {}", host); - if (!host.endsWith(proxyConfig.getServer().getDomainName())) { - ctx.channel().close(); - return; - } - int index = host.lastIndexOf("." + proxyConfig.getServer().getDomainName()); - String subdomain = host.substring(0, index); - - // 根据域名拿到绑定的映射对应的cmdChannel - Integer serverPort = ProxyUtil.getServerPortBySubdomain(subdomain); - if (null == serverPort) { - ctx.channel().close(); - return; - } - Channel cmdChannel = ProxyUtil.getCmdChannelByServerPort(serverPort); - if (null == cmdChannel) { - ctx.channel().close(); - return; - } - String lanInfo = ProxyUtil.getClientLanInfoByServerPort(serverPort); - if (StringUtils.isBlank(lanInfo)) { - ctx.channel().close(); - return; - } - - visitorId = ProxyUtil.newVisitorId(); - ProxyUtil.addVisitorChannelToCmdChannel(cmdChannel, visitorId, ctx.channel(), serverPort); - ProxyUtil.addProxyConnectAttachment(visitorId, proxyAttachment); - cmdChannel.writeAndFlush(ProxyMessage.buildConnectMessage(visitorId).setData(lanInfo.getBytes())); - } - - @Override - public void channelInactive(ChannelHandlerContext ctx) throws Exception { - - // 通知代理客户端 - Channel visitorChannel = ctx.channel(); - InetSocketAddress sa = (InetSocketAddress) visitorChannel.localAddress(); - Channel cmdChannel = ProxyUtil.getCmdChannelByServerPort(sa.getPort()); - - if (cmdChannel == null) { - // 该端口还没有代理客户端 - ctx.channel().close(); - } else { - - // 用户连接断开,从控制连接中移除 - String visitorId = ProxyUtil.getVisitorIdByChannel(visitorChannel); - ProxyUtil.removeVisitorChannelFromCmdChannel(cmdChannel, visitorId); - - // 删除代理附加对象 - ProxyUtil.remoteProxyConnectAttachment(visitorId); - - Channel proxyChannel = visitorChannel.attr(Constants.NEXT_CHANNEL).get(); - if (proxyChannel != null && proxyChannel.isActive()) { - proxyChannel.attr(Constants.NEXT_CHANNEL).remove(); - proxyChannel.attr(Constants.LICENSE_ID).remove(); - proxyChannel.attr(Constants.VISITOR_ID).remove(); - - proxyChannel.config().setOption(ChannelOption.AUTO_READ, true); - // 通知客户端,用户连接已经断开 - proxyChannel.writeAndFlush(ProxyMessage.buildDisconnectMessage(visitorId)); - } - } - - super.channelInactive(ctx); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - // 当出现异常就关闭连接 - ctx.close(); - } - - private String getHost(byte[] buf) { - String req = new String(buf); - String[] lines = req.split("\r\n"); - String firstLine = lines[0]; - if (!(firstLine.endsWith("HTTP/1.1") || firstLine.endsWith("HTTP/1.0"))) { - return null; - } - for (int i = 1; i < lines.length; i++) { - String line = lines[i]; - if (!line.startsWith("Host: ")) { - continue; - } - // 域名 - String domain = line.substring(6); - return domain; - } - return null; - } - } } diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpVisitorChannelHandler.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpVisitorChannelHandler.java new file mode 100644 index 00000000..adf00073 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpVisitorChannelHandler.java @@ -0,0 +1,170 @@ +package org.dromara.neutrinoproxy.server.proxy.core; + +import cn.hutool.core.util.StrUtil; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOption; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.dromara.neutrinoproxy.core.Constants; +import org.dromara.neutrinoproxy.core.ProxyMessage; +import org.dromara.neutrinoproxy.server.proxy.domain.ProxyAttachment; +import org.dromara.neutrinoproxy.server.proxy.domain.VisitorChannelAttachInfo; +import org.dromara.neutrinoproxy.server.service.FlowReportService; +import org.dromara.neutrinoproxy.server.util.ProxyUtil; +import org.noear.solon.Solon; + +import java.net.InetSocketAddress; + +/** + * @author: aoshiguchen + * @date: 2023/5/27 + */ +@Slf4j +public class HttpVisitorChannelHandler extends SimpleChannelInboundHandler { + /** + * 域名 + */ + private String domainName; + + public HttpVisitorChannelHandler(String domainName) { + this.domainName = domainName; + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf byteBuf) throws Exception { + if (StrUtil.isBlank(domainName)) { + ctx.channel().close(); + return; + } + + byte[] bytes = new byte[byteBuf.readableBytes()]; + byteBuf.readBytes(bytes); + byteBuf.resetReaderIndex(); + ProxyAttachment proxyAttachment = new ProxyAttachment(ctx.channel(), bytes, (channel, buf) -> { + Channel proxyChannel = channel.attr(Constants.NEXT_CHANNEL).get(); + if (null == proxyChannel) { + // 该端口还没有代理客户端 + ctx.channel().close(); + return; + } + + proxyChannel.writeAndFlush(ProxyMessage.buildTransferMessage(ProxyUtil.getVisitorIdByChannel(channel), bytes)); + + // 增加流量计数 + VisitorChannelAttachInfo visitorChannelAttachInfo = ProxyUtil.getAttachInfo(channel); + Solon.context().getBean(FlowReportService.class).addWriteByte(visitorChannelAttachInfo.getLicenseId(), bytes.length); + }); + + String visitorId = ProxyUtil.getVisitorIdByChannel(ctx.channel()); + if (StringUtils.isNotBlank(visitorId)) { + proxyAttachment.execute(); + return; + } + + // 用户连接到代理服务器时,设置用户连接不可读,等待代理后端服务器连接成功后再改变为可读状态 + ctx.channel().config().setOption(ChannelOption.AUTO_READ, false); + + String host = getHost(bytes); + if (StringUtils.isBlank(host)) { + ctx.channel().close(); + return; + } + log.debug("HttpProxy host: {}", host); + if (!host.endsWith(domainName)) { + ctx.channel().close(); + return; + } + int index = host.lastIndexOf("." + domainName); + String subdomain = host.substring(0, index); + + // 根据域名拿到绑定的映射对应的cmdChannel + Integer serverPort = ProxyUtil.getServerPortBySubdomain(subdomain); + if (null == serverPort) { + ctx.channel().close(); + return; + } + Channel cmdChannel = ProxyUtil.getCmdChannelByServerPort(serverPort); + if (null == cmdChannel) { + ctx.channel().close(); + return; + } + String lanInfo = ProxyUtil.getClientLanInfoByServerPort(serverPort); + if (StringUtils.isBlank(lanInfo)) { + ctx.channel().close(); + return; + } + + visitorId = ProxyUtil.newVisitorId(); + ProxyUtil.addVisitorChannelToCmdChannel(cmdChannel, visitorId, ctx.channel(), serverPort); + ProxyUtil.addProxyConnectAttachment(visitorId, proxyAttachment); + cmdChannel.writeAndFlush(ProxyMessage.buildConnectMessage(visitorId).setData(lanInfo.getBytes())); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + + // 通知代理客户端 + Channel visitorChannel = ctx.channel(); + InetSocketAddress sa = (InetSocketAddress) visitorChannel.localAddress(); + Channel cmdChannel = ProxyUtil.getCmdChannelByServerPort(sa.getPort()); + + if (cmdChannel == null) { + // 该端口还没有代理客户端 + ctx.channel().close(); + } else { + + // 用户连接断开,从控制连接中移除 + String visitorId = ProxyUtil.getVisitorIdByChannel(visitorChannel); + ProxyUtil.removeVisitorChannelFromCmdChannel(cmdChannel, visitorId); + + // 删除代理附加对象 + ProxyUtil.remoteProxyConnectAttachment(visitorId); + + Channel proxyChannel = visitorChannel.attr(Constants.NEXT_CHANNEL).get(); + if (proxyChannel != null && proxyChannel.isActive()) { + proxyChannel.attr(Constants.NEXT_CHANNEL).remove(); + proxyChannel.attr(Constants.LICENSE_ID).remove(); + proxyChannel.attr(Constants.VISITOR_ID).remove(); + + proxyChannel.config().setOption(ChannelOption.AUTO_READ, true); + // 通知客户端,用户连接已经断开 + proxyChannel.writeAndFlush(ProxyMessage.buildDisconnectMessage(visitorId)); + } + } + + super.channelInactive(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + // 当出现异常就关闭连接 + ctx.close(); + } + + private String getHost(byte[] buf) { + String req = new String(buf); + String[] lines = req.split("\r\n"); + String firstLine = lines[0]; + if (!(firstLine.endsWith("HTTP/1.1") || firstLine.endsWith("HTTP/1.0"))) { + return null; + } + for (int i = 1; i < lines.length; i++) { + String line = lines[i]; + if (!line.startsWith("Host: ")) { + continue; + } + // 域名 + String domain = line.substring(6); + return domain; + } + return null; + } +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpsProxy.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpsProxy.java new file mode 100644 index 00000000..bfac3abb --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/HttpsProxy.java @@ -0,0 +1,89 @@ +package org.dromara.neutrinoproxy.server.proxy.core; + +import cn.hutool.core.util.StrUtil; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.ssl.SslHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.dromara.neutrinoproxy.core.util.FileUtil; +import org.dromara.neutrinoproxy.server.base.proxy.ProxyConfig; +import org.noear.solon.annotation.Component; +import org.noear.solon.annotation.Inject; +import org.noear.solon.core.event.AppLoadEndEvent; +import org.noear.solon.core.event.EventListener; + +import javax.net.ssl.*; +import java.io.InputStream; +import java.security.KeyStore; + +/** + * @author: aoshiguchen + * @date: 2023/4/2 + */ +@Slf4j +@Component +public class HttpsProxy implements EventListener { + @Inject("serverBossGroup") + private NioEventLoopGroup serverBossGroup; + @Inject("serverWorkerGroup") + private NioEventLoopGroup serverWorkerGroup; + @Inject + private ProxyConfig proxyConfig; + @Override + public void onEvent(AppLoadEndEvent appLoadEndEvent) throws Throwable { + if (StrUtil.isBlank(proxyConfig.getServer().getDomainName()) || null == proxyConfig.getServer().getHttpsProxyPort() || + StringUtils.isEmpty(proxyConfig.getServer().getJksPath()) || StringUtils.isEmpty(proxyConfig.getServer().getKeyStorePassword())) { + log.info("no config domain name,nonsupport https proxy."); + return; + } + this.start(); + } + + private void start() { + try { + ServerBootstrap bootstrap = new ServerBootstrap(); + bootstrap.group(serverBossGroup, serverWorkerGroup) + .channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(createSslHandler()); + ch.pipeline().addFirst(new BytesMetricsHandler()); + ch.pipeline().addLast(new HttpVisitorChannelHandler(proxyConfig.getServer().getDomainName())); + } + }); + bootstrap.bind("0.0.0.0", proxyConfig.getServer().getHttpsProxyPort()).sync(); + log.info("Https代理服务启动成功!"); + } catch (Exception e) { + log.error("https proxy start err!", e); + } + } + + private ChannelHandler createSslHandler() { + try { + InputStream jksInputStream = FileUtil.getInputStream(proxyConfig.getServer().getJksPath()); + SSLContext serverContext = SSLContext.getInstance("TLS"); + final KeyStore ks = KeyStore.getInstance("JKS"); + + ks.load(jksInputStream, proxyConfig.getServer().getKeyStorePassword().toCharArray()); + final KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(ks, proxyConfig.getServer().getKeyStorePassword().toCharArray()); + TrustManager[] trustManagers = null; + + serverContext.init(kmf.getKeyManagers(), trustManagers, null); + + SSLEngine sslEngine = serverContext.createSSLEngine(); + sslEngine.setUseClientMode(false); + sslEngine.setNeedClientAuth(false); + + return new SslHandler(sslEngine); + } catch (Exception e) { + log.error("创建SSL处理器失败", e); + e.printStackTrace(); + } + return null; + } +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/VisitorChannelHandler.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/TcpVisitorChannelHandler.java similarity index 97% rename from neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/VisitorChannelHandler.java rename to neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/TcpVisitorChannelHandler.java index 87648f83..0c52037c 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/VisitorChannelHandler.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/proxy/core/TcpVisitorChannelHandler.java @@ -4,7 +4,6 @@ import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.dromara.neutrinoproxy.core.Constants; import org.dromara.neutrinoproxy.core.ProxyMessage; -import org.dromara.neutrinoproxy.server.proxy.domain.ProxyAttachment; import org.dromara.neutrinoproxy.server.proxy.domain.VisitorChannelAttachInfo; import org.dromara.neutrinoproxy.server.service.FlowReportService; import org.dromara.neutrinoproxy.server.util.ProxyUtil; @@ -23,7 +22,7 @@ import java.net.InetSocketAddress; * @date: 2022/6/16 */ @Slf4j -public class VisitorChannelHandler extends SimpleChannelInboundHandler { +public class TcpVisitorChannelHandler extends SimpleChannelInboundHandler { @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/ProtocalService.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/ProtocalService.java index cf966e1e..c9552190 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/ProtocalService.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/ProtocalService.java @@ -2,6 +2,7 @@ package org.dromara.neutrinoproxy.server.service; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; +import org.dromara.neutrinoproxy.server.constant.NetworkProtocolEnum; import org.dromara.neutrinoproxy.server.controller.res.system.ProtocalListRes; import org.noear.solon.annotation.Component; @@ -22,7 +23,7 @@ public class ProtocalService { public List list() { return Lists.newArrayList( new ProtocalListRes().setName("TCP").setEnable(Boolean.TRUE).setRemark("支持一切TCP之上的协议"), - new ProtocalListRes().setName("HTTP").setEnable(Boolean.TRUE).setRemark("支持绑定子域名,未绑定时等价于时使用TCP"), + new ProtocalListRes().setName("HTTP(S)").setEnable(Boolean.TRUE).setRemark("支持绑定子域名,未绑定时等价于时使用TCP。 若配置了证书,则同时支持HTTPS。"), new ProtocalListRes().setName("UDP").setEnable(Boolean.FALSE).setRemark("暂不支持") ); } diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/VisitorChannelService.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/VisitorChannelService.java index 07324151..6eb7c5aa 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/VisitorChannelService.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/VisitorChannelService.java @@ -14,7 +14,7 @@ import org.dromara.neutrinoproxy.server.dal.entity.PortMappingDO; import org.dromara.neutrinoproxy.server.dal.entity.PortPoolDO; import org.dromara.neutrinoproxy.server.dal.entity.UserDO; import org.dromara.neutrinoproxy.server.proxy.core.BytesMetricsHandler; -import org.dromara.neutrinoproxy.server.proxy.core.VisitorChannelHandler; +import org.dromara.neutrinoproxy.server.proxy.core.TcpVisitorChannelHandler; import org.dromara.neutrinoproxy.server.proxy.domain.CmdChannelAttachInfo; import org.dromara.neutrinoproxy.server.proxy.domain.ProxyMapping; import org.dromara.neutrinoproxy.server.util.ProxyUtil; @@ -224,7 +224,7 @@ public class VisitorChannelService { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addFirst(new BytesMetricsHandler()); - ch.pipeline().addLast(new VisitorChannelHandler()); + ch.pipeline().addLast(new TcpVisitorChannelHandler()); } }); diff --git a/neutrino-proxy-server/src/main/resources/app.yml b/neutrino-proxy-server/src/main/resources/app.yml index 490347c2..76a68f1d 100644 --- a/neutrino-proxy-server/src/main/resources/app.yml +++ b/neutrino-proxy-server/src/main/resources/app.yml @@ -27,6 +27,8 @@ neutrino: https-proxy-port: ${HTTPS_PROXY_PORT:443} # 如果不配置,则不支持域名映射 domain-name: ${DOMAIN_NAME:} + key-store-password: ${HTTPS_STORE_PASS:} + jks-path: ${HTTPS_JKS_PATH:} data: db: type: ${DB_TYPE:sqlite}