はじめに (対象読者・この記事でわかること)

この記事は、WebSphere Libertyを利用したアプリケーション開発・運用に携わるエンジニアの方々を対象としています。特に、WebSphere LibertyのサーバーでSSL/TLS証明書を設定し、HTTPSによるセキュアな通信を確立したいとお考えの方に役立つ内容となっています。

この記事を読むことで、以下のことがわかるようになります。

  • WebSphere LibertyにおけるSSL証明書の基本的な役割と重要性
  • SSL証明書を生成・取得する際の一般的な流れ
  • WebSphere LibertyでSSL証明書をインポートし、HTTPSリスナーを設定する具体的な手順
  • 設定上の注意点や、よくある問題とその解決策のヒント

安全なWebアプリケーションの提供には、SSL/TLSによる通信の暗号化が不可欠です。この記事を通して、WebSphere Libertyでセキュアな環境を構築するための一歩を踏み出しましょう。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Java EE/Jakarta EEの基本的な理解
  • WebサーバーにおけるSSL/TLSの概要
  • コマンドラインインターフェース(CLI)の基本的な操作
  • WebSphere Libertyの基本的なデプロイメントや設定の経験 (任意)

WebSphere LibertyとSSL証明書の重要性

WebSphere Libertyは、軽量かつモジュール式のJava EE/Jakarta EEアプリケーションサーバーとして、様々な環境で利用されています。現代のWebアプリケーションにおいて、ユーザーの機密情報や通信内容を保護するために、SSL/TLSによる通信の暗号化は必須の要件となっています。SSL証明書は、このSSL/TLS通信を実現するための鍵となります。

SSL証明書は、大きく分けて以下の2つの役割を担います。

  1. 通信の暗号化: クライアント(ブラウザなど)とサーバー間の通信データを暗号化し、第三者による盗聴や改ざんを防ぎます。これにより、ログイン情報やクレジットカード情報などの機密性の高いデータが安全にやり取りできるようになります。
  2. サーバーの認証: クライアントに対し、接続しようとしているサーバーが正当なものであることを証明します。これにより、フィッシングサイトのような悪意のある偽サイトへの誤接続を防ぎ、ユーザーに安心感を提供します。

WebSphere Libertyにおいて、これらのSSL/TLS通信を有効にするためには、適切なSSL証明書をサーバーに設定する必要があります。この設定を怠ると、ブラウザで「保護されていない通信」と表示されたり、証明書エラーが発生したりして、ユーザーの信頼を損なうだけでなく、セキュリティ上のリスクを抱えることになります。

WebSphere LibertyにおけるSSL証明書の設定手順

WebSphere LibertyでSSL証明書を設定する主な流れは、証明書の取得(または生成)、Keystoreへのインポート、そしてHTTPSリスナーの設定です。ここでは、これらのステップを詳細に解説します。

1. SSL証明書の準備

まず、WebSphere Libertyで利用するSSL証明書を準備する必要があります。証明書にはいくつかの種類がありますが、一般的には以下のいずれかの方法で入手します。

1.1. 自己署名証明書の生成 (開発・テスト環境向け)

開発環境やテスト環境では、信頼された認証局(CA)から証明書を取得する代わりに、自身で自己署名証明書を生成することができます。これは手軽ですが、ブラウザからは「信頼されていない証明書」として警告が表示されるため、本番環境での利用は推奨されません。

Java Development Kit (JDK) に含まれるkeytoolコマンドを利用して生成するのが一般的です。

コマンド例:

Bash
keytool -genkeypair -alias myLibertyCert -keyalg RSA -keysize 2048 -validity 365 -keystore mykeystore.jks -storepass password -keypass password -dname "CN=your.domain.com, OU=IT, O=YourCompany, L=YourCity, ST=YourState, C=US"
  • -alias: 証明書に付けるエイリアス(識別名)
  • -keyalg: 鍵のアルゴリズム(RSAが一般的)
  • -keysize: 鍵のサイズ(2048ビット以上が推奨)
  • -validity: 証明書の有効期間(日数)
  • -keystore: 生成するKeystoreファイル名
  • -storepass: Keystoreのパスワード
  • -keypass: 秘密鍵のパスワード
  • -dname: 証明書の識別名(CNはCommon Name、通常はサーバーのホスト名またはドメイン名)

1.2. 認証局(CA)から取得した証明書の利用 (本番環境向け)

本番環境では、信頼された認証局(Let's Encrypt, DigiCert, GlobalSignなど)から発行されたSSL証明書を利用することが強く推奨されます。これにより、ブラウザからの警告表示を防ぎ、ユーザーに安心を提供できます。

認証局から証明書を取得する際は、通常、証明書署名要求(CSR)を生成し、それを認証局に提出します。CSRの生成もkeytoolコマンドで可能です。

CSR生成コマンド例:

Bash
keytool -certreq -alias myLibertyCert -file mycsr.csr -keystore mykeystore.jks

認証局から証明書(通常は.crt.cerファイル)と、必要に応じて中間証明書(Intermediate Certificate)を受け取ったら、それらをKeystoreにインポートします。

証明書チェーンのインポートコマンド例:

Bash
keytool -importcert -alias root -keystore mykeystore.jks -file rootCA.crt keytool -importcert -alias intermediate -keystore mykeystore.jks -file intermediate.crt keytool -importcert -alias myLibertyCert -keystore mykeystore.jks -file mycertificate.crt

myLibertyCertのエイリアスでインポートする証明書は、CSR生成時に対応する秘密鍵とペアになるもの)

2. Keystoreの準備とインポート

WebSphere Libertyでは、SSL証明書や秘密鍵をJKS (Java KeyStore) またはPKCS12形式のKeystoreファイルに格納します。

2.1. JKS Keystoreの作成・インポート

keytoolコマンドで自己署名証明書を生成した場合、その証明書はそのままJKS Keystoreファイルとして利用できます。 認証局から証明書(サーバー証明書、中間証明書、ルート証明書)を受け取った場合は、それらを既存のJKS Keystoreにインポートするか、新たにJKS Keystoreを作成してインポートします。

新しいJKS Keystoreの作成と証明書のインポート:

Bash
# 1. 新しいJKS Keystoreを作成 (パスワードは必要に応じて変更) keytool -genkeypair -alias dummy -keystore newkeystore.jks -storepass changeit -keypass changeit # 2. ルート証明書をインポート keytool -importcert -alias root -keystore newkeystore.jks -file rootCA.crt -storepass changeit # 3. 中間証明書をインポート keytool -importcert -alias intermediate -keystore newkeystore.jks -file intermediate.crt -storepass changeit # 4. サーバー証明書をインポート (CSR生成時に秘密鍵も生成している場合) keytool -importcert -alias myLibertyCert -keystore newkeystore.jks -file mycertificate.crt -storepass changeit

2.2. PKCS12 Keystoreの作成・インポート

keytoolコマンドはPKCS12形式のKeystoreも扱えます。

Bash
# PKCS12 Keystoreの作成 (パスワードは必要に応じて変更) keytool -importkeystore -srckeystore mykeystore.jks -srcstoretype JKS -destkeystore mykeystore.p12 -deststoretype PKCS12 -deststorepass newpassword -srcstorepass password

3. WebSphere LibertyのHTTPSリスナー設定

Keystoreファイルが準備できたら、WebSphere Libertyのserver.xmlファイルでHTTPSリスナーを設定します。

3.1. server.xmlへの設定追加

server.xmlファイルを開き、httpEndpoint要素内でsslEnabled="true"を指定し、sslRef属性でSSL設定を参照するようにします。そして、別途ssl要素を定義し、Keystoreファイルやパスワード、使用する証明書のエイリアスなどを指定します。

Xml
<server> <!-- HTTPエンドポイントの設定 --> <httpEndpoint id="defaultHttpEndpoint" host="*" httpPort="9080" httpsPort="9443" sslEnabled="true" sslRef="defaultSSLConfig" /> <!-- SSL設定 --> <ssl id="defaultSSLConfig" keyStoreRef="myKeyStore" trustStoreRef="myTrustStore" clientAuthentication="false" sslProtocol="TLSv1.2" /> <!-- Keystoreの設定 --> <keyStore id="myKeyStore" location="path/to/your/mykeystore.jks" type="JKS" password="password" readOnly="true" /> <!-- Truststoreの設定 (必要に応じて) --> <!-- <trustStore id="myTrustStore" location="path/to/your/mytruststore.jks" type="JKS" password="password" readOnly="true" /> --> <!-- 他のサーバー設定 --> ... </server>
  • httpEndpointhttpsPort: HTTPS通信に使用するポート番号を指定します(例: 9443)。
  • sslRef: ssl要素のidを参照します。
  • ssl要素:
    • keyStoreRef: keyStore要素のidを参照します。
    • trustStoreRef: クライアント証明書認証を行う場合に、信頼する証明書が格納されたTruststoreを参照します。
    • clientAuthentication: クライアント認証の有無を指定します (trueで有効、falseで無効)。
    • sslProtocol: 使用するSSL/TLSプロトコルを指定します。TLSv1.2TLSv1.3などが推奨されます。
  • keyStore要素:
    • id: ssl要素で参照されるidと一致させます。
    • location: Keystoreファイルへの絶対パスまたはWebSphere Libertyのインストールディレクトリからの相対パスを指定します。
    • type: Keystoreのタイプ(JKSまたはPKCS12)を指定します。
    • password: Keystoreのパスワードを指定します。

3.2. サーバーの再起動

server.xmlファイルの変更を反映するには、WebSphere Libertyサーバーを再起動する必要があります。

Bash
<wlp_install_dir>/bin/server restart

再起動後、指定したHTTPSポート(例: https://your.domain.com:9443)にアクセスして、ブラウザに鍵マークが表示され、SSL証明書が正しく適用されているか確認してください。

4. トラブルシューティングと注意点

SSL証明書の設定は、時として予期せぬ問題が発生することがあります。以下に、よくある問題と対処法をいくつか紹介します。

4.1. 証明書チェーンの問題

  • 症状: ブラウザで「証明書が無効です」「信頼されていない」といったエラーが表示される。
  • 原因:
    • サーバー証明書だけでなく、中間証明書やルート証明書もKeystoreに正しくインポートされていない。
    • Keystoreにインポートした証明書の順番が間違っている。
  • 解決策: 認証局から提供された証明書(サーバー証明書、中間証明書、ルート証明書)を、指定された順序(通常はルート → 中間 → サーバー)でKeystoreにインポートし直してください。keytool -printcert -v -alias <alias> -keystore <keystorefile>コマンドで、Keystore内の証明書情報を確認できます。

4.2. ホスト名不一致

  • 症状: ブラウザで「ホスト名が一致しません」というエラーが表示される。
  • 原因:
    • 証明書のCommon Name (CN) またはSubject Alternative Name (SAN) に、アクセスしようとしているホスト名(FQDN)が含まれていない。
    • Wildcard証明書を使用している場合、サブドメイン名が証明書でカバーされていない。
  • 解決策: 証明書発行時に、アクセスに使用するホスト名(例: www.example.comapp.example.com)をCNまたはSANに含めるように指定してください。

4.3. Keystore/Truststoreのパスワード間違い

  • 症状: WebSphere Libertyの起動時にエラーが発生し、SSLリスナーが有効にならない。
  • 原因: server.xmlで指定したKeystore/Truststoreのパスワードが間違っている。
  • 解決策: server.xmlpassword属性値を、Keystore/Truststoreの正しいパスワードに修正してください。

4.4. sslProtocolの設定

  • 症状: 特定のクライアント(古いOSやブラウザなど)からの接続ができない。
  • 原因: sslProtocolで指定したプロトコルが、クライアント側でサポートされていない、またはセキュリティ上の理由で無効化されている。
  • 解決策: セキュリティ要件と互換性を考慮し、TLSv1.2TLSv1.3など、安全で広くサポートされているプロトコルを指定してください。必要に応じて、複数のプロトコルをコンマ区切りで指定することも可能です。(例: TLSv1.2,TLSv1.3

4.5. Keystoreのパス指定

  • 症状: server.xmlで指定したKeystoreファイルが見つからず、Libertyが起動しない。
  • 原因: location属性で指定したパスが間違っている、またはLibertyプロセスがそのパスにアクセスできない権限がない。
  • 解決策: Keystoreファイルへのパスが正しいか、絶対パスまたはLibertyのインストールディレクトリからの相対パスで正しく指定されているか確認してください。Libertyを実行するユーザーに、Keystoreファイルへの読み取り権限があるかも確認してください。

まとめ

本記事では、WebSphere LibertyでSSL証明書を設定し、セキュアなHTTPS通信を確立するための基本的な手順と、それに伴う考慮事項について解説しました。

  • SSL証明書の役割: 通信の暗号化とサーバー認証によるセキュリティ確保の重要性
  • 証明書の準備: 自己署名証明書(開発/テスト用)と認証局発行証明書(本番用)の選択肢
  • Keystoreの設定: keytoolコマンドを使用した証明書の生成・インポート、server.xmlでのHTTPSリスナー構成
  • トラブルシューティング: よくある問題とその解決策のヒント

WebSphere LibertyでSSL証明書を正しく設定することは、ユーザーの信頼を得て、安全なサービスを提供するための基本中の基本です。この記事が、皆様のWebSphere Liberty環境におけるセキュリティ強化の一助となれば幸いです。

今後は、より高度なSSL設定(クライアント認証、SNI、パフォーマンスチューニングなど)についても記事にする予定です。

参考資料