ネッティーのWSSサポート

1.ロードSSL証明書ツール

パブリック クラスSslUtil { 

    プライベート 静的 揮発性のSSLContextのSSLContext = NULL ;
 
    公共の 静的するSSLContext createSSLContext(文字列、文字列のパス文字列のパスワードを入力)スロー例外{
         IFヌル == のSSLContext){
             同期(SslUtilのクラス){
                 IFヌル == のSSLContext ){
                     // サポートJKS、PKCS12(証明書アリ雲の無料のアプリケーション、解凍後のTomcatのダウンロードPFXファイル、PKCS12に対応するとの我々のプロジェクト 
                    キーストアKS =KeyStore.getInstance(タイプ)。
                    // 证书存放地址 
                    のInputStream ksInputStream = 新しいFileInputStreamを(パス); 
                    ks.load(ksInputStream、password.toCharArray())。
                    KeyManagerFactory KMF = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())。
                    kmf.init(KS、password.toCharArray())。
                    SSLContext = SSLContext.getInstance( "TLS" )。
                    sslContext.init(kmf.getKeyManagers()、NULLNULL ); 
                } 
            } 
        } 
        リターンSSLContextの; 
    } 
}

2. SslHandlerは最初に配置され

            bootstrap.group(bossGroup、workerGroup)
                    .channel(NioServerSocketChannel。クラス
                    .OPTION(ChannelOption.SO_BACKLOG、 128 
                    .childHandler(新しい ChannelInitializer <たSocketChannel> (){ 
                        @Override 
                        公共 ボイド initChannel(のSocketChannel CH)はスロー例外{ 
                            ChannelPipelineパイプライン = ch.pipeline(); 

                            // SSL处理器
                            のSSLContextのSSLContext = SslUtil.createSSLContext(BaseGlobal.getCertType()、
                                    BaseGlobal.getCertPath()、BaseGlobal.getCertPassword())。
                            SSLEngineのSSLEngineの= sslContext.createSSLEngine()。
                            sslEngine.setNeedClientAuth(偽); 
                            sslEngine.setUseClientMode(偽); 
                            pipeline.addLast( "sslHandler"、新SslHandler(SSLEngineの)); 

                            pipeline.addLast( "idleStateHandler"、IdleStateHandler(readerIdleTimeSeconds、
                                    writerIdleTimeSeconds、allIdleTimeSeconds)); 
                            ... 
                        } 
                    })。

 

そのため私たちのプロジェクトの特殊性の3、だけでなく、TCP、WSプロトコル、2 NettyServerをロードするために、複数のスレッドの使用をサポートしています

@EnableCaching 
@EnableAutoConfiguration 
@SpringBootApplication(scanBasePackages = "XXX" 
@MapperScan(basePackages = "XXX" 
@EnableAsync 
パブリック クラスV3xboxApplication {
     公共 静的 ボイドメイン(文字列[]引数){ 
        SpringApplication.run(V3xboxApplication。クラス、引数)。

        // サーバー(クライアントのTCPコネクション)を開始
         // ネッティーの同期方法のブロックスレッドので、使用糸を開始し
         // スレッドプールを使用しない理由はここに一つだけのスレッドで、ここでは、スレッドが作成の頻繁な破壊は存在しません。
       =新しい新しいnettyServerThread nettyServerThread nettyServerThread(); 
        スレッド=新しい新しいスレッド1スレッド(nettyServerThread)。
        thread1.start(); 

        // ポートケースがWSSを提供される場合、WSS処理サーバが開始される
        IF(StringUtil.isNotEmpty(BaseGlobal.getWssPort())){ 
            NettyWssServerThread sslServerThread新しい新しいNettyWssServerThread =(); 
            スレッド=新しい新しいスレッド2 スレッド(sslServerThread)。
            thread2.start(); 
        } 
    } 
}

 

4.私たちは、背景は、クライアントがHTTPまたはHTTPSで識別できるように、動的に、WSまたはプログラムでWSSので、nginxのプロキシ設定を決定する必要があるため

proxy_set_headerスキーム$スキーム。

 

参考:https://www.cnblogs.com/qingyibusi/p/8572783.html

おすすめ

転載: www.cnblogs.com/roostinghawk/p/12649954.html