カスタムSSL証明書を用いたPayara Serverのセキュア構成
Originally published on 27 Sep 2018
Last updated on 13 Dec 2019
Payara Serverの管理タスクで最も多いものの1つは、他のWebサーバーと同様に、HTTPプロトコルやPayara Serverへのリモート・アクセスをセキュアにするための電子証明書のセットアップです。自己署名証明書または信頼できる認証機関の署名入り証明書のいずれかをお持ちでしょうが、どちらの場合も証明書をPayara Serverのドメインに追加してセキュアな通信に用いるのはとても簡単です。
もし新しい自己署名証明書を作成してこのガイドをお読みになるのであれば、opensslを用いてコマンド1つで証明書を作成することができます。
openssl req -x509 -newkey rsa:4096 -keyout mycert.key -out mycert.crt -days 365
新しい電子証明書を用いてPayara Serverをセキュアな構成にする手順はいくつかの段階を踏むことになりますが、大まかには以下のようになります。
- 公開鍵と秘密鍵を単一のPKCS12ファイルに格納する
- 格納した公開鍵と秘密鍵をPayara Serverのドメインが使用しているキーストアに追加する
- 証明書の公開鍵をPayara Serverのドメインの信頼する証明書に追加する – これはオプションですが、強くお勧めします
- 必要に応じて、HTTPリスナーのセキュリティを有効にする
- 必要に応じて管理インタフェースのセキュリティを有効にする
このガイドを読み進めるにあたって必要なものは以下の通りです。
- 証明書ファイル(公開鍵) – ここではmycert.crtとします(自己署名証明書・認証局の署名入り証明書ともに)
- 証明書の秘密鍵 – ここではmycert.keyとします
- あるいは、mycert.crtとmycert.keyの代わりに、公開鍵と秘密鍵のバンドル
- Payara Serverのインストール – ここではmydomainドメインを使用するものとします(デフォルト・ドメインdomain1、もう一つの組み込みドメインpayaradomain、または新たに作成したドメイン)
個別の公開鍵と秘密鍵のファイルの代わりに、鍵が既にバンドルされているかもしれません。これは信頼できる認証機関で署名された証明書でしばしばみられます。もしPKCS12形式以外でバンドルされている場合には、いくつかの手順で異なるタイプのストアを認識させるか、または鍵をPKCS12形式にエクスポートする必要があります。
このガイドの目的に照らし合わせると、証明書が自己署名証明書か認証局の署名入りのものであるかは重要ではありません。これらの違いは証明書の取得方法だけです。認証局を考慮する必要がない場合、例えば、すべての通信がプライベートでファイアウォールの内側の場合、自己署名証明書を用いれば十分です。しかし、CA証明書を使用してHTTPS接続を外部向けに有効化することは、信頼性を高め偽造を防止する手段として有用です。
準備
キーストアを操作するには、JDKのbinディレクトリにあるkeytoolコマンドを使用します。
すべての構成変更はドメインのconfigフォルダ内で行われます。手順を簡単にするため、証明書の公開鍵と秘密鍵のファイルをこのフォルダにコピーすることから始めましょう。mycert.cerおよびmycert.keyを<Payara_install>/glassfish/domains/mydomain/configにコピーしてください。もし公開鍵と秘密鍵のバンドルを持っているのであれば、それをconfigディレクトリにコピーします。ここではファイル名をmycert.p12とします。
これらの手順を実行する前に、Payara Serverのドメインを停止させることをお勧めします。いくつかのアクションではドメインを開始する必要がありますが、このガイドでは適宜明示します。
ドメイン・マスター・パスワードの変更
証明書キーストアにアクセスする前に、Payara Serverのドメインのマスター・パスワードを確実に設定しておく必要があります。このパスワードはPayara Serverがキーストアにアクセスするために使用されます。後ほど、キーストアに同じパスワードでアクセスする必要があります。
デフォルトのマスター・パスワードはchangeitです。以下のコマンドでこれを変更することができます。
asadmin change-master-password --savemasterpassword=true mydomain
このコマンドを実行すると新しいマスター・パスワードを尋ねてきます。このパスワードはキーストア・ファイルの暗号化・復号化と含まれるキー・バンドルの復号化にも使用するため、忘れないようにしてください。--savemasterpassword=trueを使用することで、asadmin start-domainコマンドがパスワード入力プロンプトを出さないように、パスワードをディスクに保存することができます。パスワードを保存したくなければ、このオプションは省略してください。
証明書の公開鍵・秘密鍵のキーストアへの追加
HTTPリスナーのような内部向けの接続をセキュアにするには、証明書鍵をドメインの設定フォルダ内にあるキーストア・ファイルkeystore.jskに追加する必要があります。それを行う前に、公開鍵と秘密鍵をPKCS12バンドル・ファイルにまとめておく必要があります。ここで、PKCS12バンドル・ファイルはドメインのマスター・パスワードと同じパスワードで暗号化しなければならないことに注意してください。バンドルは後でPayara Serverがアクセスするキーストアに追加されますが、キーストアを開いてそこに含まれるすべてのバンドルを復号化する際にドメインのマスター・パスワードが使用されます。
keytoolコマンドはPKCS12バンドルの作成をサポートしないため、他の方法を採らなければなりません。その手順はご利用のオペレーティング・システムによって異なります。
Creation of the PKCS12 bundle in Linux
Linuxでは、以下のようにopensslを使用してバンドルを作成します。
openssl pkcs12 -export -in mycert.crt -inkey mycert.key -out mycert.p12 -name mydomain_certificate
公開鍵のパスを -in オプション、秘密鍵のパスを -inkey オプション、作成するバンドルのファイル名を -out オプションでそれぞれ指定します。また、-name オプションを用いてバンドルにエイリアスを設定する必要があります。
バンドルを作成する際に新しいパスワードを尋ねられます。バンドルは基本的には新しいキーストアで、cacerts.jksとkeystore.jksに似ています。
Keytoolを使用すると、新しいバンドルの内容を確認することもできます。
keytool -list -keystore mycert.p12
WindowsでPKCS12バンドルを作成する
mycert.crtとmycert.keyからバンドルを作成する最も簡単な方法は、Linux同様にopensslを使用するか、あるいはいくつかの類似したツール (例えばMakeCert) を使用することです。しかし、これらはWindowsには標準では含まれていません。
もし信頼された認証機関の署名入り証明書をお持ちであれば、一旦Windowsの証明書ストアにインポートしてから、PKCS12形式でエクスポートします。この作業はすべてMicrosoft管理コンソール (mmc) で行います。署名された証明書バンドルは秘密鍵のエクスポートが可能でなければなりません。そうでなければ、バンドルのままで使用することになるでしょう。もしPKCS12形式でなければ、後からいくつかのコマンドを用いてPKCS12の代わりの正しい形式を指定する必要があります。
バンドルをエクスポートする際には、「はい、秘密キーをエクスポートします」(export the private key)、「証明のパスにある証明書を可能であればすべて含む」(Include all certificates in the certification path if possible)、「すべての拡張プロパティをエクスポートする」(Export all extended properties) の各オプションをすべてチェックすることを忘れないでください。
このガイドの他の箇所に合わせて、エクスポートしたバンドルをmycert.p12というファイル名で保存します。
Microsoft管理コンソールは証明書にエイリアスを手動で設定する方法がありません。エイリアスを生成すると、残念なことにこのようなものになります: {fa2ds2d3-z13b-492d-2c83-f5z215432p2k} このエイリアスは後ほどこのガイドでmydomain_certificateというエイリアスを使用する箇所で必要になります。
PKCS12バンドルをキーストアにインポートする
先の手順では公開鍵と秘密鍵から新しいキーストア・バンドルを作成しました。新しいバンドルの内容はkeytoolを使用して確認できます。
keytool -list -keystore mycert.p12
このコマンドはまずバンドル作成時のパスワードを尋ねてきます。それから証明書の情報と設定されたエイリアスを一覧表示します。エイリアスは重要で、後ほど証明書を参照する際に必要となります。
最後に、PKCS12バンドルをPayara Serverのドメインのキーストアにインポートする必要があります。以下のkeytoolコマンドを実行してください。
keytool -importkeystore -destkeystore keystore.jks -srckeystore mycert.p12 -srcstoretype PKCS12 -alias mydomain_certificate
上記のコマンドでは、keystore.jksに他のキーストア (バンドル) であるmycert.p12 (PKCS12形式) をインポートするため、mydomain_certificateエイリアスを持つ証明書だけを選択したキーストアからそれを行います。
証明書の信頼する証明書一覧への追加
この手順では、証明書の公開鍵またはPKCSバンドル全体をPayara Serverのドメインにある信頼された証明書のキーストア・ファイルに追加してみます。これは外部または他のPayara Serverインスタンスから取得した証明書をサーバーに信頼できるものとして認識させるものです。HTTPリスナーのような内部チャネルのセキュア化だけが目的であれば、この手順はオプションですが、どのような場合でもこの手順に従って問題は発生しないでしょう。
信頼された証明書のキーストア・ファイルはデフォルトで次の場所にあります。
<Payara_install>/glassfish/domains/mydomain/config/cacerts.jks.
以下のコマンドで公開鍵ファイル (mycert.crt) をcacerts.jksキーストアにインポートします。
keytool -importcert -trustcacerts -destkeystore cacerts.jks -file mycert.crt -alias mydomain_certificate
このコマンドはcacerts.jksキーストアのパスワードを尋ねてきます。これはドメインのマスター・パスワードと同一になります。
PKCSバンドル (mycert.p12) の場合は、同様に以下のコマンドを使用します。
keytool -importkeystore -destkeystore cacerts.jks -srckeystore mycert.p12 -srcstoretype PKCS12 -alias mydomain_certificate
これで証明書はmydomain_certificateエイリアス以下にインストールできます。
古い証明書の置き換え
既にドメインへ証明書をインストールしていて、期限切れが近づいているためにこれを置き換えたい場合には、それを新しいものに置き換えることができます。そのためのドメインに対する追加設定は不要です。新しい証明書をインストールする前に、まず古い証明書を削除します。そのためのkeytoolコマンドを以下に示します。
keytool -delete -alias mydomain_certificate -keystore keystore.jks
信頼された証明書のキーストアにある証明書も置き換える場合には、同じコマンドをcacerts.jskファイルに対しても使用します。
keytool -delete -alias mydomain_certificate -keystore cacerts.jks
古い証明書を削除してから、新しい証明書を先に示したように追加します。ここで注意していただきたいことは、証明書はドメイン構成からはエイリアスで参照されるということです。つまり、新しい証明書のエイリアスも古い証明書と同一でなければなりません。
セキュア管理で使用している証明書を置き換えたい場合には、(既にセキュア管理が有効な場合でも) セキュア管理を有効するコマンドを実行して、すべてのセキュア管理設定をリフレッシュすることをお勧めします。
asadmin start-domain mydomain (if domain not yet started)
asadmin enable-secure-admin
asadmin restart-domain mydomain (to apply changes)
HTTPリスナーのセキュリティ有効化
この時点で証明書はドメインで使用できます。HTTPリスナーをセキュアにするか、デフォルトでセキュアになっているhttp-listener-2リスナーのデフォルト証明書を置き換えれば良いのです。
まず、対象となるドメインでサーバーを起動する必要があります。
サーバーが動作している間、asadminまたはWebブラウザの管理コンソールを使用してHTTPリスナーを構成することができます。
管理コンソールを用いたHTTPリスナーのセキュア化
ブラウザで管理コンソールを開きます。デフォルトではURLは http://localhost:4848/ となります。
構成したいリスナーがmy-http-listenerであれば、Configurations -> server-config -> HTTP Service -> HTTP Listeners > my-http-listener と辿ります。デフォルトでは既にTLSプロトコルでセキュア化されたhttp-listener-2が存在しており、デフォルト証明書はエイリアスs1asを持ち、ポート8181をリスンします。
セキュアでないリスナーにセキュリティを追加する場合には、以下のようにSecurityがEnabledになっていることを確認してください。
SSLタブでは、TLSは有効になっているはずです。SSL3を使用することはお勧めしません。SSL3はTLSに取って代わられており、広くは使われていません。さらに、SSL3プロトコルにはセキュリティ上の問題があります。
SSLタブでは、新しい証明書を適用することもできます。Certificate NickNameには証明書のエイリアスを設定します。今回のケースではmydomain_certificateとなります。
もし証明書のエイリアスが分からない場合は、以下のコマンドを用いてmycert.p12バンドルからエイリアスを探してください。
keytool -list -keystore mycert.p12
同じコマンドをkeystore.jksファイルに対して実行すると、同じ証明書だけでなくドメインのキーストアに既に存在している他の証明書についても見ることができます (2つの証明書: glassfish-instance および s1as がデフォルトで存在しています)。
最後に、構成の変更をWebブラウザで確認します。Webアプリケーションがコンテキスト・ルート webapp にデプロイされていて、リスナーがポート8181を使用している場合、アドレス https://localhost:8181/webapp または https://<yourdomain>:8181/webapp を開いて、新しい証明書によって接続がセキュアになっていることをチェックしてください。
Asadminを用いたHTTPリスナーのセキュア化
asadminでは、構成手順を1つまたは複数のasadmin CLIコマンドで再現できます。その際にはドット区切りの構成プロパティを用います。
- http-litener-2という名前のリスナーでセキュリティを有効にします。
asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.security-enabled=true
- http-listener-2リスナーでTLSプロトコルを有効にします。
asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.tls-enabled=true
asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.tls11-enabled=true
asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.tls12-enabled=true
TLSプロトコルには3つのバージョンがあります。望ましい方法は3バージョンすべてを有効にして古いクライアントに対しても最適のバージョンが使用されるようにすることです。しかし、TLS 1.2のみを有効にすることも可能で、その場合は上記の最後のコマンドのみを実行します。管理コンソール使用時にはこのような粒度の調整はできません。
- エイリアスmydomain_certificateを持つ新しい証明書をhttp-listener-2に適用します。
asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.cert-nickname=mydomain_certificate
管理リスナーのセキュリティ有効化
管理コンソールへの接続も他のHTTPリスナーの場合と同様にセキュア化することができます。ただし、管理コンソールまたはasadminをリモートで実行し、ドメイン名が証明書のそれと一致している場合のみ、管理リスナーのSSLセキュリティを有効にすることをお勧めします。併せて、SSLはクラスタにおいてインスタンスとドメイン管理サーバーの通信にも使用されることに留意してください。
もし、管理リスナーのセキュア化が本当に必要な場合には、以下の例外を除いて管理コンソールで他のHTTPリスナーと同じ手順を実施します。
- 管理リスナーのセキュリティを有効化する前に、すべての管理ユーザーのパスワードを空でないものにします。
- 管理ユーザーのパスワードが空の場合、管理コンソールでパスワードを変更する(Domain -> Administrator password) か、または以下のasadminコマンドを実行します。
asadmin change-admin-password
-
- 管理リスナーのセキュリティを有効化するには、Secure Administration ページのEnable secure adminボタンをクリックします。これはadmin-listenerのGeneral構成ページのSecurityチェックボックスのページへのリンクです。これは管理コンソールのメニュー: server (Admin server) -> General -> Secure Administration を辿る場合と同様です。
- Secure Administrationページから証明書を管理リスナーに設定することができます。Administration Aliasフィールドを s1as から証明書のエイリアスに置き換えるか、後で通常のHTTPリスナーと同じ方法で証明書を設定します。後者の方法では、証明書を設定するまでデフォルト証明書を用いることを意味します。
- Enable secure adminをクリックした後について補足すると、サーバーの再起動後にHTTPSプロトコル上で動作する管理コンソールにリダイレクトされます。ドメインに他のインスタンスが存在する場合には、それらも同様に再起動する必要があります。
管理セキュリティを有効にする前の状態です。
- 管理リスナーのセキュリティを有効化するには、Secure Administration ページのEnable secure adminボタンをクリックします。これはadmin-listenerのGeneral構成ページのSecurityチェックボックスのページへのリンクです。これは管理コンソールのメニュー: server (Admin server) -> General -> Secure Administration を辿る場合と同様です。
以降、管理セキュリティは有効になります。
セキュアな管理リスナーはasadminコマンドを使用しても有効化することができます:
asadmin enable-secure-admin --adminalias=mydomain_certificate
このコマンドを実行後、サーバーを再起動する必要があります。ドメインの他のインスタンスについても同様です。
さらに細かな構成が必要な場合は、他のHTTPリスナーと同様のasadminコマンドを使用する必要があります。
まとめ
以上で、Payara Serverに証明書を追加する方法と、それを使用してSSLによるセキュアな通信を使用する方法についてご理解いただけたのではないかと思います。決して難しくはありませんが、openssl、keytool、管理コンソールを使用したいくつかの手順は必要となります。今回は、すべての必須またはオプションとなる手順、異なるオペレーティング・システムのための代替案、管理コンソールまたはasadminによる操作方法についてご説明しました。皆様のセキュリティ要件を満たす最適な手段を決める一助となれば幸いです。
Related Posts
Celebrating 25 Years of the CVE Program
Published on 22 Oct 2024
by Chiara Civardi
0 Comments
The Common Vulnerabilities and Exposures (CVE®) Program is celebrating its 25th anniversary today! This marks a major milestone in global cybersecurity. Since 1999, the CVE Program has been critical in helping organizations identify, manage and ...
Eclipse Foundation’s New Open Regulatory Compliance Working Group Launch
Published on 01 Oct 2024
by Dawn Baird
0 Comments