アタマのひきだし

webプログラミング情報メモ

SSLの基本

インターネットで暗号通信を実現できるのは、SSL(secure sockets layer)というプロトコルのおかげ。Webブラウザでサイトを見ていると、アドレス入力欄やステータス・バーに錠前マークが出ていたり「https://~」というURLこの表示もSSL通信をしている証拠。ssl通信をするのに必要なものは「暗号化」と「サーバー証明書」。

その前に、ポート番号のはなし

人が言葉で会話をするように、コンピューターの場合は通信プロトコルで、会話をしています。そして通信技術を実現、機能させるため階層ごとに分け構造化。それをプロトコル階層モデルというようで、またOSI参照モデルに当てはめることで説明できるようです。そして、ポート番号で識別。通常、webサーバはポート番号80を待ち受けとしているように、標準的なポート番号が決められています。ちなみに SSLの場合はポート番号は443。

暗号方式は2つある

共通鍵暗号」と「公開鍵暗号」という二つの暗号方式を組み合わせて利用。「共通鍵暗号」は、共通の鍵をつかい、送信側からデータを暗号化。受信側も共通の鍵をつかって、暗号化されたものを読める状態に戻す。「公開鍵暗号」の方は、秘密鍵とペアになっており、秘密鍵を持っていなければ解読できない。個々のメッセージは「ClientHello」や「ServerHello」といった種類(タイプ)が決まっており、クライアントとサーバーの両者が、メッセージの種類を区別できるようになっている。

実際のSSLのやりとりの様子

「レコード・プロトコル」と「ハンドシェーク・プロトコル」をつかって進めていきます。「レコード・プロトコル」とは、メッセージのフォーマットのことをそう呼んでおり、やり取りの手順のことを「ハンドシェーク・プロトコル」と呼んでいます。最初にお互いの暗号方式を決めることから始まり、クライアント側から、この暗号方式をつかいますよという提案があり、次にサーバ側から提案のあった方式から適切なもの選び返答。

サーバーは,クライアントにCertificateメッセージを使ってサーバー証明書を送る認証局(CA)が発行する、デジタル署名解析用の公開鍵が真正であることを証明するデータ証明書の情報を送り終えたら,そのことを知らせる。クライアントは,入手したサーバー証明書からサーバーの公開鍵を取り出し,この公開鍵を使って「暗号通信に使う共通鍵の基になる秘密の値」(プレマスタ・シークレット)を暗号化して送信。これがClientKeyExchangeメッセージ。

サーバーはこの暗号化したデータを自身の秘密鍵で解読すると「プレマスタ・シークレット」が出てくる。この時点で両者は,共通鍵の基となる「プレマスタ・シークレット」を共有できたことになります。この先クライアントは,これまで決めた暗号方式の採用を宣言し、ハンドシェークの終了をサーバーに知らせる。これを受けたサーバーの動作もクライアントと同様。暗号方式の採用を宣言し、ハンドシェークの終了をクライアントに知らせる。以上でハンドシェークは終了。

ここに書いてある情報を元に書いています。@nekoteniさんより教えて頂きました。ありがとうございました。