HTTPSを手を動かして確認する。 opensslを使うと簡易にSSL/TLSのクライアントやサーバを立てられるということなので確認してみる。 ちなみに,HTTPを確認する場合はtelnetを使えば良い。
HTTPS クライアントの動作確認
HTTP/1.0
以下のコマンドを打つと,HTTPSのポート443に対して,SSL/TLSで接続できる。
openssl s_client -connect example.com:443
opensslでコネクションを確立したら,以下のHTTP1.0のヘッダを打ち込む。空行を打ち込むまでがヘッダ。\nは改行コード。
GET / HTTP/1.0\n \n
するとサーバからのレスポンスとして,HTMLが返ってきてコネクションが切れる。 HTTPSはSSL/TLSでHTTPをラップしたもの,というのは確かにその通りであることが確認できる。
HTTP/1.0をサポートしていないサーバも結構あるので,エラーが返ってくることもある。例えばhatenablog.comは1.0だと,ページが見つからないというレスポンスが返ってくる。
HTTP/1.1
以下のように,接続してからHTTP/1.1のヘッダを打ち込めばサーバからレスポンスを返してもらえる。opensslのコマンドはHTTP/1.0と同じでOK。
openssl s_client -connect example.com:443 (中略) GET / HTTP/1.1\n Host: XXX.com\n \n
確認しやすい差分は以下。
- HTTP/1.1ではHostがヘッダに含まれないとBad requestになる(ことが多い)。
- HTTP/1.1ではKeepAliveが有効なためコネクションは継続されるので,続けてリクエストできる。
- HTTP/1.1からチャンクエンコーディングでコンテンツが返ってくることがある。
- 例えば,www.google.co.jpなど
HTTP/2.0
HTTP/2.0は一応,以下で接続はできそう。ただ,ヘッダのフォーマットがバイナリーになっているので,手打ちでのこれ以上の確認は難しそう。
openssl s_client -alpn h2 -servername example.com -connect example.com:443