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()、NULL、NULL ); } } } リターン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スキーム$スキーム。