JavaにおけるSSLの紹介

1概要

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

2前書き

簡単に言うと、** SSL(Secure Socket Layer)は、2つのパーティ(通常はクライアントとサーバー)間のセキュアな接続を有効にします。

SSLは、ネットワーク接続を介して動作する2つのデバイス間に安全なチャネルを提供します。 SSLの一般的な例の1つは、WebブラウザとWebサーバー間の安全な通信を可能にすることです。

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

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

  • 暗号化 :パーティー間のデータ転送を保護する

  • 認証 :接続するサーバーが本当に正しいことを確認します

サーバ

  • データの完全性 :要求されたデータが正しいことを保証する

効果的に配信された

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

  • Java Secured-Socket Extension(JSSE)

  • Java暗号化アーキテクチャー(JCA)

  • Java Cryptographic Extension(JCE)

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

3. JSSE API

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

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

3.1. SSLSocketFactory

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

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

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

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

  • Socket createSocket(String host、int port)

  • __Socket createSocket(String host、int port、InetAddress clientHost、

int clientPort) ** ソケットcreateSocket(InetAddressホスト、intポート)__

  • __Socket createSocket(InetAddressホスト、intポート、InetAddress

clientHost、int clientPort) ** Socket createSocket(ソケット、String host、int port、boolean

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");

エラー「__ javax.net.ssl.SSLHandshakeException」が発生した場合

sun.security.validator.ValidatorException:PKIXパスの構築に失敗した

sun.security.provider.certpath.SunCertPathBuilderException:SSL接続の確立中に要求されたターゲットへの有効な証明書パスが見つかりません。 Javaトラストストア

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

この問題を整理するために、いくつかの選択肢があります。

  • サーバーのパブリック証明書をデフォルトに追加します** cacerts

トラストストア はJavaによって使用されます。 SSL接続を開始している間 トラストストアファイルを指すように環境変数を設定します。

アプリケーションは、接続しているサーバーの公開証明書を含むファイルを取得できます。

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

  1. サーバーから証明書を抽出します. openssl s client -connect server:443__

  2. keytoolを使用してトラストストアに証明書をインポートします. __keytool -import

-alias alias.server.com -keystore $ JAVA HOME/jre/lib/security/cacerts

これが完了したら、例を再度実行して、「Secured connection successful successful」メッセージを取得できるはずです。

5.まとめ

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

いつものように、この記事で紹介したコードはhttps://github.com/eugenp/tutorials/tree/master/core-java/src/main/java/com/baeldung/ssl[over on Github]から入手できます。

前の投稿:Apacheキャメルの紹介
次の投稿:Java Web週刊44