カスタム SSL証明書を用いた Payara Serverのセキュア化
Originally published on 10 May 2021
Last updated on 18 May 2021
Payara Serverの管理タスクで最も多いものの1つは、他のWebサーバーと同様に、HTTPプロトコルやPayara Serverへのリモート・アクセスをセキュアにするための電子証明書のセットアップです。皆様は自己署名証明書または信頼できる認証局の署名入り証明書のいずれかをお持ちでしょうが、どちらの場合も証明書をPayara Serverのドメインに追加してセキュアな通信に用いるのはとても簡単です。
このガイドでご説明する手順の概要
新しい電子証明書を用いてPayara Serverをセキュアな構成にする手順はいくつかの段階を踏むことになりますが、大まかには以下のようになります。
- SSL証明書の取得
- 公開鍵と秘密鍵を単一のPKCS12ファイルに格納する
- 格納した公開鍵と秘密鍵をPayara Serverのドメインが使用しているキーストアに追加する
- 証明書の公開鍵をPayara Serverのドメインの信頼する証明書に追加する – これはオプションですが、強くお勧めします
- 必要に応じて、HTTPリスナーのセキュリティを有効にする
- 必要に応じて管理インタフェースのセキュリティを有効にする
このガイドを読み進めるにあたって必要なものは以下の通りです。
- 証明書ファイル(公開鍵) – ここではcrtとします(自己署名証明書・認証局の署名入り証明書ともに)
- 証明書の秘密鍵 – ここではkeyとします
- Payara Serverのインストール – ここではmydomainドメインを使用するものとします(デフォルト・ドメインdomain1、もう一つの組み込みドメインpayaradomain、または新たに作成したドメイン)
SSL証明書の取得
ほとんどの場合、認証局(CA)が作成し署名したSSL証明書を使用することになります。多くの場合、証明書署名要求(CSR)を作成して認証局に送り、認証局からSSL証明書を取得します。Payara Server Enterpriseには、CSRを生成するgenerate-csrコマンドが用意されており、非常に簡単にCSRを生成することができます。また、opensslまたはcertreq を使用してCSRを生成することもできます。
新しい自己署名証明書を使ってこのガイドに従う場合は、Payara Server Enterpriseを使って直接作成するか、opensslなどのサードパーティのツールを使って作成することができます。
Payara Server Enterpriseは、generate-self-signed-certificateコマンドにより、ドメイン構成の中で自己署名証明書を生成することができます。このコマンドを使用すると、Payara Serverの外部で証明書を生成し、ドメインにインポートするために必要なすべての手順を省略することができます。Payara Server Enterpriseを使用して自己署名証明書を生成するには、以下のasadminコマンドを使用します。
asadmin generate-self-signed-certificate --dn "C=UK,O=Payara,CN=payara.fish" mydomain_certificate
生成された証明書は、Payaraのキーストアとトラスト・ストアに、mydomain_certificateというエイリアスで自動的に保存されます。つまり、秘密鍵と公開鍵を束ねてPayaraのキーストアとトラスト・ストアにインポートする必要はなく、この証明書エイリアスを使用するようにPayara Serverを構成することができるのす。
また、opensslを使って自己署名の秘密鍵と公開鍵を生成することもできます。
openssl req -x509 -newkey rsa:4096 -keyout mycert.key -out mycert.crt -days 365
信頼できる認証局から証明書を取得した場合、鍵はすでにバンドルされている可能性があります。これは、信頼できる認証局によって署名された証明書の場合によく見られます。バンドルの形式がPKCS12と異なる場合は、一部の操作で別のストア形式を指定するか、PKCS12形式の鍵をエクスポートする必要があります。
このガイドでは、証明書が自己署名されているか、認証局によって署名されているかは重要ではありません。両者の違いは、証明書の取得方法だけです。認証が問題にならない場合、例えば、すべての通信がプライベートでファイアウォールの内側にある場合は、自己署名証明書の使用で十分です。しかし、外部から利用可能なHTTPS接続のためにCA証明書を取得して使用することは、信頼性を高め、偽造されるのを防ぐために役立ちます。
準備
キーストアを操作するには、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バンドル・ファイルはドメインのマスター・パスワードと同じパスワードで暗号化しなければならないことに注意してください。また、証明書の秘密鍵(mycert.key)が同じパスワードで暗号化されていることを確認してください。バンドルは後でPayara Serverがアクセスするキーストアに追加されますが、キーストアを開いてそこに含まれるすべてのバンドルを復号化する際にドメインのマスター・パスワードが使用されます。
keytoolコマンドはPKCS12バンドルの作成をサポートしないため、他の方法を採らなければなりません。その手順はご利用のオペレーティング・システムによって異なります。
LinuxによるPKCS12バンドルの作成
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に似ています。パスワードは、Payaraドメインで使用しているマスター・パスワードと同じものを使用してください。
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コマンドを実行します。
- 管理ユーザーのパスワードが空の場合、管理コンソールでパスワードを変更する(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による操作方法についてご説明しました。皆様のセキュリティ要件を満たす最適な手段を決める一助となれば幸いです。
Payara Platformの本番利用でヘルプは必要ですか? Payara Enterpriseについて知ってください。
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