はじめに
先日、wgetを実行しているとプロキシエラーが発生したので、いつも通りプロキシ設定をしていました。
その時、ふと2つの疑問が湧いてきました。
2つ設定しているのはなぜ?
どちらもhttp://
と設定しているのはなぜ?
今まではこの辺りの話に疎かったので全く気にしてなかったのですが、最近色々と勉強中だったのでついでに調べてみようと思ったのがことの発端です。
前提知識の理解
今回の疑問を解決するためにはhttps、http、SSL証明書、プロキシサーバについて知っておく必要があります。詳しく書き出すとキリがないので本題に必要な部分を簡単に説明することにします。
http
httpはインターネット上で情報をやり取りするためのプロトコルで、通信内容は暗号化されず平文で送信されます。細かいところは良いので、通信方式のひとつだけど安全じゃなさそう、と思っていただければおっけーです。
https
名前の通りほぼhttpですが、大きな違いが1つあります。https通信はデータが暗号化される、という点です。暗号化にはSSL証明書というものが必要になります。
SSL証明書
下記の2つの役割を担っています。
- 信頼できるサイトであることを示す
- 既出だが、https通信の際に、通信内容を暗号化するために使う
プロキシサーバ
サーバとクライアントの間にある中間サーバ。悪意のあるサイトにアクセスすることを防いだり、キャッシュを利用したレスポンスの高速化などの役割を担っている。
プロキシを介した通信は、クライアント→プロキシ→ウェブサーバ、となることは理解しておいてください。
プロキシを介したhttps接続について
さて、これで前提となる用語の説明を終えたのでようやく本題に入ります。
プロキシを介したhttps接続ですが、この時プロキシが何をするかというと何もしません。厳密には、CONNECTというメソッドを使ってクライアントとサーバ間をそのまま繋ぎますが、それだけです。そのため、クライアント側でサーバの証明書が正しいか確認できればhttps通信ができます。wgetのプロキシ設定でいえば
https_proxy=http://user:pass@proxy.com:port/
https_proxy
の部分がhttps接続用の設定であることを示しており、右側のhttp://user~
が利用するプロキシサーバのURLを示しています。
ここまでくると予想できるかと思いますが、http_proxy
はhttp接続用の、https_proxy
はhttps接続用の設定になります。このように通信プロトコルごとの設定が必要なので、プロキシ設定にはhttp_proxy
とhttps_proxy
の2つが必要となりわけです。また、基本的にプロキシサーバはhttpでもhttpsでも変わらないので、右側のhttp://~
は同じとなるのです。
プロキシ設定のプロトコルがhttpの理由
なんとなくhttps接続するなら、プロキシのurlもhttps://
ではないのか?と思うことがあるかも知れません。(下記設定)
https_proxy=https://user:pass@proxy.com:port/
この設定の場合、プロキシに対してもhttps接続をおこなうことになりますので、プロキシサーバのSSL証明書を検証する必要があります。しかし、一般的にプロキシは社内でのみの利用を想定されているため自己証明書を使っていることが多いです。これによって検証に失敗し、接続に失敗してしまいます。
以上の理由から、クライアント-プロキシ間の通信はhttpを使うことが多くなっており、いつものプロキシ設定ができあがるわけです。
http_proxy=http://user:pass@proxy.com:port/ これはhttp接続用
https_proxy=http://user:pass@proxy.com:port/ これはhttps接続用
プロキシに対しては、httpで接続したいのでhttp://user〜となっている
さいごに
今回はプロキシを介したhttps接続について説明しました。
今まで特に意識していなかったという人はこれを機にどんどん調べていってください!