在Netty中支持https服务器

@Override
public void run() {
	// 端口是否已经被占用
	if (!NetUtil.localPortAbled(port)) {
		LOG.error("LoginServer端口[{}]已被占用", port);
		System.exit(0);
	}

	try {
		ServerBootstrap b = new ServerBootstrap().option(ChannelOption.SO_BACKLOG, 1024);
		b.group(accepterGroup, workGroup).childHandler(new ChannelInitializer<SocketChannel>() {
			@Override
			protected void initChannel(SocketChannel ch) throws Exception {
				ChannelPipeline pipeline = ch.pipeline();
				// =====================以下为SSL处理代码=================================
				LOG.error("开始设置https服务");
				SSLContext sslcontext = SSLContext.getInstance("TLS");
				KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
				KeyStore ks = KeyStore.getInstance("PKCS12");
				String keyStorePath = "config/dsmy.pfx";
				String keyPassword = "dsmy@123456$";
				ks.load(new FileInputStream(keyStorePath), keyPassword.toCharArray());
				kmf.init(ks, keyPassword.toCharArray());
				sslcontext.init(kmf.getKeyManagers(), null, null);
				SSLEngine engine = sslcontext.createSSLEngine();
				engine.setUseClientMode(false);
				engine.setNeedClientAuth(false);
				pipeline.addFirst("ssl", new SslHandler(engine));
				// =====================以上为SSL处理代码=================================
				pipeline.addLast(new HttpServerCodec());
				pipeline.addLast(new HttpObjectAggregator(65536));
				pipeline.addLast(new HttpContentCompressor(1));
				pipeline.addLast(handler);
			}
		}).channel(NioServerSocketChannel.class);

		Channel ch = b.bind(port).sync().channel();
		LOG.info("监听Http端口[{}]成功", port);
		ch.closeFuture().sync();
	} catch (Exception e) {
		LOG.error("HttpServer启动异常", e);
		System.exit(1);
	} finally {
		accepterGroup.shutdownGracefully();
		workGroup.shutdownGracefully();
	}
}

猜你喜欢

转载自justdo2008.iteye.com/blog/2393172