摘要:一證書本文只介紹版,其他系統只供參考生成證書下載并安裝未編譯編譯好在目錄下打開命令行,輸入在本目錄得到和文件生成服務端和客戶端私鑰命令行輸入密碼自己設定,好幾個密碼,別弄亂了就好,分不清的話都設成一樣的根據生成文件
一、證書 (本文只介紹windows版,其他系統只供參考) 1.生成ca證書
下載 openssl 并安裝 未編譯 編譯好
在openssl/bin目錄下打開命令行,輸入
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
在本目錄得到 ca.key 和 ca.crt 文件
2.生成服務端和客戶端私鑰命令行輸入
openssl genrsa -des3 -out server.key 1024 openssl genrsa -des3 -out client.key 1024
密碼自己設定,好幾個密碼,別弄亂了就好,分不清的話都設成一樣的
3.根據 key 生成 csr 文件openssl req -new -key server.key -out server.csr -config openssl.cnf openssl req -new -key client.key -out client.csr -config openssl.cnf4.根據 ca 證書 server.csr 和 client.csr 生成 x509 證書
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt5.將 key 文件進行 PKCS#8 編碼
openssl pkcs8 -topk8 -in server.key -out pkcs8_server.key -nocrypt openssl pkcs8 -topk8 -in client.key -out pkcs8_client.key -nocrypt
最后得到有用的文件分別為
服務器端: ca.crt、server.crt、pkcs8_server.key
客戶端端: ca.crt、client.crt、pkcs8_client.key
public class Main { private static final int m_port = 23333; public void run() throws Exception { File certChainFile = new File(".sslserver.crt"); File keyFile = new File(".sslpkcs8_server.key"); File rootFile = new File(".sslca.crt"); SslContext sslCtx = SslContextBuilder.forServer(certChainFile, keyFile).trustManager(rootFile).clientAuth(ClientAuth.REQUIRE).build(); EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new Initializer(sslCtx)); ChannelFuture f = b.bind(m_port).sync(); f.channel().closeFuture().sync(); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { new Main().run(); } }Initializer.java
public class Initializer extends ChannelInitializerHandler.java{ private final SslContext sslCtx; public Initializer(SslContext sslCtx) { this.sslCtx = sslCtx; } @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(sslCtx.newHandler(ch.alloc())); pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); pipeline.addLast(new StringDecoder()); pipeline.addLast(new StringEncoder()); pipeline.addLast(new Handler()); } }
public class Handler extends SimpleChannelInboundHandler三、客戶端代碼 Main.java{ @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { Channel incoming = ctx.channel(); ctx.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " 加入 "); } @Override protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception { Channel incoming = ctx.channel(); System.out.println("收到消息" + s) } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { Channel incoming = ctx.channel(); System.out.println(incoming.remoteAddress() + "在線"); } @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { Channel incoming = ctx.channel(); ctx.writeAndFlush("[SERVER] - " + incoming.remoteAddress() + " 離開 "); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { Channel incoming = ctx.channel(); System.out.println(incoming.remoteAddress() + "掉線"); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { Channel incoming = ctx.channel(); System.out.println(incoming.remoteAddress() + "異常"); // 當出現異常就關閉連接 cause.printStackTrace(); ctx.close(); }
public class Main { private static String m_host = "127.0.0.1"; private static int m_prot = 23333; public static void main(String[] args) throws Exception { new Main().run(); } public void run() throws Exception { File certChainFile = new File(".sslclient.crt"); File keyFile = new File(".sslpkcs8_client.key"); File rootFile = new File(".sslca.crt"); final SslContext sslCtx = SslContextBuilder.forClient().keyManager(certChainFile, keyFile).trustManager(rootFile).build(); EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group).channel(NioSocketChannel.class).handler(new Initializer(sslCtx)); Channel ch = b.connect(m_host, m_prot).sync().channel(); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while (true) { ch.writeAndFlush(in.readLine() + " "); } } finally { group.shutdownGracefully(); } } }Initializer.java
public class Initializer extends ChannelInitializerHandler.java{ private final SslContext sslCtx; public Initializer(SslContext sslCtx) { this.sslCtx = sslCtx; } @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(sslCtx.newHandler(ch.alloc())); pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); pipeline.addLast(new StringDecoder()); pipeline.addLast(new StringEncoder()); pipeline.addLast(new Handler()); } }
public class Handler extends SimpleChannelInboundHandler{ protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception { System.out.println("收到:" + s); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67288.html
摘要:它甚至使用不安全的偽隨機生成器在內部更快地生成項目源碼一個簡單的應答通訊的實例判斷是否加密監聽本地服務監聽端口發送消息的大小,用于公共抽象類,安全套接字協議實現充當工廠和。 本博客 貓叔的博客,轉載請申明出處閱讀本文約 4分鐘 適讀人群:Java-Netty 初級 Echo簡易通訊案例 版本:netty 4.1.*申明:本文旨在重新分享討論Netty官方相關案例,添加部分個人理解與要...
摘要:豐富的緩存數據結構使用它自己的緩存來表示字節序列而不是的。針對有一個定義良好的事件模型。有一些協議是多層的建立在其他低級協議基礎上。此外,甚至不是完全線程安全的。協議由標準化為。協議緩存整合是一個高效二進制協議的快速實現。 Chapter 2、結構概覽 這一節我們將確認Netty提供的核心功能是什么,以及它們怎么構成一個完整的網絡應用開發堆棧。 1、豐富的緩存數據結構 Netty使用它...
摘要:上文講了如何使用生成的簽名證書進行加密通信,結果客戶端告訴我他們用的版本沒有類,并且由于一些交易的原因還不能更新沒有你總有吧,來吧。 上文講了netty如何使用openssl生成的簽名證書進行加密通信,結果客戶端告訴我他們用的netty版本沒有SslContextBuilder類,并且由于一些PY交易的原因還不能更新netty....showImg(https://segmentfau...
摘要:異步和事件驅動是一款異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端。由提供的通知機制消除了手動檢查對應的操作是否完成的必要。事件和使用不同的事件來通知我們狀態的改變或者是操作的狀態。 異步和事件驅動 ?Netty是一款異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端。 Netty簡介 分類 Netty...
摘要:目錄源碼分析之番外篇的前生今世的前生今世之一簡介的前生今世之二小結的前生今世之三詳解的前生今世之四詳解源碼分析之零磨刀不誤砍柴工源碼分析環境搭建源碼分析之一揭開神秘的紅蓋頭源碼分析之一揭開神秘的紅蓋頭客戶端源碼分析之一揭開神秘的紅蓋頭服務器 目錄 Netty 源碼分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 簡介 Java NIO 的前生今世 ...
閱讀 3656·2021-09-22 15:15
閱讀 3559·2021-08-12 13:24
閱讀 1312·2019-08-30 15:53
閱讀 1823·2019-08-30 15:43
閱讀 1184·2019-08-29 17:04
閱讀 2793·2019-08-29 15:08
閱讀 1582·2019-08-29 13:13
閱讀 3088·2019-08-29 11:06