質問: 環境変数で HTTPS_PROXY に http の URL を設定しているのを何度か見ました。 最初はコピペミスか何かだと思っていたのですが、思ったよりそう設定されているケースが多くミスではないように思いました。 HTTPS PROXY について調べてみたのですが、プロキシサーバを経由して HTTPS のページにアクセスことについて書いてあるページばかりで HTTPS PROXY についてわかり易く解説してあるページは見つけられませんでした。 また、HTTPS プロキシーサーバは存在しないと書いてあるものもありました。 なので、 HTTPS PROXY とはプロキシサーバを経由して HTTPS のページにアクセスする場合の CONNECT メソッドを使った方法のことを指すと思って自己完結していました。 しかし、 curl のオプションを見ていると -x で指定するプロキシ設定にプロトコルが設定可能というのを知りました。 省略時のデフォルトは HTTP で HTTPS もサポートしているとあります。 プロキシを経由した通信先が HTTPS かどうかであれば、プロキシの設定に HTTPS を設定する必要はないと思います。 一応 HTTP プロキシサーバを立ててそこを指定してテストを行いました。 -x に http:// を指定すれば正常に動き https:// を指定するとエラーでした。 これらのことから接続先が HTTPS の場合と HTTPS_PROXY は別物のように思うのですが HTTPS PROXY とはどのようなものなのでしょうか?
回答: まず、HTTPS を proxy する方法は2種類あります。 * proxy が通信内容を傍受できない方法 proxy が `CONNECT` を受け取った時、HTTPS サーバへ接続し、クライアントへ `200 OK` を返します。あとは、クライアント - HTTPS サーバ間の TLS ハンドシェイクも含めて、両者間を橋渡しするだけです。 通信内容は暗号化されているため、proxy は傍受することはできません。 * proxy が通信内容を傍受できる方法 proxy が `CONNECT` を受け取った時、そのまま `200 OK` を返します。その後、クライアント - proxy 間で TLS のハンドシェイクが始まります。(proxy - HTTPS サーバ間でも始まります) この時、proxy は本来の HTTPS サーバが持っている秘密鍵を持っていないので、proxy が持っている CA オレオレ証明書と CA 秘密鍵を使って、本来の CN (Common Name) を持つ証明書をその場で作り出し、その証明書を使ってクライアントと通信します。 普通、クライアントはそのような偽造された証明書は検証エラーとして弾いてしまいますので、そうならないよう、あらかじめクライアントに proxy の CA オレオレ証明書を信用させておく必要があります (ブラウザであれば証明書のインポート、curl コマンドであれば `--proxy-cacert` ですかね)。 このようにすることで、proxy は通信内容を傍受することができます。用途としては、主に、HTTPS を使った Web サービスの開発に使われていると思います。 (mitm proxy と呼ぶこともあるようです) さて、環境変数 `HTTPS_PROXY` についてですが、この環境変数は、サーバに HTTPS 接続したい時に使用する proxy の設定です。設定する場合、通常は `http://...` という感じに設定してあると思います。 curl の `-x` の指定については、`http://...` の場合はクライアント - proxy 間の `CONNECT` とそのレスポンス `200 OK` は HTTP でやりとりされますが、`https://...` の場合は、そこも含めて最初から HTTPS にしているのだと思います。 ( の最後の項目を読んだ限り、です。手元では検証できませんでした。)