curl SSL、TLS & プロキシ設定ガイド

curlでHTTPS証明書、TLSバージョン、プロキシ、カスタムDNS解決を設定することは、安全なAPI通信、CI/CDパイプライン、ネットワーク問題のデバッグに不可欠です。このガイドでは、ローカル開発での-kによる証明書チェックの無効化から、--certによる相互TLSの設定、SOCKS5プロキシ経由のトラフィックルーティングまで、SSL、TLS、プロキシ、ネットワークのすべてのフラグを解説します。各オプションには、わかりやすい説明、セキュリティに関する考慮事項、すぐにコピーできる例が含まれています。

SSL & プロキシフラグ クイックリファレンス

-kSSL/TLS

安全でない接続を許可 — すべてのSSL検証をスキップ

--cacertSSL/TLS

特定のCAバンドルに対してサーバー証明書を検証

--certSSL/TLS

相互TLS認証用のクライアント証明書を提供

--keySSL/TLS

クライアント証明書の秘密鍵ファイルを提供

--tlsv1.2SSL/TLS

接続にTLSバージョン1.2以上を使用

--tlsv1.3SSL/TLS

接続にTLSバージョン1.3以上を使用

--ssl-reqdSSL/TLS

接続にSSL/TLSを必須にする(利用できない場合は失敗)

--ciphersSSL/TLS

接続に使用するSSL暗号スイートを指定

--cert-typeSSL/TLS

クライアント証明書の種類を指定(PEM、DER、ENG、P12)

--pinnedpubkeySSL/TLS

サーバーの公開鍵をピン留めして検証(HPKP方式)

-xプロキシ

すべてのトラフィックを指定したプロキシサーバー経由でルーティング

--socks5プロキシ

SOCKS5プロキシ経由で接続をルーティング

--proxy-userプロキシ

プロキシサーバーにusername:passwordを提供

--noproxyプロキシ

プロキシを経由しないホストのリスト

--socks5-hostnameプロキシ

プロキシ経由でDNS解決を行うSOCKS5プロキシ

--proxy-cacertプロキシ

HTTPSプロキシ自体を検証するためのCA証明書

--resolveネットワーク

特定のhost:portペアをカスタムIPアドレスにマッピング

--connect-toネットワーク

URLで指定されたものとは異なるhost:portに接続

--local-portネットワーク

接続のローカルポート番号または範囲を設定

--interfaceネットワーク

特定のネットワークインターフェースに接続をバインド

--dns-serversネットワーク

システムデフォルトの代わりにカスタムDNSサーバーを使用(c-ares)

curl -k: SSL証明書エラーを無視

動作
-k(または--insecure)フラグは、すべてのSSL/TLS証明書検証を無効にします。curlは、サーバー証明書が信頼されたCAによって署名されているか、ホスト名が一致するか、証明書が期限切れかを確認しません。
使用する場面
自己署名証明書を使用したローカル開発やテスト環境でのみ使用してください。ステージング/本番環境では、代わりに実際のCA証明書と--cacertを使用してください。より安全で明確です。
$ curl -k https://localhost:8443/api/health

本番スクリプトやCI/CDパイプラインで-kを使用しないでください。すべての証明書検証が無効になり、中間者攻撃に対して脆弱になります。代わりに--cacertで特定のCAを信頼してください。

curl --cacert: カスタムCA証明書を使用

動作
--cacertフラグは、システムのデフォルトトラストストアの代わりに、PEM形式の特定のCA(認証局)バンドルファイルに対してサーバーのSSL証明書を検証するようcurlに指示します。
使用する場面
サーバーがシステムのトラストストアにないプライベートまたは内部CAによって署名された証明書を使用している場合に使用します。企業環境、Kubernetesクラスター、内部PKIを使用したDockerセットアップで一般的です。
$ curl --cacert /path/to/corporate-ca.pem https://internal-api.example.com/data

curl --cert: クライアント証明書(相互TLS)

動作
--certフラグは、相互TLS(mTLS)用のクライアント側証明書を提供します。mTLSでは、サーバーとクライアントの両方が互いのIDを検証するために証明書を提示します。証明書ファイルはPEMまたはPKCS#12形式である必要があります。
使用する場面
サーバーがクライアント証明書認証を要求する場合に必要です。銀行API、政府サービス、IoTデバイス通信、ゼロトラストアーキテクチャで一般的です。キーが証明書ファイルに埋め込まれていない限り、常に--keyとペアで使用してください。
$ curl --cert client.pem --key client-key.pem https://mtls-api.example.com/secure

curl --key: クライアント証明書の秘密鍵

動作
--keyフラグは、--certで提供されたクライアント証明書とペアになる秘密鍵ファイルを指定します。鍵は証明書と一致する必要があります。鍵がパスワード保護されている場合、curlはパスフレーズの入力を求めます(または--passを使用)。
使用する場面
常に--certと一緒に使用します。秘密鍵が証明書ファイルに既に埋め込まれている場合(PKCS#12 / .p12ファイルで一般的)、--keyを省略できます。
$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://api.example.com/secure

curl --tlsv1.2: TLS 1.2以上を強制

動作
--tlsv1.2フラグは、SSL/TLSハンドシェイクの最低許容バージョンとしてTLS 1.2を使用するようcurlに強制します。古いプロトコル(TLS 1.0、1.1、SSLv3)は拒否されます。
使用する場面
最低限のセキュリティ標準を適用するために使用します。TLS 1.2はPCI-DSSコンプライアンスに必要であり、すべての最新サーバーでサポートされています。最新のcurlビルドのほとんどはデフォルトでTLS 1.2以上ですが、このフラグで明示的に指定できます。
$ curl --tlsv1.2 -v https://secure.example.com/api 2>&1 | grep 'SSL connection'

curl --tlsv1.3: TLS 1.3以上を強制

動作
--tlsv1.3フラグは、最速かつ最も安全なTLSバージョンであるTLS 1.3を使用するようcurlに強制します。TLS 1.3はハンドシェイクの余分なラウンドトリップを排除し(0-RTTサポート)、すべての廃止された暗号スイートを削除します。
使用する場面
サーバーがTLS 1.3をサポートしていることがわかっていて、最高のパフォーマンスとセキュリティが必要な場合に使用します。注意:TLS 1.3にはOpenSSL 1.1.1以上または互換性のあるTLSライブラリが必要です。まだすべてのサーバーがサポートしているわけではありません。
$ curl --tlsv1.3 https://modern-api.example.com/data

その他のSSL/TLSオプション

--ssl-reqd

接続にSSL/TLSを必須にする(利用できない場合は失敗)

--ciphers

接続に使用するSSL暗号スイートを指定

--cert-type

クライアント証明書の種類を指定(PEM、DER、ENG、P12)

--pinnedpubkey

サーバーの公開鍵をピン留めして検証(HPKP方式)

curl -x: HTTP/HTTPSプロキシを使用

動作
-x(または--proxy)フラグは、curlのすべてのトラフィックを指定したプロキシサーバー経由でルーティングします。フォーマットは[protocol://]host[:port]です。サポートされるプロキシプロトコル:HTTP、HTTPS、SOCKS4、SOCKS5。
使用する場面
企業プロキシサーバー、Fiddler・Charles・mitmproxyなどのデバッグツール、地理的制限のテスト、または直接インターネットアクセスが利用できない場合に使用します。代わりにhttp_proxy / https_proxy環境変数を設定することもできます。
$ curl -x http://proxy.example.com:8080 https://api.example.com/data

curl --socks5: SOCKS5プロキシを使用

動作
--socks5フラグは、TCP接続にSOCKS5プロキシを使用するようcurlに指示します。HTTPプロキシとは異なり、SOCKS5はTCPレベルで動作し、HTTPだけでなくあらゆるプロトコルを処理できます。デフォルトではDNS解決はローカルで行われます。プロキシ経由でDNSを解決するには--socks5-hostnameを使用してください。
使用する場面
SSHトンネル(ssh -D)、Torネットワークアクセス、またはプロキシが非HTTPプロトコルを処理する必要がある場合に使用します。SOCKS5はUDPをサポートし、オプションでDNSも処理できます。HTTPプロキシよりも柔軟です。
$ curl --socks5 localhost:1080 https://api.example.com/data

curl --proxy-user: プロキシ認証

動作
--proxy-user(または-U)フラグは、プロキシサーバーに認証資格情報を送信します。フォーマットはuser:passwordです。サーバー認証(-u)とは別です。
使用する場面
プロキシサーバーが認証を要求する場合に必要です。企業およびエンタープライズネットワーク環境で一般的です。資格情報はターゲットサーバーではなくプロキシに送信されます。
$ curl -x http://proxy.corp.com:3128 -U user:pass https://external-api.com/data

curl --noproxy: 特定のホストでプロキシをバイパス

動作
--noproxyフラグは、プロキシをバイパスして直接接続するホスト、ドメイン、またはIPアドレスのカンマ区切りリストを指定します。ワイルドカードをサポート:*.example.comはすべてのサブドメインに一致します。
使用する場面
localhost、内部サービス、または特定のドメインをプロキシから除外するために使用します。環境変数でプロキシがグローバルに設定されているが、一部のホスト(ローカルサービスなど)に直接アクセスが必要な場合に重要です。すべてのホストでプロキシをバイパスするには*を使用します。
$ curl -x http://proxy:8080 --noproxy "localhost,127.0.0.1,*.internal.com" https://localhost:3000/api

その他のプロキシオプション

--socks5-hostname

プロキシ経由でDNS解決を行うSOCKS5プロキシ

--proxy-cacert

HTTPSプロキシ自体を検証するためのCA証明書

curl --resolve: カスタムDNS解決

動作
--resolveフラグは、特定のhost:portペアにカスタムIPアドレスを提供し、DNS検索を完全にバイパスします。フォーマットはhost:port:addressです。複数の--resolveエントリを指定できます。
使用する場面
DNS伝播前のテスト、ロードバランサー背後の特定のバックエンドの検証、またはSSL証明書検証に実際のホスト名が必要なローカル開発に不可欠です。/etc/hostsの編集とは異なり、リクエスト単位でポート固有です。
$ curl --resolve api.example.com:443:127.0.0.1 https://api.example.com/health

curl --connect-to: 接続を別のホストにリダイレクト

動作
--connect-toフラグは、HTTPリクエスト(HostヘッダーとSNIを含む)には元のURLを維持しながら、TCP接続を別のhost:portペアにリダイレクトします。フォーマット:HOST1:PORT1:HOST2:PORT2
使用する場面
DNSや/etc/hostsを変更せずに、ロードバランサー背後の特定のバックエンドサーバーをテストするために使用します。--resolveとは異なり、host:portをhost:port(IPではなく)にマッピングするため、ターゲットにもホスト名がある場合に便利です。
$ curl --connect-to api.example.com:443:backend1.internal:8443 https://api.example.com/health

その他のネットワークオプション

--local-port

接続のローカルポート番号または範囲を設定

--interface

特定のネットワークインターフェースに接続をバインド

--dns-servers

システムデフォルトの代わりにカスタムDNSサーバーを使用(c-ares)

実践的なSSL & プロキシシナリオ

以下の例は、開発、CI/CD、本番環境での一般的なセキュリティおよびネットワークタスクを処理するために、複数のフラグを組み合わせています。

localhostでHTTPSをテスト

自己署名証明書を使用してローカル開発する際は、--resolve--cacert(またはクイックテスト用に-k)を組み合わせます。hostsファイルを変更せずに、適切なSSL/SNI用の実際のホスト名を使用できます。

$ curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/api/status

相互TLS(クライアント証明書認証)

一部のAPIでは、サーバーとクライアントの両方が証明書を提示する必要があります。--cert--key--cacertを提供して、完全に検証された双方向TLS接続を確立します。

$ curl --cert client.pem --key client-key.pem --cacert server-ca.pem https://mtls-api.example.com/data

認証付き企業プロキシ

必須のプロキシサーバーがある企業ネットワークでは、-x-Uでプロキシ資格情報を組み合わせます。内部サービスをプロキシから除外するには--noproxyを追加します。

$ curl -x http://proxy.corp.com:3128 -U user:pass --noproxy "*.internal.corp" https://external-api.com/data

内部CAを使用するDockerコンテナ

Docker内のサービスが内部CAの証明書を使用している場合、CA証明書をコンテナにマウントし、--cacertで参照します。証明書チェーンを検証し続けるため、-kより安全です。

$ curl --cacert /etc/ssl/certs/internal-ca.crt https://service.docker.internal:8443/health

SSHトンネル経由のSOCKS5プロキシ

ssh -DでSOCKS5プロキシを作成し、--socks5を使用してcurlトラフィックを通します。踏み台サーバー経由で内部サービスにアクセスする場合に便利です。

$ curl --socks5 localhost:1080 https://internal-api.example.com/status

curl SSL & プロキシに関するよくある質問

curlでSSL証明書検証をスキップするにはどうすればよいですか?

curl -k URLまたはcurl --insecure URLを使用します。有効期限、ホスト名の不一致、信頼されていないCAなど、すべての証明書チェックが無効になります。ローカル開発でのみ使用してください。本番環境では、実際のCA証明書と--cacertを使用してください。

curlで自己署名証明書を信頼するにはどうすればよいですか?

curl --cacert /path/to/ca.pem URLを使用して、自己署名証明書に署名したCA証明書を指定します。証明書チェーンを検証し続けるため、-kより安全です。特定のCAのみを信頼します。

curlが使用しているTLSバージョンを確認するにはどうすればよいですか?

curl -v URLを実行し、詳細出力で* SSL connection using TLSv1.x / CipherSuiteの行を探します。特定のバージョンを強制するには、--tlsv1.2または--tlsv1.3を使用します。

相互TLS(mTLS)とは何ですか?curlでの使い方は?

相互TLSでは、サーバーとクライアントの両方が証明書を提示する必要があります。使い方:curl --cert client.pem --key client-key.pem --cacert server-ca.pem URL--cert/--keyペアがクライアントを認証し、--cacertがサーバーを検証します。

HTTPプロキシ経由でcurlを使うにはどうすればよいですか?

curl -x http://proxy:port URLを使用します。HTTPSプロキシの場合:curl -x https://proxy:port URL。またはhttp_proxyhttps_proxy環境変数を設定すれば、curlが自動的に使用します。

SOCKS5プロキシでcurlを使うにはどうすればよいですか?

ローカルDNS解決にはcurl --socks5 host:port URLを、プロキシ経由でDNSを解決するにはcurl --socks5-hostname host:port URLを使用します(プライバシー/Torに重要)。SSHトンネルの例:ssh -D 1080 user@bastion、次にcurl --socks5 localhost:1080 URL

curlでプロキシサーバーに認証するにはどうすればよいですか?

curl -x http://proxy:port -U user:password URLを使用します。-U(または--proxy-user)フラグはプロキシに資格情報を送信します。ターゲットサーバーへの認証である-uとは別です。

curlで特定のホストをプロキシから除外するにはどうすればよいですか?

--noproxy "localhost,127.0.0.1,*.internal.com"を使用するか、NO_PROXY環境変数を設定します。ワイルドカード(*.example.com)をサポートしています。単一のリクエストでプロキシを完全にバイパスするには--noproxy "*"を使用します。

curlでlocalhostのHTTPSをテストするにはどうすればよいですか?

クイックテスト用:curl -k https://localhost:8443/。適切な検証用:curl --resolve myapp.local:443:127.0.0.1 --cacert local-ca.pem https://myapp.local/--resolveアプローチにより、証明書のホスト名が正しく一致します。

curlで特定のホストのDNS解決をオーバーライドするにはどうすればよいですか?

curl --resolve host:port:IP URLを使用します。例:curl --resolve api.example.com:443:192.168.1.100 https://api.example.com/。そのhost:portペアのみDNSをバイパスします。/etc/hostsの編集は不要です。

curlの「SSL certificate problem: certificate has expired」を修正するにはどうすればよいですか?

サーバー証明書の有効期限が切れています。解決策:(1) サーバーで証明書を更新、(2) CAバンドルを更新:curl --cacert /path/to/updated-ca.pem URL、(3) テスト用のみ:curl -k URL。有効期限の確認:curl -v URL 2>&1 | grep expire

本番環境でcurl --insecure(-k)を使用しても安全ですか?

いいえ。-kフラグは、有効期限、ホスト名、トラストチェーンなど、すべての証明書検証を無効にします。中間者攻撃に対して脆弱になります。本番環境やCI/CDパイプラインでは、常に特定のCA証明書と--cacertを使用してください。