1. 概要

このチュートリアルでは、SSLを紹介し、JSSE(Java Secure Socket Extension)APIを使用してJavaでSSLを使用する方法を探ります。

2. 序章

簡単に言えば、 Secured Socket Layer(SSL)は、2つのパーティ、通常はクライアントとサーバー間の安全な接続を可能にします。

SSLは、ネットワーク接続を介して動作する2つのデバイス間に安全なチャネルをプロビジョニングします。 SSLの通常の例の1つは、WebブラウザとWebサーバー間の安全な通信を有効にすることです。

この特定のケースでは、WebブラウザはHTTPS(Securedの略)接続を使用して、個別のWebサーバーによって提供されるリソースにアクセスします。

SSLは、次の3つの主要な情報セキュリティ原則をサポートするために必要です。

  • 暗号化:当事者間のデータ送信を保護します
  • 認証:接続するサーバーが実際に適切なサーバーであることを確認します
  • データの整合性:要求されたデータが効果的に配信されるものであることを保証します

Javaは、開発者がクライアントとの安全な接続を確立して暗号化された形式でメッセージを送受信するのに役立つ、いくつかのセキュリティベースのAPIを提供します。

  • Java Secured-Socket Extension(JSSE)
  • Java暗号化アーキテクチャ(JCA)
  • Java暗号化拡張機能(JCE)

次のセクションでは、Javaが安全な通信を可能にするために使用するSecureSocketExtensionを紹介します。

3. JSSE API

JavaセキュリティAPIは、Factoryデザインパターンを幅広く利用しています。

実際、すべてはJSSEのファクトリを使用してインスタンス化されます。

3.1. SSLSocketFactory

javax.net.ssl.SSLSocketFactory は、SSLSocketオブジェクトの作成に使用されます。

このクラスには、APIの3つのグループが含まれています。

最初のグループは、デフォルトインスタンスを取得するために使用される単一の静的 getDefault()メソッドで構成され、デフォルトインスタンスはSSLSocketインスタンスを作成できます。

2番目のグループは、SSLSocketインスタンスの作成に使用できる5つのメソッドで構成されています。

  • ソケットcreateSocket(文字列ホスト、intポート)
  • Socket createSocket(String host、int port、InetAddress clientHost、int clientPort)
  • ソケットcreateSocket(InetAddressホスト、intポート)
  • ソケットcreateSocket(InetAddressホスト、intポート、InetAddress clientHost、int clientPort)
  • ソケットcreateSocket(ソケットソケット、文字列ホスト、intポート、ブール値autoClose)

このクラスは、デフォルトインスタンスを取得するか、SSLSocketFactoryインスタンスを取得するメソッドを含むjavax.net.ssl。SSLContextオブジェクトを使用して直接使用できます。

3.2. SSLSocket

このクラスはSocketクラスを拡張し、安全なソケットを提供します。 このようなソケットは通常のストリームソケットです。

さらに、基盤となるネットワークトランスポートプロトコルにセキュリティ保護のレイヤーを追加します。

SSLSocket インスタンスは、指定されたポートで指定されたホストへのSSL接続を構築します。

これにより、接続のクライアント側を特定のアドレスとポートにバインドできます。

3.3. SSLServerSocketFactory

SSLServerSocketFactory クラスは、 SSLSocketFactory と非常によく似ていますが、SSLSocketインスタンスの代わりにSSLServerSocketインスタンスを作成する点が異なります。

同様に、メソッドは SSLSocketFactory クラスと同様に、createServerSocketと呼ばれます。

3.4. SSLServerSocket

SSLServerSocket クラスは、SSLSocketクラスに類似しています。 SSLServerSocketクラスのメソッドは、SSLSocketクラスメソッドのサブセットです。 それらはSSL接続の反対側で機能します

4. SSLの例

サーバーへの安全な接続を作成する方法の例を示しましょう。

String host = getHost(...);
Integer port = getPort(...);
SSLSocketFactory sslsocketfactory = SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory
  .createSocket(host, port);
InputStream in = sslsocket.getInputStream();
OutputStream out = sslsocket.getOutputStream();

out.write(1);
while (in.available() > 0) {
    System.out.print(in.read());
}

System.out.println("Secured connection performed successfully");

エラー“ java x.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:有効な証明書パスが見つかりませんSSL接続の確立中に要求されたターゲットに」これは、Javaトラストストアに接続しようとしているサーバーの公開証明書がないことを示します。

トラストストアは、Javaが保護された接続を検証するために使用する信頼できる証明書を含むファイルです。

この問題を解決するために、いくつかのオプションがあります。

  • サーバーの公開証明書を、Javaで使用されるデフォルトの cacertstruststoreに追加します。 SSL接続の開始中
  • javax.net.ssl.trustStore 環境変数がトラストストアファイルを指すように設定して、アプリケーションが接続先のサーバーの公開証明書を含むファイルを取得できるようにします。

新しい証明書をJavaのデフォルトのトラストストアにインストールする手順は次のとおりです。

  1. サーバーから証明書を抽出します: openssl s_client -connect server:443
  2. keytoolを使用して証明書をトラストストアにインポートします: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

これを実行すると、例を再度実行して、セキュア接続が正常に実行されましたメッセージを取得できるようになります。

5. 結論

この記事では、SSLとJava用のSSLを実装するJSSEAPIを紹介しました。 SSLとJSSEを使用することで、Javaアプリケーションと、アプリケーション間およびアプリケーション内の通信をより安全にすることができます。

いつものように、この記事で紹介するコードは、Githubから入手できます。