LDAP サーバーへの接続が失敗し「有効な証明書が見つかりません (Could not find a valid certificate)」が表示されるIssue インスタンスでの LDAP サーバー接続のテスト時に、テストが失敗すると、次のエラーを表示します。 ldaps://xxx.xxx.xxx.xxx:636 有効な証明書が見つかりません (ldaps://xxx.xxx.xxx.xxx:636 Could not find a valid certificate) または ldap://xxx.xxx.xxx.xxx:636 有効な証明書が見つかりません (ldap://xxx.xxx.xxx.xxx:636 Could not find a valid certificate) ノードのログに、次のエラーが表示される場合があります。 2020-12-28 07:49:51 (394) worker.6 worker.6 txid=e7ba8baa1b99 SEVERE *** ERROR *** Cannot recover keyjava.security.UnrecoverableKeyException: Cannot recover key at sun.security.provider.KeyProtector.recover(KeyProtector.java:315) at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:141) at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:56) at sun.security.provider.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:96) at sun.security.provider.JavaKeyStore$DualFormatJKS.engineGetKey(JavaKeyStore.java:70) at java.security.KeyStore.getKey(KeyStore.java:1023) at sun.security.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:133) at sun.security.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:70) at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:256) at com.glide.certificates.DBKeyStoreSocketFactory.createKeyManagers(DBKeyStoreSocketFactory.java:138) at com.glide.certificates.DBKeyStoreSocketFactory.initSSLContext(DBKeyStoreSocketFactory.java:116) at com.glide.certificates.DBKeyStoreSocketFactory.init(DBKeyStoreSocketFactory.java:106) at com.glide.certificates.DBKeyStoreSocketFactory.init(DBKeyStoreSocketFactory.java:98) at com.glide.certificates.DBKeyStoreSocketFactory.<init>(DBKeyStoreSocketFactory.java:78) at com.glide.sys.ldap.LDAP.setUseDBKeyStore(LDAP.java:109) at com.glide.sys.ldap.LDAP.setup(LDAP.java:97) at sun.reflect.GeneratedMethodAccessor710.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:138) at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:300) at org.mozilla.javascript.ScriptRuntime.doCall(ScriptRuntime.java:2612) at org.mozilla.javascript.optimizer.OptRuntime.callProp0(OptRuntime.java:85) at org.mozilla.javascript.gen._refname__1064._c_testLDAPServers_1(<refname>:17) at org.mozilla.javascript.gen._refname__1064.call(<refname>) at org.mozilla.javascript.ScriptRuntime.doCall2(ScriptRuntime.java:2678) at org.mozilla.javascript.ScriptRuntime.doCall(ScriptRuntime.java:2617) at org.mozilla.javascript.optimizer.OptRuntime.callName0(OptRuntime.java:74) at org.mozilla.javascript.gen._refname__1064._c_script_0(<refname>:1) at org.mozilla.javascript.gen._refname__1064.call(<refname>) at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:563) at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3459) at org.mozilla.javascript.gen._refname__1064.call(<refname>) at org.mozilla.javascript.gen._refname__1064.exec(<refname>) at com.glide.script.ScriptEvaluator.execute(ScriptEvaluator.java:279) at com.glide.script.ScriptEvaluator.evaluateString(ScriptEvaluator.java:118) at com.glide.script.ScriptEvaluator.evaluateString(ScriptEvaluator.java:82) at com.glide.script.ScriptEvaluator.evaluateString(ScriptEvaluator.java:73) at com.glide.script.Evaluator.evaluateString(Evaluator.java:96) at com.snc.automation.ScriptJob.executeInSingleDomain(ScriptJob.java:57) at com.snc.automation.ScriptJob.execute(ScriptJob.java:41) at com.glide.schedule.JobExecutor.lambda$executeJob$0(JobExecutor.java:113) at com.glide.schedule.JobExecutor.executeJob(JobExecutor.java:116) at com.glide.schedule.JobExecutor.execute(JobExecutor.java:100) at com.glide.schedule_v2.SchedulerWorkerThread.executeJob(SchedulerWorkerThread.java:300) at com.glide.schedule_v2.SchedulerWorkerThread.lambda$process$0(SchedulerWorkerThread.java:188) at com.glide.worker.TransactionalWorkerThread.executeInTransaction(TransactionalWorkerThread.java:35) at com.glide.schedule_v2.SchedulerWorkerThread.process(SchedulerWorkerThread.java:188) at com.glide.schedule_v2.SchedulerWorkerThread.run(SchedulerWorkerThread.java:102) 2020-12-28 07:49:51 (396) worker.6 worker.6 txid=e7ba8baa1b99 WARNING *** WARNING *** LDAP API - LDAPLogger : Unable to load certificates from DB2020-12-28 07:49:51 (396) worker.6 worker.6 txid=e7ba8baa1b99 WARNING *** WARNING *** LDAP: Unable to load certificates from DB[...]2020-12-28 07:49:51 (544) worker.6 worker.6 txid=e7ba8baa1b99 LDAP API - LDAPLogger : xxx.xxx.xxx.xxx:6362020-12-28 07:49:51 (544) worker.6 worker.6 txid=e7ba8baa1b99 LDAP API - LDAPLogger : Communication error: xxx.xxx.xxx.xxx:6362020-12-28 07:49:51 (544) worker.6 worker.6 txid=e7ba8baa1b99 LDAP API - LDAPLogger : javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target2020-12-28 07:49:51 (549) worker.6 worker.6 txid=e7ba8baa1b99 SEVERE *** ERROR *** LDAP: LDAP Server: LDAP Server URL: ldap://xxx.xxx.xxx.xxx:636/ failed scheduled connection test. ErrorCode: 10402. ErrorMessage: Could not find a valid certificate.Causeこの問題には 2 つの既知の原因があります。 原因 #1 LDAPS 接続用の証明書を設定する方法については、「証明書」のドキュメントに説明があります。 証明書の信頼の項目 デフォルトで、インスタンスは証明書の認証局 (Certificate Authority, CA) を信頼するように設定されています。 そのため、インスタンスは自己発行の証明書を受け入れます。デフォルトですべての証明書を信頼しないようにするには、次の一般的なセキュリティプロパティを false に設定します。 com.glide.communications.trustmanager_trust_all com.glide.communications.trustmanager_trust_all をすでに true に設定していても、有効な証明書が見つからない というエラーが引き続き表示される場合があります。 その原因は、高セキュリティ設定のプラグイン (つまり com.glide.high_security) である可能性があります。このプラグインは、次のシステムプロパティを true に設定します。 com.glide.communications.httpclient.verify_hostname このプロパティの説明は以下のとおりです。 リモート SSL ホストによって提示されたホスト名と証明書チェーンを確認します。MITM 攻撃を防止するには true に設定します。com.glide.communications.trustmanager_trust_all プロパティをオーバーライドします。 原因 #2 x509 証明書モジュール (sys_certificate リスト ビュー) で無効な証明書が定義されています。LDAP サーバーレコードには「証明書リスト (Certificate List)」という関連リンクがあります。このリンクを選択すると、x509 証明書モジュール (sys_certificate リストビュー) に移動します。 これは、システムがそのリスト内のすべての証明書をチェックして、LDAP SSL 接続に有効な証明書を見つけることを意味します。証明書のリストの確認時、SSL 接続に対して有効な証明書に到達する前にシステムが無効な証明書を検出すると、エラーが発生します。 Resolution原因 #1 の場合、この問題を解決するには次の 2 つの方法があります。 com.glide.communications.trustmanager_trust_all プロパティを true に設定した状態で、システムプロパティ com.glide.communications.httpclient.verify_hostname を false に設定します。この構成では、システムは再度、インスタンスに証明書の認証局 CA を信頼させます。そのため、インスタンスは自己発行の証明書を受け入れます。上記の証明書に関するドキュメント「 証明書」に従って、信頼できるサードパーティの認証局によって発行された LDAP サーバーのインスタンスに SSL 証明書 (自己発行されていない証明書など) をアップロードします。 信頼できるサードパーティによって署名された証明書がインスタンスにインストールされている場合は、次のようにして、両方のシステムプロパティを自己発行の証明書を受け入れないように設定できます。 com.glide.communications.trustmanager_trust_all = false および com.glide.communications.httpclient.verify_hostname = true com.glide.communications.httpclient.verify_hostname は com.glide.communications.trustmanager_trust_all をオーバーライドするため、実際には com.glide.communications.httpclient.verify_hostname を true に設定するだけで十分です。com.glide.communications.trustmanager_trust_all が true に設定されているかどうかに関係なく、com.glide.communications.httpclient.verify_hostname が true に設定されている場合、インスタンスは自己発行の証明書を受け入れません。 同じエラーが続く場合は、LDAP サーバーレコードに移動し、[SSL] ボックスをオンにし (まだオンになっていない場合)、変更を保存してから、「テスト接続」をもう一度試してください。 注:London 以降のバージョンでは、プロパティ com.glide.communications.httpclient.verify_revoked_certificate の設定も影響する場合があります。 「KB0727750 - London 以降のリリースでは、Web サービスのコンシューマが証明書チェーンを使用している場合はインスタンスを使用してアウトバウンドの Web サービス呼び出しを行うことはできない (From London release onwards, Instance is not available to make any outbound webservice call if the webservice consumer uses the certificate chain)」を参照してください。 原因 #2 の場合 x509 証明書モジュール (sys_certificate リストビュー) に移動します。リストで各証明書を開き、「ストア/証明書を検証 (Validate Stores/Certificates)」関連リンクを選択します。証明書の検証に失敗する場合は、Active = false に設定し、LDAP 接続を再度確認します。問題の原因となっている 1 つまたは複数の証明書が見つかるまで、各証明書を無効にします。 問題のある証明書が見つかったら、当該の証明書を非アクティブのままにするか、問題を修正して有効にします。たとえば、キーストアの正しいパスワードを入力するか、キーストアの添付ファイルを追加するか、PEM 証明書の値を有効な値 (期限切れではない値など) に更新します。証明書が検証に合格したら、再度アクティブにすることができます。 証明書の処理が完了したら、LDAP 接続をもう一度チェックして、正常に接続されていることを確認します。