国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

netty ssl 服務器

rickchen / 540人閱讀

摘要:一證書本文只介紹版,其他系統只供參考生成證書下載并安裝未編譯編譯好在目錄下打開命令行,輸入在本目錄得到和文件生成服務端和客戶端私鑰命令行輸入密碼自己設定,好幾個密碼,別弄亂了就好,分不清的話都設成一樣的根據生成文件

一、證書 (本文只介紹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.cnf
4.根據 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.crt
5.將 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

二、服務器端代碼 Main.java
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 ChannelInitializer {
    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());
    }
}
Handler.java
public class Handler extends SimpleChannelInboundHandler {

    @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();
    }
三、客戶端代碼 Main.java
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 ChannelInitializer{
    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());
    }
}
Handler.java
public class Handler extends SimpleChannelInboundHandler{
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
        System.out.println("收到:" + s);
    }
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67288.html

相關文章

  • 一個簡單的Netty-EchoDemo

    摘要:它甚至使用不安全的偽隨機生成器在內部更快地生成項目源碼一個簡單的應答通訊的實例判斷是否加密監聽本地服務監聽端口發送消息的大小,用于公共抽象類,安全套接字協議實現充當工廠和。 本博客 貓叔的博客,轉載請申明出處閱讀本文約 4分鐘 適讀人群:Java-Netty 初級 Echo簡易通訊案例 版本:netty 4.1.*申明:本文旨在重新分享討論Netty官方相關案例,添加部分個人理解與要...

    I_Am 評論0 收藏0
  • Netty3文檔翻譯(二)

    摘要:豐富的緩存數據結構使用它自己的緩存來表示字節序列而不是的。針對有一個定義良好的事件模型。有一些協議是多層的建立在其他低級協議基礎上。此外,甚至不是完全線程安全的。協議由標準化為。協議緩存整合是一個高效二進制協議的快速實現。 Chapter 2、結構概覽 這一節我們將確認Netty提供的核心功能是什么,以及它們怎么構成一個完整的網絡應用開發堆棧。 1、豐富的緩存數據結構 Netty使用它...

    Zhuxy 評論0 收藏0
  • Netty使用JSSE實現SSLSocket通信

    摘要:上文講了如何使用生成的簽名證書進行加密通信,結果客戶端告訴我他們用的版本沒有類,并且由于一些交易的原因還不能更新沒有你總有吧,來吧。 上文講了netty如何使用openssl生成的簽名證書進行加密通信,結果客戶端告訴我他們用的netty版本沒有SslContextBuilder類,并且由于一些PY交易的原因還不能更新netty....showImg(https://segmentfau...

    DTeam 評論0 收藏0
  • Netty概念和體系結構

    摘要:異步和事件驅動是一款異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端。由提供的通知機制消除了手動檢查對應的操作是否完成的必要。事件和使用不同的事件來通知我們狀態的改變或者是操作的狀態。 異步和事件驅動 ?Netty是一款異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端。 Netty簡介 分類 Netty...

    FingerLiu 評論0 收藏0
  • Netty 源碼分析之 一 揭開 Bootstrap 神秘的紅蓋頭 (務器端)

    摘要:目錄源碼分析之番外篇的前生今世的前生今世之一簡介的前生今世之二小結的前生今世之三詳解的前生今世之四詳解源碼分析之零磨刀不誤砍柴工源碼分析環境搭建源碼分析之一揭開神秘的紅蓋頭源碼分析之一揭開神秘的紅蓋頭客戶端源碼分析之一揭開神秘的紅蓋頭服務器 目錄 Netty 源碼分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 簡介 Java NIO 的前生今世 ...

    張金寶 評論0 收藏0

發表評論

0條評論

rickchen

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<