WordPressサイトにSecure Sockets Layer(SSL)証明書をインストールすると、HTTPSを利用した安全な通信が可能になります。しかし、有効なSSL証明書の確認や、サイトのサーバーと訪問者のブラウザ間での接続確立の過程で、さまざまな問題に遭遇することがあります。
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エラーはクライアント側とサーバー側のいずれでも発生する可能性があります。クライアント側でよく見られる原因としては、以下のようなものがあります。
- デバイスの日付や時刻が正しく設定されていない
- ブラウザの設定に問題がある
- 通信が第三者によって傍受されている
一方で、サーバー側の主な原因には以下のようなものがあります。
- 暗号スイート(Cipher Suites)の不一致
- クライアントが使用しているプロトコルがサーバーでサポートされていない
- 証明書が不完全、無効、または有効期限切れ
一般的には、SSLハンドシェイクが失敗する場合、サイトやサーバー側のSSL設定に原因があるケースが多いです。
SSLハンドシェイクエラーの解決方法(5種類)
1. システムの日付と時刻を確認・修正する
2. SSL証明書が有効かどうかを確認する
SSL証明書には有効期限があり、常に正しい検証情報を維持するための仕組みになっています。一般的に、有効期間は6ヶ月から2年程度です。
証明書が失効していたり、期限切れだったりすると、ブラウザがそれを検知し、SSLハンドシェイクを完了できなくなります。もしSSL証明書をサイトに導入してから1年以上経過している場合は、再発行を検討するタイミングかもしれません。
SSL証明書の状態を確認するには、Qualysが提供しているようなSSLチェッカーツールを利用すると便利です。

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

このページでは、SSL証明書が現在も有効かどうか、また何らかの理由で失効していないかを確認できます。
いずれの場合でも、SSL証明書を更新することでハンドシェイクエラーは解消される可能性があります(サイトやWooCommerceストアの安全性を維持するうえでも更新は非常に重要)。
3. ブラウザが最新のSSL/TLSプロトコルに対応しているか確認する
問題の根本原因を特定するには、「切り分け」が有効な場合があります。前述のとおり、SSLハンドシェイクの失敗はブラウザの設定ミスが原因で起こることも少なくありません。
特定のブラウザに問題があるかどうかを手早く確認するには、別のブラウザに切り替えてみてください。これにより、原因の範囲を絞り込むことができます。また、ブラウザの拡張機能を無効化したり、設定を初期状態にリセットしたりするのも手です。
さらに、ブラウザ関連の問題として、プロトコルの不一致があります。たとえば、サーバーがTLS 1.2のみをサポートしているのに対し、ブラウザ側がTLS 1.0やTLS 1.1しか有効になっていない場合、共通のプロトコルが存在せず、SSLハンドシェイクは失敗します。
この問題の確認方法はブラウザによって異なりますが、ここではChromeでの手順をご紹介します。まずはブラウザを開き、「設定」>「システム」を選択し、「パソコンのプロキシ設定を開く」をクリックします。

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

また、「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」をクリックします。

# 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」セクションで使用されている暗号スイートの情報を確認できます。

このページでは、サーバーがサポートしている暗号方式(cipher)やプロトコルを確認できます。特に「weak(脆弱)」と表示されているものがないかに注意しましょう。また、このセクションでは各暗号スイートに含まれる具体的なアルゴリズムの詳細も確認できます。
エラーを解決するには、QualysのSSL/TLS Capabilities of Your Browserツールを使って、ブラウザ側がサポートしている内容と比較するのが有効です。さらに、暗号スイートについてより詳しく理解したい場合はこちらも参考になります。
まとめ
「SSL Handshake Failed」のエラーメッセージは、SSL関連エラーの中でも特に原因が分かりにくく、それでいて比較的よく発生する問題の一つです。クライアント側とサーバー側の両方に原因がある可能性があるため、対応に手こずる人も少なくありません。
今回ご紹介したように原因を切り分けながら確認していけば、解決することができます。
- システムの日付と時刻を確認・修正する
- SSL証明書が有効かどうかを確認する(必要に応じて再発行)
- ブラウザが最新のTLS/SSLバージョンに対応しているか確認する
- サーバーがSNIに正しく対応しているか確認する
- 暗号スイート(Cipher Suites)が一致しているか確認する
これらを順番にチェックしていくことで、ハンドシェイクエラーの原因特定と解決につながるはずです。