HTTPとHTTPSを探る

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が返ってきてコネクションが切れる。 HTTPSSSL/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