netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效

这篇具有很好参考价值的文章主要介绍了netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景:java 微服务包括https访问和websocket访问,当https接口访问ws请求时报错,因为https能访问wss。

申请阿里云免费证书后,搜索各种教程比如nginx配置方式、netty访问证书等。走了不少弯路,终于走通一种。

关键点:1、因为使用了netty,nginx配置wss的方式没有走通。需要将证书放到netty启动的方式启动才可以。

2、网上教程大多数是pkcs12的证书生成方式。但是netty仅仅支持pkcs8 的版本,所以需要生成pkcs12之后再转pkcs8.

一、阿里云申请免费证书

netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效

 二、生成pem、key的证书

1、下载类型Nginx的pem证书

2、下载类型Tomcat的pfx 证书,在jdk的路径下cmd命令生成(也可以直接在文件夹里面)server.key文件,输入命令,密码是同时在一起的pfx-password.txt里面

openssl pkcs12 -in *******.pfx -nocerts -nodes -out server.key

netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效 

 

3、因为netty仅仅支持pkcs8,所以将server.key 通过OpenSSl 生成pkcs8的版本

安装openssl

windows电脑下载已经编译好的openssl
OpenSSL for Windows

或者

OpenSSL官方下载 - 码客
然后将安装路径加到环境变量中

netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效

cmd 命令生成server8.key:

openssl pkcs8 -topk8 -inform PEM -in server.key -outform pem -nocrypt -out server8.key

netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效 

 

三、编写代码

仅仅需要增加两个地方:

1、启动的start方法,增加server8.key和pem文件的读取

全局变量

private SslContext sslContext;//netty 配置ssl证书、WSS地址访问。备注:netty 仅仅使用pkcs8的证书,需要使用openssl转

 将证书放到main/resources下面,则用ClassPathResource读取

//ssl证书配置--放到项目中
ClassPathResource pem = new ClassPathResource("service.sv3d.cn.pem");
ClassPathResource key = new ClassPathResource("server8.key");
this.sslContext = SslContextBuilder.forServer(pem.getInputStream(),key.getInputStream()).build();

 将证书放到外面,方便后期更换,毕竟免费的证书是一年一申请的,用InputStream读取

//ssl证书配置--放到外部
InputStream pemInputStream = new FileInputStream("E:\\zhengshu\\9760642_service.sv3d.cn_nginx\\9760642_service.sv3d.cn.pem"); /// 证书存放地址
InputStream keyInputStream = new FileInputStream("E:\\zhengshu\\9760642_service.sv3d.cn_tomcat\\server8.key"); /// 证书存放地址
this.sslContext = SslContextBuilder.forServer(pemInputStream,keyInputStream).build();

2、initChannel 方法添加ssl的验证

ch.pipeline().addLast(sslContext.newHandler(ch.alloc()));

3、全部代码,仅看修改部分就行,大同小异。

    /**
     * 启动
     * @throws InterruptedException
     */
    private void start() throws InterruptedException {
    	try {
			port = Integer.parseInt(optionService.getByKey(OptionKey.SocketPort.getKey()).getValue());

			String wsFlag = nacosConfigProp.getWsFlag();
			 //ssl证书配置--放到外部
                //InputStream pemInputStream = new FileInputStream("E:\\zhengshu\\9760642_service.sv3d.cn_nginx\\9760642_service.sv3d.cn.pem"); /// 证书存放地址
                //InputStream keyInputStream = new FileInputStream("E:\\zhengshu\\9760642_service.sv3d.cn_tomcat\\server8.key"); /// 证书存放地址
                //this.sslContext = SslContextBuilder.forServer(pemInputStream,keyInputStream).build();
                //ssl证书配置--放到项目中
                ClassPathResource pem = new ClassPathResource("service.sv3d.cn.pem");
                ClassPathResource key = new ClassPathResource("server8.key");
                this.sslContext = SslContextBuilder.forServer(pem.getInputStream(),key.getInputStream()).build();

		} catch (Exception e) {
			e.printStackTrace();
		}
        //数据量上来时设置线程池
        /*bossGroup = new NioEventLoopGroup(2,new DefaultThreadFactory("server1",true));
        workGroup = new NioEventLoopGroup(4,new DefaultThreadFactory("server2",true));*/
    	// 获取Reactor线程池
    	bossGroup = new NioEventLoopGroup();
        workGroup = new NioEventLoopGroup();
        // 服务端启动辅助类,用于设置TCP相关参数
        ServerBootstrap bootstrap = new ServerBootstrap();
        // bossGroup辅助客户端的tcp连接请求, workGroup负责与客户端之前的读写操作,设置为主从线程模型
        bootstrap.group(bossGroup,workGroup);
        //禁用nagle算法
        bootstrap.childOption(ChannelOption.TCP_NODELAY, true); 
       
        //bootstrap.childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024*1024, 40*1024*1024)); 
        
        //当设置为true的时候,TCP会实现监控连接是否有效,当连接处于空闲状态的时候,超过了2个小时,
        //本地的TCP实现会发送一个数据包给远程的 socket,如果远程没有发回响应,TCP会持续尝试11分钟,
        //知道响应为止,如果在12分钟的时候还没响应,TCP尝试关闭socket连接。
        bootstrap.childOption(ChannelOption.SO_KEEPALIVE, true); 
        // 设置NIO类型的channel,设置服务端NIO通信类型
        bootstrap.channel(NioServerSocketChannel.class);
        // 设置监听端口
        bootstrap.localAddress(new InetSocketAddress(port));
        // 连接到达时会创建一个通道,设置ChannelPipeline,也就是业务职责链,由处理的Handler串联而成,由从线程池处理
        bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
        	// 添加处理的Handler,通常包括消息编解码、业务处理,也可以是日志、权限、过滤等
            @Override
            protected void initChannel(SocketChannel ch) throws Exception {
                // 流水线管理通道中的处理程序(Handler),用来处理业务
                
            	  //=============================增加心跳支持============================

                //添加ssl 访问
                ch.pipeline().addLast(sslContext.newHandler(ch.alloc()));

            	// webSocket协议本身是基于http协议的,所以这边也要使用http编解码器
                ch.pipeline().addLast(new HttpServerCodec());
                ch.pipeline().addLast(new ObjectEncoder());
                //ch.pipeline().addLast(myMessageDncoder);
                //ch.pipeline().addLast(myMessageEncoder);
                // 以块的方式来写的处理器,分块向客户端写数据,防止发送大文件时导致内存溢出,channel.write(new ChunkedFile(new File("...")))
                ch.pipeline().addLast(new ChunkedWriteHandler());
                //ch.pipeline().addLast(new MyServerChunkHandler());
		        /*
		        说明:
		        1、http数据在传输过程中是分段的,HttpObjectAggregator可以将多个段聚合
		        2、这就是为什么,当浏览器发送大量数据时,就会发送多次http请求
		         */
                //需要放到HttpServerCodec后面
		        ch.pipeline().addLast(new HttpObjectAggregator(65535));//10kb?
		        //websocket数据压缩扩展,当添加这个的时候,WebSocketServerProtocolHandler第三个参数需要设置成true
		        ch.pipeline().addLast(new WebSocketServerCompressionHandler());
		        /*
		        说明:
		        1、对应webSocket,它的数据是以帧(frame)的形式传递
		        2、浏览器请求时 ws://localhost:58080/xxx 表示请求的uri
		        3、核心功能是将http协议升级为ws协议,保持长连接
		        */
		       
		        
		        //对客户端,如果在60秒内没有向服务端发送心跳,就主动断开
		        //三个参数分别为读/写/读写的空闲,我们只针对读写空闲检测
		        //ch.pipeline().addLast(new IdleStateHandler(10,11,12,TimeUnit.SECONDS));
		        //ch.pipeline().addLast(heartBeatHandler);
		        
		        // 自定义的handler,处理业务逻辑
		        //ch.pipeline().addLast(webSocketHandler);
		        //ch.pipeline().addLast(userLoginRespHandler);
		        ch.pipeline().addLast(textWebSocketHandler);
		        ch.pipeline().addLast(binaryWebSocketFrameHandler);
		        // 服务器端向外暴露的 web socket 端点,当客户端传递比较大的对象时,maxFrameSize参数的值需要调大
		        ch.pipeline().addLast(new WebSocketServerProtocolHandler(webSocketPath, webSocketProtocol, true, 10485760));//10mb?

            }
        });
        // 配置完成,开始绑定server,通过调用sync同步方法阻塞直到绑定成功
        ChannelFuture channelFuture = bootstrap.bind().sync();
        log.info("Server started and listen on:{}",channelFuture.channel().localAddress());
        // 对关闭通道进行监听
        channelFuture.channel().closeFuture().sync();
    }

四、验证是否通,采用Postman或者自己写界面都行。

配置完了,发现ws不能使用了,还在研究,各位大神有办法,可以留言,互相学习。下面是下载的别人的案例,然后改了下我的案例,所以里面有两个server,可以做下参考。

netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效

WebsocketServer1是我的方案,证书按照文章里面的证书下载生成,启动WebsocketServer1的main方法,用postman访问是可以的,但是用他绑定的html不行,但是在我的项目里面是可以的。

java访问案例

另一种方式是WebsocketServer生成key然后配置密码的方式,我尝试过,生成的密码每次都是不匹配,所以放弃了。文章来源地址https://www.toymoban.com/news/detail-427523.html

到了这里,关于netty/websocket服务器配置阿里云SSL证书安全访问配置,亲测有效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • aliyun服务器(Linux)安装emqx,配置ssl证书

    EMQX版本:5.0.8 操作系统及版本:Ubuntu 20.04.1 云服务器:阿里云轻量应用服务器 所用软件:WinSCP、XShell、宝塔面板、MQTTX 其他 食用本文的前提:服务器已经购买,相关基础配置已经完备,域名已经备案,域名与IP已经绑定。 文章末尾会提供所用到的软件 小破站找到的emqx安装

    2024年02月09日
    浏览(50)
  • 在IIS服务器上安装SSL证书(2023配置启用HTTPS部署教程)内容来源SSL市场网

    https://www.sslmarket.com.cn/146.html

    2024年02月10日
    浏览(49)
  • 配置域名SSL证书、阿里云OSS自定义域名的SSL证书,以及解决配置后WebSocket报错问题

    目录 1)为什么要配置SSL证书? 2)为什么阿里云OSS自定义域名也要配置SSL证书? 3)为什么WebSocket会报错呢?  解决方法 一、配置网站ssl证书 二、阿里云OSS自定义域名如何配置SSL证书  三、websocket失效后如何从ws换成wss 1)为什么要配置SSL证书? SSL证书是数字证书的一种,类

    2024年02月07日
    浏览(32)
  • 34、springboot切换内嵌Web服务器(Tomcat服务器)与 生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS

    知识点1:springboot切换内嵌Web服务器(Tomcat服务器) 知识点2:生成SSL证书来把项目访路径从 HTTP 配置成 HTTPS spring-boot-starter-web 默认依赖 Tomcat 内置服务器 改为 Jetty 服务器 改为 Undertow 服务器 目的:把请求路径 http://xxxxx 改成 https://xxxxx 如图:原本普通的项目,启动后是http的

    2024年02月11日
    浏览(41)
  • SpringBoot + Vue2项目打包部署到服务器后,使用Nginx配置SSL证书,配置访问HTTP协议转HTTPS协议

    配置nginx.conf文件,这个文件一般在/etc/nginx/...中,由于每个人的体质不一样,也有可能在别的路径里,自己找找... 证书存放位置,可自定义存放位置 两个文件 后端配置 把.pfx拷贝到resource下,然后配置一下yml

    2024年02月02日
    浏览(51)
  • 基于netty框架不使用SSL证书,实现websocket数据加密传输

    1、简介 2、实现方式 3、服务端主要代码 4、客户端主要代码 5、调用方式 为什么不使用SSL证书? 1、服务器运行在专网环境,不能访问互联网。证书有有效期,CA机构规定,证书有效期最多2年。在客户的专网环境里更新和维护证书就会增加运营成本。 实现逻辑? 参照SSL的实

    2024年02月04日
    浏览(45)
  • Tomcat 服务器安装SSL证书

    Tomcat服务器安装SSL证书 Tomcat 支持 PFX 格式和 JKS 两种格式的证书,您可根据您 Tomcat 的版本择其中一种格式的证书安装到 Tomcat 上。 一、安装PFX 格式证书 1、准备好 PFX 格式的证书; 2、在 Tomcat 安装目录下新建 cert 目录,将证书文件拷贝到 cert 目录下。 3、打开 Tomcat conf serv

    2024年02月03日
    浏览(32)
  • Nginx 服务器 SSL 证书安装部署

    本文档指导您如何在 Nginx 服务器中安装 SSL 证书。 说明 本文档以证书名称 xxx为例。 Nginx 版本以 nginx/1.18.0 为例。 当前服务器的操作系统为 CentOS 7,由于操作系统的版本不同,详细操作步骤略有区别。 安装 SSL 证书前,请您在 Nginx 服务器上开启 HTTPS 默认端口 443,避免证书安

    2024年02月16日
    浏览(40)
  • Nginx服务器上安装SSL证书

    服务器已经开启了443端口(HTTPS服务的默认端口) 服务器上已安装了http_ssl_module模块 进入nginx安装目录执行如下命令 若出现“–with-http_ssl_module”说明已经安装过,否则继续执行下列步骤 再执行如下命令: 这里一定不要执行make install,否则会覆盖掉原来的nginx 会多一个objs文件夹

    2024年02月13日
    浏览(26)
  • 在Nginx服务器如何安装SSL证书

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Nginx安装步骤:安装详细步骤 进入数字证书管理服务/SSL 证书 /免费证书 点击下载 服务器类型选择Nginx 点击下载 将下载好的证书压缩包进行解压:会有下图两个文件 将证书文件和私钥文件上传到Nginx服

    2024年02月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包