48515


環境変数で HTTPS_PROXY に http の URL を設定しているのを何度か見ました。  
最初はコピペミスか何かだと思っていたのですが、思ったよりそう設定されているケースが多くミスではないように思いました。

HTTPS PROXY について調べてみたのですが、プロキシサーバを経由して HTTPS のページにアクセスことについて書いてあるページばかりで HTTPS
PROXY についてわかり易く解説してあるページは見つけられませんでした。  
また、HTTPS プロキシーサーバは存在しないと書いてあるものもありました。

なので、 HTTPS PROXY とはプロキシサーバを経由して HTTPS のページにアクセスする場合の CONNECT
メソッドを使った方法のことを指すと思って自己完結していました。

しかし、 curl のオプションを見ていると -x で指定するプロキシ設定にプロトコルが設定可能というのを知りました。  
省略時のデフォルトは HTTP で HTTPS もサポートしているとあります。  
<https://curl.haxx.se/docs/manpage.html#-x>

プロキシを経由した通信先が HTTPS かどうかであれば、プロキシの設定に HTTPS を設定する必要はないと思います。  
一応 HTTP プロキシサーバを立ててそこを指定してテストを行いました。  
-x に http:// を指定すれば正常に動き https:// を指定するとエラーでした。

これらのことから接続先が HTTPS の場合と HTTPS_PROXY は別物のように思うのですが HTTPS PROXY
とはどのようなものなのでしょうか？


CC BY-SA 4.0
2018-09-17T11:11:17.823
48481
2018-09-18T22:14:24.483
30139
question
network https
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 にしているのだと思います。  
(<https://curl.haxx.se/docs/sslcerts.html> の最後の項目を読んだ限り、です。手元では検証できませんでした。)


CC BY-SA 4.0
2018-09-18T15:45:25.073
48515
2018-09-18T15:45:25.073
5288
48481
answer


この辺りの環境変数に明確な規定はなく、プログラム毎に独自の解釈がされています。大文字の`HTTP_PROXY`なのか小文字の`http_proxy`なのか両方ならどちらが優先されるのか、`HTTPS_PROXY`を参照するのか`HTTP_PROXY`だけなのかフォールバックはあるのか、`NO_PROXY`の書式はどうなっているか、点でバラバラなのがUNIXの特色とも言えます。

その上でおおよそ、`HTTP_PROXY`は接続先が`http://target...`の際に使用するproxyを指定し、`HTTPS_PROXY`は接続先が`https://target...`の際に使用するproxyを指定するようです。

また`HTTP_PROXY`や`HTTPS_PROXY`に設定する値ですが、`http://proxy...`であればproxyまでの接続方法として`http`を使用し、`https://proxy...`であればproxyまでの接続方法として`https`を使用するようです。

よって（環境変数でなく用語としての）HTTPS Proxyには２つの意味があり、

  * `CONNECT`メソッドを使いtarget serverまで`https`接続を提供するproxy server  
「自己完結してい」た方

  * クライアントプログラムとproxy server間を`https`で暗号化するproxy server  
「HTTPS プロキシーサーバは存在しない」の方

かと思われます。


CC BY-SA 4.0
2018-09-18T22:14:24.483
48519
2018-09-18T22:14:24.483
4236
48481
answer