netty做服务端支持ssl协议实现websocket的wss协议(客户端为浏览器)

也是在网上查的资料,整理一下相互学习下

第一步:生成SSL证书:

    因为是测试,直接使用jdk自带的keytool工具生成自签名证书(注:自签名证书是不被浏览器认可的,只能用于测试),

    --打开cmd

   --输入命令(复制啊):keytool -genkey -keysize 2048 -validity 365 -keyalg RSA -keypass netty123 -storepass netty123 -keystore wss.jks

第二步:在ChannelPipeline添加SslHandler:

    首先写个工具类:SslUtil配置SSLContext

	public static SSLContext createSSLContext(String type ,String path ,String password) throws Exception {
	    KeyStore ks = KeyStore.getInstance(type); /// "JKS"
	    InputStream ksInputStream = new FileInputStream(path); /// 证书存放地址
	    ks.load(ksInputStream, password.toCharArray());
	 	//KeyManagerFactory充当基于密钥内容源的密钥管理器的工厂。
	    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());//getDefaultAlgorithm:获取默认的 KeyManagerFactory 算法名称。
	    kmf.init(ks, password.toCharArray());
	    //SSLContext的实例表示安全套接字协议的实现,它充当用于安全套接字工厂或 SSLEngine 的工厂。
	    SSLContext sslContext = SSLContext.getInstance("TLS");
	    sslContext.init(kmf.getKeyManagers(), null, null);
	    return sslContext;
	}

添加SslHandler(放在第一个)

        @Override
        public void initChannel(SocketChannel ch) throws Exception {
            SSLContext sslContext = SslUtil.createSSLContext("JKS","D://wss.jks","netty123");
            //SSLEngine 此类允许使用ssl安全套接层协议进行安全通信
            SSLEngine engine = sslContext.createSSLEngine(); 
            engine.setUseClientMode(false); 
            
            ch.pipeline().addLast(new SslHandler(engine));
            ch.pipeline().addLast(new IdleStateHandler(5, 0, 0, TimeUnit.SECONDS));    
            ch.pipeline().addLast("http-codec", new HttpServerCodec());            
            ch.pipeline().addLast("aggregator", new HttpObjectAggregator(65536));  
            ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler());    
            ch.pipeline().addLast(new AcceptorIdleStateTrigger());    
            ch.pipeline().addLast("handler", new WebSocketHandler());            
        }

 JS文件的URL:

var url = "wss://localhost:8000/ws";

第三步:运行

    运行服务端,在浏览器地址栏输入https://localhost:8000/  浏览器会提示这是不安全的连接(浏览器不信任自签名证书,如果有域名可以自己申请一个证书,网上有免费测试版的证书),添加例外信任,再在html页面上右键获得它的本地路径 在浏览器中运行   连接成功

 

源码地址:点击打开链接

参考:http://www.360doc.com/content/17/1228/16/51390869_717156716.shtml

           https://www.cnblogs.com/guogangj/p/5209330.html

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页