curl エラーコード:完全リファレンス

curl コマンドが失敗すると、エラーの種類を特定する数値の終了コード(curl エラーコードとも呼ばれます)が返されます。curl コマンドの直後に echo $?(PowerShell の場合は $LASTEXITCODE)を実行することで、curl の終了コードを確認できます。終了コード 0 は成功を意味し、それ以外の数値は、DNS 解決の失敗や接続タイムアウトから SSL 証明書の問題まで、特定の問題を示します。このページは、最も一般的な curl エラーコードの解説、原因、および修正方法をまとめた完全なリファレンスです。コード内で curl コマンドを使用している場合は、curl2code に貼り付けて、お好みのプログラミング言語に変換してください。

クイックリファレンス表

0CURLE_OK

成功。操作はエラーなく完了しました。

1CURLE_UNSUPPORTED_PROTOCOL

サポートされていないプロトコル。URL で使用されているプロトコルは、この curl のビルドではサポートされていません。

3CURLE_URL_MALFORMAT

不正な形式の URL。URL の構文が無効であるか、解析できませんでした。

5CURLE_COULDNT_RESOLVE_PROXY

プロキシを解決できませんでした。指定されたプロキシのホスト名を解決できませんでした。

6CURLE_COULDNT_RESOLVE_HOST

DNS ルックアップ失敗。ホスト名を IP アドレスに解決できませんでした。

7CURLE_COULDNT_CONNECT

TCP 接続失敗。サーバーがダウンしているか、ポートがブロックされているか、ファイアウォールが接続を拒否しています。

18CURLE_PARTIAL_FILE

不完全なファイル。転送が中断され、ファイルの一部のみが受信されました。

22CURLE_HTTP_RETURNED_ERROR

サーバーが HTTP エラー (4xx/5xx) を返し、--fail フラグが使用されました。

23CURLE_WRITE_ERROR

書き込みエラー。curl が受信したデータをディスクに書き込めませんでした(権限拒否またはディスクフル)。

28CURLE_OPERATION_TIMEDOUT

操作が最大許容時間を超えました(DNS、接続、または転送)。

35CURLE_SSL_CONNECT_ERROR

SSL/TLS ハンドシェイク失敗。プロトコルバージョンまたは暗号スイートの不一致。

37CURLE_FILE_COULDNT_READ_FILE

ファイルを読み込めませんでした。リクエストで参照されているローカルファイルを開くか読み取ることができませんでした。

52CURLE_GOT_NOTHING

サーバーからの空の返信。サーバーがデータを送信せずに接続を閉じました。

56CURLE_RECV_ERROR

接続がリセットされました。データ転送中にサーバーが接続を切断しました。

60CURLE_SSL_CACERT

SSL 証明書の検証に失敗しました。期限切れ、自己署名、または CA バンドルが古いです。

77CURLE_SSL_CACERT_BADFILE

SSL CA 証明書の問題。指定された CA 証明書ファイルを読み取るか解析できませんでした。

92CURLE_HTTP2_STREAM

HTTP/2 ストリームエラー。転送中に HTTP/2 プロトコルレベルのストリームエラーが発生しました。

エラー 6: ホストを解決できませんでした

意味
ターミナルに curl: (6) Could not resolve host と表示されます。curl がホスト名を IP アドレスに解決できませんでした。接続を試行する前に DNS ルックアップが失敗しています。
原因
主な原因は、ホスト名の入力ミス(例:curl https://apiexample.com ではなく api.example.com)、DNS サーバーの問題(設定された DNS がダウンしているか到達不能)、ネットワーク接続なし(Wi-Fi や VPN の切断)、またはドメインが実際に存在しないことです。
修正方法
まず、URL が正しいか確認してください。次に、nslookup api.example.comdig api.example.com を使用して DNS 解決を直接テストします。DNS が失敗する場合は、別の DNS サーバーを試してください:curl --dns-servers 8.8.8.8 https://api.example.com/etc/resolv.conf やネットワーク設定を確認してください。社内 VPN を使用している場合は、内部 DNS がホストを解決できるか確認してください。
$ curl https://api.exmple.com/users

エラー 7: 接続に失敗しました

意味
ターミナルに curl: (7) Failed to connect to host port: Connection refused と表示されます。curl はホスト名を解決しましたが、サーバーへの TCP 接続を確立できませんでした。接続が明示的に拒否されたか、TCP レベルでタイムアウトしました。
原因
一般的な原因には、サーバーがダウンしているファイアウォールがポートをブロックしている(ローカルとサーバー側の両方を確認)、ポート番号が間違っている(例:サービスは 8080 で動作しているが 443 に接続している)、または高負荷によりサーバーの listen バックログがいっぱいになっていることが挙げられます。
修正方法
サーバーが動作しているか確認してください:ping api.example.com および telnet api.example.com 443。正しいポートが開いているか確認してください:nmap -p 443 api.example.com。テストのために一時的にローカルファイアウォールを無効にします。Docker を使用している場合は、コンテナポートが公開されているか確認してください。詳細モード curl -v https://api.example.com で実行し、接続がどこで失敗するかを確認してください。
$ curl https://localhost:8080/api

エラー 22: HTTP エラーが返されました

意味
ターミナルに curl: (22) The requested URL returned error と表示されます。サーバーが HTTP エラーステータスコード(4xx または 5xx)を返し、curl が -f または --fail オプション付きで実行されました。これにより、curl は HTTP エラーを失敗として扱います。
原因
このエラーは、400 (Bad Request)、401 (Unauthorized)、403 (Forbidden)、404 (Not Found)、500 (Internal Server Error) などの HTTP ステータスコードによって発生しますが、--fail が使用されている場合に限ります--fail がない場合、curl は HTTP エラーが発生しても終了コード 0 で終了します。一般的な原因:URL の間違い、認証不足、権限不足、またはサーバー側のバグ。
修正方法
--fail なしで curl を実行して、レスポンスボディ全体を確認してください。多くの場合、実際のエラーメッセージが含まれています。HTTP ステータスコードを確認するには:curl -w "%{http_code}" -o /dev/null -s URL を実行します。401/403 の場合は認証トークンや API キーを確認し、404 の場合は URL パスを再確認してください。500 の場合はサーバー側の問題です。
$ curl --fail https://api.example.com/nonexistent

エラー 28: 操作がタイムアウトしました

意味
ターミナルに curl: (28) Operation timed out または curl: (28) Connection timed out と表示されます。操作に許容時間以上の時間がかかりました。これは最も一般的な curl エラーで、DNS 解決、TCP 接続、SSL ハンドシェイク、またはデータ転送中に発生する可能性があります。
原因
典型的な原因には、サーバーの低速または過負荷による応答遅延、ネットワークの混雑やパケットロス、ファイアウォールによるパケットのサイレントドロップ(拒否ではなく無応答)、--connect-timeout--max-time による厳しすぎるタイムアウト設定、またはプロキシの誤設定による遅延が含まれます。
修正方法
タイムアウト値を増やしてください:curl --connect-timeout 30 --max-time 120 URL。詳細モード curl -v URL を使用して、どこで停止するかを確認します。ネットワークの遅延をテストしてください:ping api.example.com および traceroute api.example.com。プロキシを使用している場合は、バイパスを試してください:curl --noproxy '*' URL。大容量ファイルの転送では、--retry 3--retry-delay 5 の使用を検討してください。
$ curl --connect-timeout 5 https://slow-api.example.com/data

エラー 35: SSL 接続エラー

意味
ターミナルに curl: (35) SSL connect error と表示されます。SSL/TLS ハンドシェイクに失敗しました。curl がサーバーとの安全な接続を確立できませんでした。
原因
一般的な原因:TLS バージョンの不一致(サーバーは TLS 1.3 を要求しているが、curl が TLS 1.2 までしかサポートしていない)、暗号スイートの非互換性サーバーの SSL 誤設定(期限切れの証明書、不完全なチェーン)、サーバーが指定されたポートで HTTPS をサポートしていない、またはプロキシやファイアウォールによる SSL 接続の傍受 (MITM)。
修正方法
特定の TLS バージョンを強制します:curl --tlsv1.2 URL または curl --tlsv1.3 URL。サーバーがサポートしている内容を確認してください:openssl s_client -connect api.example.com:443。curl と OpenSSL を最新バージョンに更新してください。サーバーが自己署名証明書を使用している場合、通常はエラー 60 になります。エラー 35 は通常、プロトコルレベルのハンドシェイク失敗を示します。
$ curl https://legacy-server.example.com/api

エラー 56: 受信失敗 — 接続がリセットされました

意味
ターミナルに curl: (56) Recv failure: Connection reset by peer と表示されます。接続は正常に確立されましたが、データの受信に失敗しました。転送中にサーバーが予期せず接続を閉じたか、リセットしました。
原因
これは多くの場合、サーバーが転送途中でクラッシュまたは再起動した、ロードバランサーやプロキシが接続を切断した(アイドルタイムアウト、リクエストが大きすぎる)、ファイアウォールが長時間接続を終了させた、サーバーの keep-alive タイムアウトが想定より短い、またはクライアントとサーバー間のネットワーク障害が発生したときに起こります。
修正方法
リクエストを再試行してください。一時的なネットワークの問題が最も一般的な原因です。詳細モード curl -v URL を使用して、失敗した正確なポイントを確認してください。大容量のアップロード中にエラーが発生する場合は、チャンク転送を試してください:curl -H "Transfer-Encoding: chunked" URLRPC failed; curl 56 と表示される Git 操作の場合は、バッファを増やしてください:git config http.postBuffer 524288000
$ curl https://api.example.com/large-download

エラー 60: SSL 証明書の問題

意味
ターミナルに curl: (60) SSL certificate problem: unable to get local issuer certificate と表示されます。curl が CA(認証局)バンドルに対してサーバーの SSL 証明書を検証できませんでした。TLS ハンドシェイクはプロトコルレベルで完了しましたが、証明書の検証に失敗しました。
原因
主な原因:サーバーが自己署名証明書を使用している、証明書が期限切れである、証明書チェーンが不完全(中間証明書が不足)、curl の CA バンドルが古い(古いシステムや Docker コンテナで一般的)、または証明書の Common Name / SAN がリクエストされたホスト名と一致しない
修正方法
CA バンドルを更新してください:curl --cacert /path/to/cacert.pem URL。https://curl.se/ca/cacert.pem から更新されたバンドルをダウンロードします。診断するには:openssl s_client -connect api.example.com:443 -showcerts。開発中の自己署名証明書の場合は、curl -k URL を使用します(本番環境では絶対に使用しないでください。すべての証明書検証が無効になります)。Docker では ca-certificates パッケージをインストールしてください。
$ curl https://self-signed.example.com/api

その他のエラーコード

0CURLE_OK

成功。操作はエラーなく完了しました。

1CURLE_UNSUPPORTED_PROTOCOL

サポートされていないプロトコル。URL で使用されているプロトコルは、この curl のビルドではサポートされていません。

3CURLE_URL_MALFORMAT

不正な形式の URL。URL の構文が無効であるか、解析できませんでした。

5CURLE_COULDNT_RESOLVE_PROXY

プロキシを解決できませんでした。指定されたプロキシのホスト名を解決できませんでした。

18CURLE_PARTIAL_FILE

不完全なファイル。転送が中断され、ファイルの一部のみが受信されました。

23CURLE_WRITE_ERROR

書き込みエラー。curl が受信したデータをディスクに書き込めませんでした(権限拒否またはディスクフル)。

37CURLE_FILE_COULDNT_READ_FILE

ファイルを読み込めませんでした。リクエストで参照されているローカルファイルを開くか読み取ることができませんでした。

52CURLE_GOT_NOTHING

サーバーからの空の返信。サーバーがデータを送信せずに接続を閉じました。

77CURLE_SSL_CACERT_BADFILE

SSL CA 証明書の問題。指定された CA 証明書ファイルを読み取るか解析できませんでした。

92CURLE_HTTP2_STREAM

HTTP/2 ストリームエラー。転送中に HTTP/2 プロトコルレベルのストリームエラーが発生しました。

curlエラーのデバッグ方法

curlが失敗した際、DNS解決からSSLハンドシェイク、レスポンスペイロードに至るまで、これら3つのフラグが根本原因を素早く特定するのに役立ちます。

  1. 1

    詳細出力(verbose)を有効にする

    curl -v URL を実行して、DNS解決、TCP接続、TLSハンドシェイク、送信されたリクエストヘッダー、受信したレスポンスヘッダーなど、リクエスト/レスポンスの全サイクルを確認します。これは最も有用なデバッグフラグです。

  2. 2

    HTTPステータスコードを確認する

    curl -o /dev/null -s -w "%{http_code}" URL を実行すると、レスポンスボディを除いたHTTPステータスコード(200、404、500など)のみを取得できます。クイックなヘルスチェックやスクリプト作成に便利です。

  3. 3

    エラーのみをサイレントに表示する

    curl -sS URL を実行して、プログレスバーを抑制し(-s)、エラーのみを表示(-S)させます。クリーンな出力を求めつつ、失敗をキャッチする必要があるスクリプトに最適です。

よくある質問

curlの終了コードを確認する方法は?

curlコマンドの実行後、終了コードはシェルの特殊変数に格納されます。Bash/Zshでは、curlコマンドの直後に echo $? を実行します。PowerShellでは $LASTEXITCODE を使用します。スクリプト内では、条件文で確認できます:if curl -sf URL; then echo "OK"; else echo "Failed with code $?"; fi。終了コード0は成功を意味し、それ以外の数値はエラーを示します。HTTPステータスコードとcurlの終了コードの両方を確認するには、curl -w "%{http_code}" -o /dev/null -s URL; echo "Exit: $?" を組み合わせます。curlの終了コードはHTTPステータスコードとは異なることに注意してください。--fail フラグを使用しない限り、curlはHTTP 404であっても0を返します。

curlエラー28(operation timed out)を解決するには?

エラー28は、リクエストが許可された最大時間を超えたことを意味します。まず、タイムアウト時間を増やしますcurl --connect-timeout 30 --max-time 120 URL--connect-timeout はTCP接続フェーズを制限し、--max-time は操作全体を制限します。次に、curl -v URLボトルネックを診断します。詳細出力により、curlがどこで停止しているか(DNS、接続、TLS、または転送)が正確にわかります。一般的な修正方法:ネットワーク接続とDNS設定を確認する、サーバーが応答しているか確認する(pingtelnet)、--noproxy '*' でプロキシをバイパスする、大きなダウンロードの場合は --retry 3 --retry-delay 5 を追加して自動再試行を行う、などがあります。

curlのSSL証明書エラー(エラー60)を解決するには?

エラー60は、curlがサーバーのSSL証明書を検証できないことを意味します。解決策は原因によって異なります。CAバンドルが古い場合:https://curl.se/ca/cacert.pem から最新のものをダウンロードし、curl --cacert /path/to/cacert.pem URL を使用します。Dockerコンテナの場合:ca-certificates パッケージをインストールします(apt-get install ca-certificates)。開発中の自己署名証明書の場合:curl -k URL を使用して検証をスキップしますが、すべての証明書チェックが無効になるため、本番環境では決して -k を使用しないでください。診断するには:openssl s_client -connect host:443 -showcerts を実行して証明書チェーンを検査します。証明書の期限が切れているか、ホスト名が一致しない場合、問題はサーバー側にあります。

curlエラー7(failed to connect)の意味は?

エラー7は、curlがホスト名をIPアドレスに解決できたものの、TCP接続を確立できなかったことを意味します。サーバーが明示的に接続を拒否したか、ネットワークレベルで接続試行がタイムアウトしました。一般的な原因:ターゲットホストでサービスが実行されていないsystemctl statusdocker ps で確認)、ファイアウォールがポートをブロックしているtelnet host port でテスト)、誤ったポートを使用している(例:443の代わりに80、または開発サーバー用に8080)、または高負荷でサーバーの待機バックログがいっぱいである、などが考えられます。デバッグするには:curl -v URL を使用し、出力内の "Connected to" または "Connection refused" を探します。