Elasticsearch接続のトラブルシューティング
LiferayとElasticsearchの接続を設定する際に遭遇する可能性のある接続上の問題と、それらの問題に対する最も一般的な解決策を以下に列挙します。 その他の可能性については、Elasticsearchのトラブルシューティング:よくある問題を参照してください。
LiferayとElasticsearchのホスト設定の不一致
Liferay 7.3 と 7.4 (RESTクライアント接続を使用) では、このログメッセージが表示されます。
Liferay 7.0-7.2 (Java Transport client を使用) では、このログメッセージが表示されます。
LiferayのElasticsearchコネクターはElasticsearchホストes-node1-prod
に接続しようとしていますが、利用可能なノードが見つかりません。 Elasticsearchのログで、以下のような行を探します。
指定されたノードの実際のアドレスが出力されます。 この例では、トランスポートアドレスはes-node1/192.168.0.17:9300
、HTTPアドレスは es-node1/192.168.0.17:9200
です。
Liferay 7.3と7.4での正しいコネクター構成は次のとおりです。
Liferay 7.0-7.2での正しいコネクター構成は以下の通りです。
TLS/SSLは有効だが、Liferayは暗号化されていないチャンネルで通信しようとしている。
Liferay 7.3と7.4では、このログメッセージが表示されます。
Liferay 7.0-7.2では、このエラーはより一般的な org.elasticsearch.client.transport.NoNodeAvailableException
として表示されます。
Elasticsearchのログには、関連するエラーが表示されます。
Liferay 7.3 と 7.4 では、 Elasticsearch のログに次のように表示されます。
Liferay 7.0-7.2では、 Elasticsearch 6/7 のログが以下を出力します。
Elasticsearchの警告は、暗号化されたチャンネルでサーバーが平文のトラフィックを受信したことを示しています。
elasticsearch.yml
ファイルにxpack.security.*
プロパティがトランスポート層および/またはhttp層に設定されている場合( xpack.security.enabled: true
も参照)、ElasticsearchはX-Pack Securityを有効にしています。 したがって、Liferayのコネクターもそれに応じて設定する必要があります。
正しいコネクターの構成については、 Elasticsearchの保護を参照してください。
Elasticsearchのホスト名と証明書のDNS名の不一致
Liferay 7.3と7.4では、このログメッセージが表示されます。
Liferay 7.0-7.2では、このエラーはorg.elasticsearch.client.transport.NoNodeAvailableException: NoNodeAvailableException
とjava.security.cert.CertificateException: No subject alternative DNS name matching found
として表示されます。
Liferay 7.0-7.2では、XPackSecurityConfiguration.config
ファイルで transportSSLVerificationMode="full"
が設定されているときのみ、この現象が発生します。 クライアント(つまりLiferayのコネクター)は、Elasticsearchノードの証明書が信頼できるCAによって署名されていることを確認するだけでなく、ホスト名/IPアドレスの検証も行っています。
Liferay 7.0-7.2で表示される関連したElasticsearch 6/7のエラーがあります。
これらのエラーは、Elasticsearchノードのホストが、SSLハンドシェイク中にクライアント(つまりLiferayのコネクター)に提示する証明書に見つからないことを知らせるものです。 ホスト名は証明書にサブジェクト代替名として表示されなければなりません。この場合、宣言されたホスト名 es-node1
は証明書の名前と一致しません(おそらく証明書では es-node-1
である可能性があります)。
サーバーの証明書を開きます。 Subject Alternative Names
カテゴリのDNS名/IPアドレスにサーバーホスト名がない場合、証明書を更新してください。
X-Packのセキュリティ認証情報が正しくないことによる認証の失敗
Liferay 7.3と7.4で、コネクターの構成で設定されたパスワードがElasticsearchのパスワードと一致しない場合、例外がログに表示されます。
ユーザー名が正しくない場合、別のエラーが表示されることがあります。
Liferay 7.0-7.2では、エラーはorg.elasticsearch.client.transport.NoNodeAvailableException
として表示されます。
Elasticsearchに表示される対応するエラーがあります。
Liferayでコネクターの構成を開き、ユーザ名とパスワードがElasticsearchのX-Packユーザーの認証情報と一致することを確認します。
Liferayでセキュリティが有効になっているが、Elasticsearchで無効になっている
Liferay 7.3と7.4では、以下のログメッセージが表示されることがあります。
Liferay 7.0-7.2では、エラーはorg.elasticsearch.client.transport.NoNodeAvailableException
と表示されます。
対応するElasticsearchのエラーがあります。
elasticsearch.yml
を開き、xpack.security.enabled
がfalse
に設定されていないことを確認します。 「Elasticsearchの保護」の記事に従って、HTTP層とトランスポート層が暗号化通信を使用するように設定されていることを確認してください。
LiferayとElasticsearchが異なる認証局で署名された証明書を使用している
*.ssl.verification_mode
の設定がcertificate
もしくはelasticsearch.yml
でfull
の場合、Liferay 7.3と7.4で以下のエラーが表示されることがあります。
Liferay 7.0-7.2では、transportSSLVerificationMode="certificate"
がXPackSecurityConfiguration.config
ファイルで設定されている場合、次のエラーが表示されることがあります。
Liferay 7.0-7.2でTCP経由でサーバーに接続すると、対応するElasticsearchのエラーが表示されます。
スタック内のすべてのノード(Liferay、Elasticsearch、Kibanaなど)が同じ認証局(CA)で署名された証明書を使用しており、そのCAの証明書(公開鍵)がクライアントの環境に存在することを確認してください。 例えば、 sslTruststorePath
やsslCertificateAuthoritiesPath
の設定が 「Elasticsearchの保護」の記事 に従って設定されていることを確認してください。
証明書ファイルを開き、「Issuer Name」または「Issued by」エントリーを見つけます。 これらのエントリーには、発行者 CA に関する情報が保持されます。
Elasticsearch MonitoringおよびX-Pack Monitoringウィジェットが一時的に使用できない
Monitoring Elasticsearch は、KibanaがHTTPSを使用するように設定する方法を示しています。 セットアップ時の証明書の問題により、Liferay 7.3および7.4でこれらのログメッセージが表示されることがあります。
Liferay 7.0-7.2 では、異なるメッセージが表示されることがあります。
対応するKibanaのエラーが表示されることがあります。
これらのエラーは、Kibanaサーバーが自己署名証明書を持ち、クライアントのトラストストアファイルにCAが存在しないことを示しています(Liferay DXP は、LESモニタリングアプリを介したクライアントです)。 JDKのcacerts
ファイルは、デフォルトのトラストストアです。
LiferayのモニタリングポートレットをKibanaのUIのプロキシとして使用していて、自己署名証明書を使用しているため、Kibanaの証明書を信頼するようにアプリケーションサーバーの起動JVMパラメーターを構成する必要があります。 2つのアプローチがあり、ここではTomcatで実証しています。
-
Elasticsearchコネクターのセキュリティ設定に使用したのと同じファイルを使用して、トラストストアのパス、パスワード、タイプをアプリケーションサーバのスタートアップJVMパラメーターに追加します。
setenv.sh/bat
ファイルを通して、Tomcat サーバーのCATALINA_OPTS
にトラストストアとパスのパラメーターを追加します。 -
より良い方法は、デフォルトの
cacerts
ファイルのコピーを作成し、秘密鍵なしで証明書をインポートし、カスタムのトラストストアファイルを使用するようにアプリケーションサーバーを構成することです。-
Liferay JVMからデフォルトの
cacerts
ファイル(JDK 8ではJAVA_HOME/jre/lib/security
に、JDK 11ではJAVA_HOME/lib/security
にある)をコピーして、cacerts-custom.jks
に名前を変更します。 -
openssl
を使って秘密鍵なしでCAの証明書を抽出します(elastic-stack-ca.p12
のような単一の.p12
ファイルしかない場合 )。 -
Javaの
keytool
を使って、証明書をカスタムJKSファイルにインポートします。 -
カスタムのトラストストアを使用するようにTomcatを設定します。
-
JDK 11とElasticsearch 7.11+使用時のSSL例外
Liferay DXPがJDK バージョン11を使用し、Kibanaバージョン 7.11+ と通信するように設定されている場合、Liferay のログに以下のエラーが表示されることがあります。
Elasticsearchのモニタリング を参照してください。
IOExceptionデータがオブジェクトIDでない
.p12
ファイルが、Liferay JDKよりも高いメジャーバージョンのJDKで生成された場合 ( keytool
を使用)、Liferayのログに次のエラーが表示されることがあります。
例えば、JDK11を使用して証明書を生成し、JDK8でLiferayを実行すると、この例外が発生することがあります。
続行するには、次のいずれかを行ってください。
-
一致するJDKのバージョンを使用して証明書を再作成します。
-
キーストアに
PKCS12
の代わりにJKS
の形式を使用します。 -
keytool
で-Dkeystore.pkcs12.legacy
オプションを使用して、keystore.pkcs12.legacy
システムプロパティを設定し、OpenJDK 11/16のkeytoolに古いアルゴリズムを使用させます。
ノード証明書の署名に使用されたCA証明書は信頼されていない
Elasticsearchノード間、またはLiferayとElasticsearch間のSSLハンドシェイクでは、ノード証明書に署名するために使用されるCA証明書が信頼されている必要があります。 すべてのノードのtruststore
または keystore
に証明書が存在することを確認します。 これは、通常、自己署名証明書を使用する場合に問題となります。
複数ノードのElasticsearchクラスタにおいて、クライアントのElasticsearchノードからリクエストを受けたElasticsearchサーバノードが、以下のような警告メッセージを投げることがあります。
クライアントのElasticsearchノードでは、エラーがSunCertPathBuilderException
で表示されます。
さらに詳しい検査で、根本的な原因を確認することができます。 各ノードのelasticsearch.yml
でxpack.security.transport.ssl.verification_mode: none
を一時的に設定します。 エラーが解消され、接続に成功した場合は、クライアントノードのキーストアまたはトラストストアに証明書は存在しません。
本番環境では、SSL検証モードを「none」に設定したままにしないでください。
SSL検証モードの設定については、 Elasticsearchドキュメント をお読みください。
LiferayとElasticsearchのノード間でも同様の問題が発生することがあります。 Liferayは、Elasticsearchノードの証明書が信頼できないCAによって署名されている場合(例えば、自己署名証明書を使用している場合)、このようなエラーを投げます。
Elasticsearchのノード証明書に署名したCAの証明書が、Liferayに設定されたトラストストアに存在し、信頼されていることを確認します。
- セキュリティ設定 が Elasticsearch コネクタの設定 (
com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration.config
) にある場合は、truststorePath
プロパティを使用して Elasticsearch 接続のトラストストアを設定します。 - セキュリティ設定がLES Securityアプリの設定(
com.liferay.portal.search.elasticsearch7.configuration.XPackSecurityConfiguration.config
)にある場合、sslTruststorePath
プロパティを使用してトラストストアを設定します。
また、ノード証明書にCA証明書(公開鍵)が存在しない場合にも、これらのエラーが表示されることがあります。 この場合、CA証明書とノード証明書の形式(PKCS#12またはPEM)に応じて、Javaの keytool
または openssl
などのツールを使用して追加します。
例えば、CAの証明書(公開鍵)と秘密鍵が ca.p12
で、ノードの証明書が elastic-nodes.p12
の場合、以下の手順に従います。
-
CAの公開鍵を秘密鍵なしでエクスポートします。
openssl pkcs12 -in ca.p12 -out ca.crt -nokeys
-
プロンプトが表示されたら、
ca.p12
のパスワードを入力します。 これにより、ca.crt
というファイルが生成されます。 -
CA証明書を
elastic-nodes.p12
にインポートします。keytool -importcert -keystore elastic-nodes.p12 -trustcacerts -storepass liferay -file ca.crt
新しいJDKで作成されたPKCS12 KeystoreをJDK 8で開くことができない。
Elasticsearch 8 はバンドルされている OpenJDK 19 を使用して、 elasticsearch-certutil
コマンドで証明書と秘密鍵を生成します。 Liferay が JDK 8 で動作している場合、JDK 16 以上で生成された証明書を認識できません。
このようなエラーが起こる可能性がある:
この問題を解決するには、JDK 11でLiferayを実行します。 詳細は 互換性マトリックス を参照。