Java を使用して Websocket SSL ハンドシェイクの失敗の問題を解決する方法
要約: この記事では、Java を使用して Websocket SSL ハンドシェイクの失敗の問題を解決する方法を紹介します。 。まず、Websocket と SSL の基本知識を説明し、次に Websocket SSL ハンドシェイクが失敗する一般的な理由をいくつか紹介し、最後に解決策と具体的なコード例を示します。
1. Websocket と SSL の基礎知識
Websocket は、Web ブラウザとサーバー間の全二重通信のためのプロトコルです。 Websocket プロトコルはハンドシェイクに HTTP プロトコルを使用し、ハンドシェイクが成功した後は TCP 接続に変換して双方向通信を実現します。 SSL (Secure Sockets Layer) は、ネットワーク通信のセキュリティを保護するために使用されるプロトコルであり、Websocket 接続のセキュリティを保護するためによく使用されます。
2. Websocket SSL ハンドシェイクが失敗する理由
3. 解決策とコード例
a) 自己署名証明書を使用する
自己署名証明書を使用する場合は、サーバーとクライアントの両方に証明書をインポートし、信頼を設定する必要があります。コード内の証明書。
サーバー側のコード例:
SSLContext sslContext = SSLContext.getInstance("TLS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(new FileInputStream("server_keystore.jks"), "password".toCharArray()); kmf.init(keyStore, "password".toCharArray()); sslContext.init(kmf.getKeyManagers(), null, null); Server server = new Server(sslContext);
クライアント側のコード例:
SSLContext sslContext = SSLContext.getInstance("TLS"); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); KeyStore trustStore = KeyStore.getInstance("JKS"); trustStore.load(new FileInputStream("client_truststore.jks"), "password".toCharArray()); tmf.init(trustStore); sslContext.init(null, tmf.getTrustManagers(), null); WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.setDefaultSSLContext(sslContext);
b) 権限のある証明書の使用
権限のある証明書を使用する場合は、サーバーのクライアント証明書チェーンの整合性を確認するため、クライアントは証明書を直接信頼できます。
サーバー側のコード例:
SSLContext sslContext = SSLContext.getInstance("TLS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(new FileInputStream("server_keystore.jks"), "password".toCharArray()); kmf.init(keyStore, "password".toCharArray()); sslContext.init(kmf.getKeyManagers(), null, null); Server server = new Server(sslContext);
クライアント側のコード例:
WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.setDefaultMaxSessionIdleTimeout(10000); container.setDefaultSSLContext(SSLContext.getDefault()); container.setDefaultMaxTextMessageBufferSize(65536); container.connectToServer(ClientEndpoint.class, new URI("wss://localhost:8443"));
サーバー側のコード例:
SSLContext sslContext = SSLContext.getInstance("TLS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(new FileInputStream("server_keystore.jks"), "password".toCharArray()); kmf.init(keyStore, "password".toCharArray()); sslContext.init(kmf.getKeyManagers(), null, null); Server server = new Server(sslContext);
クライアント側のコード例:
SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, null, new SecureRandom()); WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.setDefaultSSLContext(sslContext);
IV. 概要
この記事では、Java を使用して問題を解決する方法を紹介します。 Websocket SSL ハンドシェイクの失敗に関する質問。 Websocket SSL ハンドシェイクの失敗は、証明書の問題を確認し、キー ネゴシエーションを調整することで解決できます。同時に、読者が理解を深め、実際の開発に適用できるように、具体的なコード例が提供されています。
以上がJava を使用して Websocket SSL ハンドシェイク失敗問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。