![OpenSSL は、443 ポート上の URL の証明書チェーンの検証にランダムに失敗しますが、すべてのインスタンス ポートを検証できます。](https://rvso.com/image/756808/OpenSSL%20%E3%81%AF%E3%80%81443%20%E3%83%9D%E3%83%BC%E3%83%88%E4%B8%8A%E3%81%AE%20URL%20%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%81%AE%E6%A4%9C%E8%A8%BC%E3%81%AB%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%20%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82.png)
困惑しているので、どなたか助けていただければ幸いです。私のチームは、サービスで中間証明書が見つからないという問題に悩まされています。私は、トラフィックの多いサービス URL を 1 つずつ継続的にテストして、証明書チェーンが完全であることを確認するスクリプトを作成するように依頼されました。OpenSSL を実行して出力を解析する C# プログラムを作成しました。各 URL で実行した OpenSSL コマンドは次のとおりです。
"openssl.exe s_client -showcerts -servername " + uri + " -verify_hostname " + uri + " -connect " + uri +":" + port
または
openssl.exe s_client -showcerts -servername www.euro-example-01.com -verify_hostname www.euro-example-01.com -connect www.euro-example-01.com:443
ポートはデフォルトで 443 であり、99% の時間使用されます。OpenSSL が を返した場合“Verify return code: 21 (unable to verify the first certificate)”
、中間証明書が欠落していることがわかり、アラートが発行されます。さらに、OpenSSL はこれを検証するためにチェーンを出力します。これは、incomplete-chain.badssl.com などのサイトに対してテストするときに機能しました。
現在はクラウドで継続的に実行されており、時々アラートが送信されます。ただし、当社のサービスエンジニアはインスタンスポートを使用して、障害が発生したURLの各サーバーを何度もチェックし、失敗しているケースは0件ラウンドロビン ロード バランシングを使用しているため、これらの個々のサーバーの少なくとも 1 つが 443 の失敗の原因であると予想すべきではないでしょうか。:443 の失敗ケースの OpenSSL ログには、チェーン内の証明書が 1 つだけ表示され、SSLLabs などのサイトでも中間証明書が欠落していることが確認されています。
弊社のエンジニアが問題のあるエンドポイントを再起動すると、完全なチェーンが検出され、中間物が見つからないというアラートは消えます。
おそらく最も奇妙なのは、約 160 個の異なる URL すべてではなく、4 つの URL だけをテストするための別のスクリプトを設定したことです。昨日、30 分間でeuro-example-01.com:443
12 回テストされ、元のスクリプトではそのうち 6 回失敗しました。同じ 30 分間で、新しい、より小さなテスト サイズのスクリプトではeuro-example-01.com:443
12 回テストされ、12 回すべて成功しました。2 つのスクリプトが異なるサーバーにアクセスしただけかもしれませんが、私には疑わしいように思えます。
先ほども言ったように、なぜこのようなことが起きているのかわかりません。サービス エンジニアにロード バランサーをチェックしてもらいましたが、問題なく動作しているとのことでした。テストが失敗し始めるきっかけとなるパターンは見つかっていません。なぜこのようなことが起きているのか、心当たりのある方はいらっしゃいますか? あるいは、:443 を使用してテストするときに、どのインスタンス ポートがヒットしているかを知る方法はありますか? :443 ではなくインスタンス ポートでのテストに変更する必要があるかもしれませんが、インスタンス数は定期的に変化し、その数も膨大です。
ご協力いただける場合は、事前に感謝いたします。
要約: URL の 443 ポートは中間証明書を返しませんが、当該 URL の個々のサーバーをチェックすると、中間証明書が常に見つかります。