WordPressサイトにSecure Sockets Layer(SSL)証明書をインストールすると、HTTPSを利用した安全な通信が可能になります。しかし、有効なSSL証明書の確認や、サイトのサーバーと訪問者のブラウザ間での接続確立の過程で、さまざまな問題に遭遇することがあります。

たとえば、「SSL Handshake Failed(SSLハンドシェイク失敗)」といったエラーメッセージはよく見られますが、表示される情報だけでは原因を特定しづらいのが特徴です。このエラーの解決にお困りの方は、この記事が役立つはずです。

SSLハンドシェイクエラーの概要と主な原因、そしてトラブルシューティング方法を5種類ご紹介します。

SSLハンドシェイクとは?

TLS/SSLのハンドシェイクエラーの原因を詳しく見ていく前に、まず「TLS/SSLハンドシェイク」とは何かを理解しておきましょう。Secure Sockets Layer(SSL)Transport Layer Security(TLS)は、サーバーとブラウザなどの外部システム間でデータ通信を認証するためのプロトコルです。

HTTPSでサイトを安全に保護するには、SSL証明書が必要になります。なお、TLSとSSLの違いはこちらでご紹介していますが、基本的には両者は同じ意味で使われることが多いため、この記事ではまとめて「SSL」と表記します。

SSLハンドシェイクとは、HTTPS接続を確立する際に最初に行われるプロセスです。安全な通信を実現するために、ユーザーのブラウザ(クライアント)とサイトのサーバーは、一連の確認処理(=ハンドシェイク)を行い、接続に必要なパラメータを決定します。

具体的には、まずクライアント(通常はブラウザ)がサーバーに対して安全な接続を要求します。リクエストを受け取ったサーバーは公開鍵を返し、その鍵が信頼できる証明書に基づいているかを検証。その後、クライアント側で共通鍵が生成され、サーバーから受け取った公開鍵を使って暗号化されます。

このSSLハンドシェイクが正常に行われなければ、安全な接続は確立されません。これはセキュリティ上大きなリスクとなる可能性があり、またプロセス自体が複雑で複数の要素が関わっている点も見逃せません。

そのため、どこかで問題が発生するとハンドシェイクが失敗したり、「接続はプライベートではありません」といったエラーが表示されたりすることがあります。その結果、訪問者がサイトから離脱してしまう原因にもなり得ます。

SSLハンドシェイクエラーの原因を理解する

SSLハンドシェイクエラー(525エラー)は、サーバーとブラウザ間で安全な接続を確立できなかったことを意味します。このエラーは、さまざまな要因によって発生します。

一般的に525エラーは、Cloudflareを利用しているドメインとオリジンサーバー間のSSLハンドシェイクが失敗した場合に表示されます。

SSLハンドシェイクエラー
SSLハンドシェイクエラー

なお、SSLエラーはクライアント側とサーバー側のいずれでも発生する可能性があります。クライアント側でよく見られる原因としては、以下のようなものがあります。

  • デバイスの日付や時刻が正しく設定されていない
  • ブラウザの設定に問題がある
  • 通信が第三者によって傍受されている

一方で、サーバー側の主な原因には以下のようなものがあります。

  • 暗号スイート(Cipher Suites)の不一致
  • クライアントが使用しているプロトコルがサーバーでサポートされていない
  • 証明書が不完全、無効、または有効期限切れ

一般的には、SSLハンドシェイクが失敗する場合、サイトやサーバー側のSSL設定に原因があるケースが多いです。

SSLハンドシェイクエラーの解決方法(5種類)

SSLハンドシェイクエラーの原因は複数あるため、「こうすればOK」という決まった解決策はありませんが、問題の切り分けと解決に役立つ基本的なアプローチはいくつかあります。原因となり得る要素を一つずつ確認していくことで、エラーの解消につなげることができます。以下、5つのトラブルシューティング方法をご紹介します。

1. システムの日付と時刻を確認・修正する

まずは、可能性としてはやや低いものの、お使いのパソコンの日時設定を確認することをおすすめします。

システムの日付や時刻が正しくない場合、SSLハンドシェイクの妨げになることがあります。たとえば、実際の時刻よりも大きく未来に設定されていると、SSL証明書の有効性チェックに影響を与えます。

こうしたズレは、単純な設定ミスだけでなく、システムの不具合によって発生することもあります。原因が何であれ、一度システムの時刻が正しいかどうかを確認し、必要に応じて修正しておくことをおすすめします。

正しい日時が表示されている場合は、次のトラブルシューティングに移りましょう。

2. SSL証明書が有効かどうかを確認する

SSL証明書には有効期限があり、常に正しい検証情報を維持するための仕組みになっています。一般的に、有効期間は6ヶ月から2年程度です。

証明書が失効していたり、期限切れだったりすると、ブラウザがそれを検知し、SSLハンドシェイクを完了できなくなります。もしSSL証明書をサイトに導入してから1年以上経過している場合は、再発行を検討するタイミングかもしれません。

SSL証明書の状態を確認するには、Qualysが提供しているようなSSLチェッカーツールを利用すると便利です。

Qualys提供のSSLチェッカーツール
Qualys提供のSSLチェッカーツール

このツールは高品質かつ無料で利用できます。使い方も簡単で、「Hostname」フィールドにドメイン名を入力し、「Submit」をクリックするだけOKです。すると、サイトのSSL設定を分析した結果が表示されます。

QualysのSSLチェッカーの結果ページ
QualysのSSLチェッカーの結果ページ

このページでは、SSL証明書が現在も有効かどうか、また何らかの理由で失効していないかを確認できます。

いずれの場合でも、SSL証明書を更新することでハンドシェイクエラーは解消される可能性があります(サイトやWooCommerceストアの安全性を維持するうえでも更新は非常に重要)。

3. ブラウザが最新のSSL/TLSプロトコルに対応しているか確認する

問題の根本原因を特定するには、「切り分け」が有効な場合があります。前述のとおり、SSLハンドシェイクの失敗はブラウザの設定ミスが原因で起こることも少なくありません。

特定のブラウザに問題があるかどうかを手早く確認するには、別のブラウザに切り替えてみてください。これにより、原因の範囲を絞り込むことができます。また、ブラウザの拡張機能を無効化したり、設定を初期状態にリセットしたりするのも手です。

さらに、ブラウザ関連の問題として、プロトコルの不一致があります。たとえば、サーバーがTLS 1.2のみをサポートしているのに対し、ブラウザ側がTLS 1.0やTLS 1.1しか有効になっていない場合、共通のプロトコルが存在せず、SSLハンドシェイクは失敗します。

この問題の確認方法はブラウザによって異なりますが、ここではChromeでの手順をご紹介します。まずはブラウザを開き、「設定」>「システム」を選択し、「パソコンのプロキシ設定を開く」をクリックします。

Google Chromeのシステム設定ページ
Google Chromeのシステム設定ページ

ウィンドウが開いたら、「詳細設定」タブを選択して、「セキュリティ」セクションの「TLS 1.2の使用」にチェックが入っているかを確認してください。入っていない場合は、チェックを入れてください。

Windowsのインターネットプロパティの詳細設定
Windowsのインターネットプロパティの詳細設定

また、「SSL 2.0を使用する」および「SSL 3.0を使用する」のチェックは外しておくことをおすすめします。

同様に、TLS 1.0およびTLS 1.1は非推奨であるため、無効にしましょう。設定を変更したら「OK」をクリックし、ハンドシェイクエラーが解消されているかを確認してみてください。

SafariやmacOSでは、TLSバージョンを個別に有効・無効化するユーザー向けの設定は提供されていません。TLS 1.2以降はデフォルトで有効となっており、TLS 1.0および1.1はサポートされていません。また、Linux環境の場合は、Red HatのTLSハードニングに関する解説が参考になります。

4. サーバーがSNIに正しく対応しているか確認する

SSLハンドシェイクの失敗は、Server Name Indication(SNI)の設定不備が原因で発生することもあります。SNIとは、1つのIPアドレスで複数のTLS証明書を安全に運用するための仕組みです。

通常、サーバー上の各サイトにはそれぞれ固有のSSL証明書が割り当てられています。サーバーがSNIに対応していない場合、どの証明書を提示すべきか判断できず、SSLハンドシェイクが失敗することがあります。

サイトがSNIを必要としているかどうかを確認する方法はいくつかあり、たとえば前のセクションで紹介したQualysのSSLチェッカーでも確認できます。ドメイン名を入力し、「Submit」をクリックします。

QualysのSSLチェッカーツールの結果ページ
QualysのSSLチェッカーツールの結果ページ

また、「ClientHello」メッセージに含まれるサーバー名を確認する手段もあります。こちらはやや高度な方法ですが、より詳細な情報を得ることができます。

拡張されたHelloヘッダー内にある「server_name」フィールドをチェックし、適切な証明書が提示されているかを確認してください。

OpenSSLツールキットWiresharkなどのツールに慣れている場合は、この方法がおすすめです。たとえば、openssl s_clientコマンドを-servernameオプションあり・なしの両方で実行し、挙動の違いを比較することでチェックできます。

# without SNI
 $ openssl s_client -connect host:port 

 # use SNI
 $ openssl s_client -connect host:port -servername host

-servernameオプションの有無で実行した結果、同じドメイン名に対して同一の証明書が返ってくる場合は、SNIが正しくサポート・設定されていると判断できます。

一方で、返される証明書の内容が異なる、あるいはSNIなしの接続でSSLが確立できない場合は、SNIが必要であるにもかかわらず正しく設定されていない可能性があります。この場合は、専用IPアドレスへの切り替えなどの対応が必要になることもあります。

5. 暗号スイート(Cipher Suites)が一致しているか確認する

ここまでを実践してもエラーが解決できない場合は、暗号スイート(cipher suites)の不一致が原因かもしれません。暗号スイートとは、鍵交換・データの暗号化・メッセージ認証コード(MAC)など、SSL/TLS通信を安全に行うための複数のアルゴリズムの組み合わせを意味します。

サーバー側で使用している暗号スイートが、Cloudflare側で利用されているものと一致していない、あるいはサポートされていない場合、ハンドシェイクエラーが発生することがあります。

これについても、先ほどのQualysのSSLチェッカーが役立ちます。ドメイン名を入力して「Submit」をクリックすると、分析結果の概要ページが表示されます。その中の「Cipher Suites」セクションで使用されている暗号スイートの情報を確認できます。

QualysのSSLレポートのCipher Suitesセクション
QualysのSSLレポートのCipher Suitesセクション

このページでは、サーバーがサポートしている暗号方式(cipher)やプロトコルを確認できます。特に「weak(脆弱)」と表示されているものがないかに注意しましょう。また、このセクションでは各暗号スイートに含まれる具体的なアルゴリズムの詳細も確認できます。

エラーを解決するには、QualysのSSL/TLS Capabilities of Your Browserツールを使って、ブラウザ側がサポートしている内容と比較するのが有効です。さらに、暗号スイートについてより詳しく理解したい場合はこちらも参考になります。

まとめ

「SSL Handshake Failed」のエラーメッセージは、SSL関連エラーの中でも特に原因が分かりにくく、それでいて比較的よく発生する問題の一つです。クライアント側とサーバー側の両方に原因がある可能性があるため、対応に手こずる人も少なくありません。

今回ご紹介したように原因を切り分けながら確認していけば、解決することができます。

  • システムの日付と時刻を確認・修正する
  • SSL証明書が有効かどうかを確認する(必要に応じて再発行)
  • ブラウザが最新のTLS/SSLバージョンに対応しているか確認する
  • サーバーがSNIに正しく対応しているか確認する
  • 暗号スイート(Cipher Suites)が一致しているか確認する

これらを順番にチェックしていくことで、ハンドシェイクエラーの原因特定と解決につながるはずです。

Matteo Duò

Head of Content at Kinsta and Content Marketing Consultant for WordPress plugin developers. Connect with Matteo on Twitter.