Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

JavaでRedis Enterprise CloudへのSSL接続を有効化する方法

サーバーとの安全な接続を利用したソフトウェア開発は、すべての開発者が身につけておくべきスキルです。特定の本番環境でSSLを有効にしないと決めたとしても、扱うすべてのサーバーへの接続を保護する方法は知っておくべきでしょう。この記事は、Python向けの「Redis Enterprise Cloudへの安全な接続の有効化」の記事をお約束どおり、Javaユーザーの方向けにフォローアップしたものです。

この記事では、SSLを使用してRedis Enterprise CloudとJavaクライアントプログラム間の暗号化接続を有効化し、テストおよび構成するための簡単なプロセスを解説します。JavaプログラムでSSLを有効にする際につまずきやすいポイントの一つが、証明書や鍵をJavaが理解できる形式へ変換する作業です。これはJava固有の手順となるため、プロセスの「テスト」と「構成」のステップの間に追加してご紹介します。

必要なツール

以下のツールを用意すれば、RedisでSSLを有効化するチケットを完了させられます。

  • Redis Enterprise Cloudアカウント
  • OpenSSL
  • Java SE JDK
  • Jedis(Java用Redisクライアント)

また、提供する小さなスクリプトを実行できるよう、Bashシェルがインストールされている必要があります。お使いのOSに標準でBashが含まれていない場合は、インストールするか、スクリプトをお好みのシェル向けに書き換えてください。

SSLを使用するには、Redis Enterprise CloudのサブスクリプションでSSL機能が有効になっている必要があります。まだ有効になっていない場合は、Redisサポートチームに連絡して有効化を依頼してください。サポートチームへの連絡リンクは、アカウントダッシュボードのメインメニューにあります。SSL設定の手順については、「Redis Enterprise Cloud Operations and Administration Guide」をご参照ください。

SSLとTLSについて

念のため補足しておくと、Python向けの記事と同様に、ここでも「SSL」という略称を「SSL」または「TLS」で保護された接続の両方を指す非公式な慣例に従って使用します。現在(2018年6月時点)、Redis Enterprise CloudはTLSバージョン1.2を使用して接続を保護していますが、Redis Enterprise CloudもJedisも「SSL」という呼び方を採用しているため、それに倣います。

ステップ1とステップ2

最初の2つのステップは、Pythonクライアント向けにSSLをセットアップする手順と同一です。ここで繰り返し説明する代わりに、Pythonの記事をご参照ください。この記事には、言語を問わずSSLを扱う際に役立つ情報が多数含まれています。続行する前に、ステップ3までの内容を読んでいただくことをおすすめします。

プロセスはステップ2以降でJava向けに分岐します。そこで、Redis Enterprise Cloudからダウンロードした認証情報ファイルをJavaSEで扱いやすい形式に変換する「ステップ2.5」をここに挿入します。

ステップ2.5:認証情報の変換

JavaSEの標準機能として、OracleはJava Cryptography Architecture(JCA)をはじめとするさまざまなセキュリティサービスを提供しています。JCAは、プラグイン型のプロバイダによって実装されるセキュリティサービスをJavaアプリケーションが呼び出すための一連のAPIを定義しています。アプリケーションは利用可能な任意のプロバイダ(標準API以上の追加サービスを提供することも多い)を自由に使えますが、ほとんどのアプリケーションはJDKに同梱されているデフォルトプロバイダを使用します。

デフォルトプロバイダを使う際の課題は、LinuxのSSLライブラリで証明書や鍵の保存によく使われるPEM形式をサポートしていないことです。JCAでは、認証情報はパスワードで保護されたキーストアリポジトリに格納されます。Javaアプリケーションでは通常、2つのリポジトリを使い分けます。ドキュメント上、一方は「キーストア(keystore)」、もう一方は「トラストストア(truststore)」と呼ばれます。キーストアにはクライアントソフトウェアの証明書と秘密鍵を保存し、トラストストアには証明機関からの信頼済み証明書を保存します。Redis Enterprise CloudはPEM形式を使用するため、OpenSSLとJava Keytoolを使って、PEMファイルをJavaクライアントプログラムで利用可能なトラストストアとキーストアに変換するために必要なコマンドをすべて実行するスクリプトを作成しました。

以下のスクリプト「transmogrify.sh」は、redis_credentials.zipを展開したディレクトリで実行してください。このスクリプトは、Redis認証局(CA)の証明書(redis_ca.pem)からトラストストア(redis_truststore.p12)を作成し、クライアント証明書(redis_user.crt)と対応する秘密鍵(redis_user_private.key)からキーストア(redisclient_keystore.p12)を作成します。クライアントのキーストアはパスワードで保護されていますが、それでもキーストア自体のセキュリティ確保に努めてください。キーストアとトラストストアは、特定のRedisデータベースインスタンスに接続するすべてのクライアントに配布する必要があるため、これらのファイルを認証情報管理システムに組み込むことも忘れないでください。

JDK9より前のJavaバージョンでは独自仕様のJava KeyStore(JKS)形式が推奨されていましたが、JDK9以降は業界標準のPKCS12形式がデフォルトになっています。このスクリプトはPKCS12形式のストアを作成しますが、スクリプトを修正すれば、ストアタイプのオプションとファイル拡張子を変更することでJKS形式を使用することもできます。

ステップ3:クライアントコードでSSLを構成する

JavaクライアントでSSLを有効化する最後のステップは、SSL接続を確立するようにクライアントコードを修正することです。サンプルコードでは、Redis Enterprise Cloudインスタンスへの安全な接続を確立した後、RedisのPINGコマンドを送信します。修正後のコードは次のようになります。

コード内のどこにも、ステップ2.5で作成したキーストアやトラストストアへの参照がないことに気づくでしょう。JCAプロバイダのデフォルト動作によりサーバー認証が行われるため、こちら側では鍵と証明書の情報を提供するだけで済みます。これは、JCAプロバイダが読み取るシステムプロパティで指定できます。IDEのアプリケーション構成またはjavaコマンドラインに、以下のパラメータを追加し、ご自身の環境に合わせて適切なパスとパスワードに書き換えてください。

キーストア関連のプロパティ:

  • javax.net.ssl.keyStoreType=PKCS12
  • javax.net.ssl.keyStore=/Users/tague/dev/ssl-testj/redisclient_keyStore.p12
  • javax.net.ssl.keyStorePassword=redis

これらは、transmogrifyスクリプトで作成されたキーストアのタイプ(形式)、場所、パスワードを指定します。同様に、トラストストア関連のプロパティ:

  • javax.net.ssl.trustStoreType=PKCS12
  • javax.net.ssl.trustStore=/Users/tague/dev/ssl-testj/redis_truststore.p12
  • javax.net.ssl.trustStorePassword=redis

これらは、トラストストアのタイプ、場所、パスワードを指定します。最後の javax.net.debug=ssl:handshake はオプションのプロパティで、デバッグ情報の出力を有効にするために使用します。

JedisでSSLを使えるように設定すること自体はそれほど難しくありませんが、PEM形式の認証情報をJavaのキーストアやトラストストアに変換する手順に不慣れな場合、最初は戸惑うかもしれません。

この記事が、Python開発者向けに提供したのと同じように、Javaユーザーの皆様にもRedis Enterprise Cloudへの安全な接続設定の優しい入門となれば幸いです。最後にセキュリティに関する重要な注意点をお伝えします。多くの組織では、パスワードや秘密鍵の管理に関する独自のポリシーや手順が定められています。必ず運用チームやセキュリティチームに確認し、そのガイドラインに従っていることをご確認ください。

  1. DynomiteデータベースからRedis Enterprise Active-Activeデータベースへ移行する完全ガイド

    本記事の前編「なぜDynomiteデータベースをRedis Enterprise Active-Activeデータベースに移行すべきか?」では、DynomiteとRedis Enterpriseのアーキテクチャや機能を比較しました。Redis Enterpriseを活用すれば、機能が豊富で管理しやすい形でRedisを地理的に分散配置でき、同時書き込みによる競合を心配する必要がないことをご紹介しました。 後編となる本記事では、DynomiteからRedis Enterpriseへの移行オプションについて詳しく解説します。 なお、以降の説明では、Redis Enterpriseのセルフマネージド版

  2. DynomiteデータベースをRedis Enterprise Active-Activeデータベースに移行すべき理由

    2009年の誕生以来、Redis OSS(オープンソース版)は非常に活発なオープンソースコミュニティを形成してきました。その周辺には数多くのツールやユーティリティが開発されており、非分散型データストア向けのピアツーピア地理分散レイヤーであるDynomiteもその一つです。 DynomiteはNetflixのエンジニアチームによって開発され、オープンソースとして公開されました。特定のニーズに対する優れたソリューションを提供してきましたが、ここ数年は効果的なメンテナンスが行われていません。さらに、DynomiteによるRedis OSSインスタンスの分散モデルのせいで、Redis OSSの一部機