SSLエラー「WRONG_VERSION_NUMBER」の原因と解決方法
問題の概要
Error: write EPROTO 34557064:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER
というエラーは、SSL/TLS接続においてクライアントとサーバー間のバージョン不一致が発生した場合に表示されます。主にHTTPリクエストの送信時、特にHTTPS接続を試みる際に発生します。
このエラーは、クライアントが期待するSSL/TLSプロトコルバージョンとサーバーが提供するバージョンが一致しないことを示しています。
主な原因
このエラーが発生する主な原因は以下の通りです:
- HTTPS接続を試みているが、サーバーがHTTPのみをサポートしている
- リダイレクト設定の問題
- 不正なHTTPヘッダー設定
- SSL証明書の設定誤り
- プロキシ設定の問題
解決方法
1. HTTPとHTTPSの確認
最も一般的な解決策は、接続先のプロトコルを確認することです。ローカル開発環境など、SSL/TLSが正しく設定されていないサーバーにHTTPSで接続しようとするとこのエラーが発生します。
// エラーが発生する例(HTTPS)
https://localhost:3000/api/data
// 修正例(HTTP)
http://localhost:3000/api/data
WARNING
本番環境では常にHTTPSを使用すべきですが、開発環境ではHTTPを使用することで問題を回避できる場合があります。
2. Postmanでの設定確認
APIテストツールであるPostmanを使用している場合は、以下の設定を確認してください:
リダイレクトの自動追従を無効化
設定 → Settings → General → "Automatically follow redirects" をオフにする
ホストヘッダーの確認
手動で設定した「Host」ヘッダーがある場合、削除またはデフォルト値に戻す
SSL証明書検証の無効化(開発環境のみ)
設定 → Settings → General → "SSL certificate verification" をオフにする
注意
SSL証明書検証の無効化は開発環境のみで行い、本番環境では有効のままにしてください。セキュリティリスクがあります。
3. サーバーサイドの設定(Nginx)
バックエンドサーバーを運用している場合、Nginxの設定を確認してください:
# 誤った設定
listen 443;
# 正しい設定
listen 443 ssl;
SSLポートでリッスンする場合、明示的に ssl
ディレクティブを追加する必要があります。
4. 証明書設定の詳細入力
Postmanでカスタム証明書を使用する場合、ポート番号の入力欄にプレースホルダー値が表示されていても、実際に入力する必要があります:
ホスト: your-domain.com
ポート: 443 (プレースホルダーではなく実際に入力)
根本原因の理解
このエラーは、クライアントがSSL/TLSハンドシェイクを開始したものの、サーバーからの応答が期待するSSL/TLSバージョンと一致しなかったことを示しています。以下のような状況で発生します:
- クライアントがHTTPS接続を試みるが、サーバーがHTTPのみをサポート
- 中間者(プロキシやロードバランサー)が不正な方法で接続を処理
- 証明書の設定誤りや期限切れ
トラブルシューティングの流れ
まとめ
WRONG_VERSION_NUMBER
SSLエラーは、主にクライアントとサーバー間のプロトコル不一致によって発生します。開発環境ではHTTPへの切り替えが簡単な解決策となりますが、本番環境ではサーバー設定の適切な確認と修正が必要です。
問題解決には、クライアント側の設定確認から始め、必要に応じてサーバー側の設定も確認する系統的なアプローチが効果的です。