PD試験 システム
PD試験(仮称)システム区分 サンプル問4(WebSocketのハンドシェイク)の解説
プロフェッショナルデジタルスキル(システム)試験(仮称)の科目Bサンプル問4を、スマホで解いて確かめられます。WebSocketのハンドシェイクの空欄a〜dを、仕様(RFC 6455)の該当箇所と照らして確かめ、選択肢ごとの根拠を解説します。
PD試験 システム
科目Bサンプル問題 問4
IPA 公表問題
商社である A 社では,クラウドサービスを利用して取引先と商品情報の交換を行う Web システムを構築している。Web システムはコンテナ上で稼働する Web アプリケーション及びマイクロサービス群から構成されており,取引先システムから送られてくる刻々と変化する原価情報や,注文情報を扱うため,リアルタイム性の高い通信を必要とすることから,取引先システムとの接続には WebSocket を利用している。図 1 は,A 社 Web システムにおける,取引先システムとの連携のための,WebSocket 通信開始処理である。
図1 取引先システムとの連携のための WebSocket 通信開始処理
- A 社が取引先システムへ TLS で接続した際に,次の処理が行われる。
- A 社 Web システムは GET リクエストを送るが,このときのリクエストヘッダに“Upgrade: websocket”と”Connection: Upgrade”を含めることで WebSocket ハンドシェイクを開始する。
- 取引先システムが WebSocket を受け入れる場合,応答ヘッダに[ a ]を指定した上で,ステータスコードが[ b ]である応答が返される。
- A 社 Web システムから Sec-WebSocket-Key として送られた 16 バイトの乱数に対して,取引先システムから Sec-WebSocket-Accept が応答されるが,これは 16 バイトの乱数と特定の固定値を連結して[ c ]で計算したハッシュ値である。
A 社 Web システムは,取引先システムとの通信において Sec-WebSocket-Accept で得た値を検証することで,相手システムが[ d ]ということが確認できる。
設問 図 1 中の[ a ]~[ c ],及び本文中の[ d ]に入れる字句の組合せはどれか。解答群の中から最も適切なものを選べ。
- (一) Upgrade: websocket
Connection: Upgrade - (二) Upgrade: websocket
Connection: websocket - (三) 101
- (四) 200
- (五) SHA-1
- (六) SHA-2
- (七) WebSocket を利用可能である
- (八) なりすましでない
答えと選択肢ごとの根拠を見る
正解:ア(a (一)/b (三)/c (五)/d (七)) IPA 公表の解答例による
ア ○ 正しい
a (一)/b (三)/c (五)/d (七)
RFC 6455(WebSocketの仕様)のとおり。サーバは受け入れるとき,Upgrade: websocketとConnection: Upgradeを返し(a),ステータスコードは101 Switching Protocols(b)。Sec-WebSocket-Acceptは,鍵の値に仕様で決まった固定のGUIDを連結してSHA-1でハッシュし,Base64にしたもの(c)。秘密の値を使わないので,相手の身元の証明にはならず,確認できるのは「相手がWebSocketのハンドシェイクを理解して受け入れた」こと(d)。
イ × 誤り ハンドシェイクの検証を相手の認証と考えた
a (一)/b (三)/c (五)/d (八)
a〜cは正しい。しかしSec-WebSocket-Acceptは,公開されている固定値と,クライアント自身が送った値から誰でも計算できる。秘密を共有していないので,なりすましでないことは確認できない。相手の正当性は,TLSのサーバ証明書の検証で確かめる。
ウ × 誤り ハッシュ関数は新しいもの(SHA-2)が使われるはずと考えた
a (一)/b (三)/c (六)/d (八)
Sec-WebSocket-Acceptの計算は,RFC 6455でSHA-1と決められている。ここでのハッシュは改ざん防止の暗号用途ではなく,ハンドシェイクを理解したことを示すためのもので,SHA-2に置き換わってはいない。dも誤り。
エ × 誤り 成功の応答はいつも200と考えた
a (一)/b (四)/c (五)/d (七)
WebSocketへの切り替えに成功したときの応答は101 Switching Protocols。101以外の応答は,ハンドシェイクが完了していないことを意味する。a・c・dは正しい。
オ × 誤り 成功の応答はいつも200と考えた
a (一)/b (四)/c (六)/d (八)
bは101,cはSHA-1,dは「WebSocket を利用可能である」が正しい。a以外がすべて違う。
カ × 誤り Connectionヘッダの値をプロトコル名と考えた
a (二)/b (三)/c (五)/d (八)
Connectionヘッダに書くのは,切り替えの指示である「Upgrade」。切り替え先のプロトコル名(websocket)はUpgradeヘッダに書く。図1でも,リクエストは“Connection: Upgrade”を含めている。dも誤り。
キ × 誤り Connectionヘッダの値をプロトコル名と考えた
a (二)/b (三)/c (六)/d (八)
aはConnection: Upgrade,cはSHA-1,dは「WebSocket を利用可能である」が正しい。
ク × 誤り Connectionヘッダの値をプロトコル名と考えた
a (二)/b (四)/c (五)/d (七)
aはConnection: Upgrade,bは101が正しい。cとdは正しい。
ケ × 誤り Connectionヘッダの値をプロトコル名と考えた
a (二)/b (四)/c (六)/d (七)
aはConnection: Upgrade,bは101,cはSHA-1が正しい。dだけが正しい。
コ × 誤り Connectionヘッダの値をプロトコル名と考えた
a (二)/b (四)/c (六)/d (八)
4つの空欄すべてが違う。正しくはaがConnection: Upgrade,bが101,cがSHA-1,dが「WebSocket を利用可能である」。
解説
この問題で問われていること:WebSocketの仕様の知識
IPAは出題趣旨で、この問題を、WebSocket通信を利用したシステム間連携における「プロトコルの仕様やハンドシェイクの仕組みなど」を理解し、リアルタイム通信に活用する能力を評価するものとしています。
サンプル問題の6問のうち、知識だけで答えが決まるのはこの問題です。本文から推理して埋める空欄はほとんどなく、WebSocketの仕様(RFC 6455)を知っているかどうかで決まります。そのかわり、知っていれば1〜2分で解けます。
仕様と照らす:4つの空欄の根拠
| 空欄 | 正解と、RFC 6455の該当箇所 |
|---|---|
| a応答ヘッダ | Upgrade: websocketとConnection: Upgrade。4.2.2節で、サーバの応答には、値がwebsocketのUpgradeヘッダと、値がUpgradeのConnectionヘッダを含めるとされている |
| bステータス | 101。4.2.2節で、ステータス行は101の応答(Switching Protocols)とされている |
| cハッシュ関数 | SHA-1。1.3節・4.2.2節で、鍵の値に固定のGUIDを連結し、SHA-1でハッシュしてBase64にするとされている |
| d確認できること | WebSocketを利用可能である。1.3節で、サーバがクライアントのWebSocketハンドシェイクを受け取ったことを示し、WebSocketではない接続を受け入れないようにするためのものとされている |
4つとも正しいのはアです。
空欄ごとの考え方:切り替えのHTTPと、認証にならない検証
a・b:「切り替え」のHTTP
WebSocketは、最初にHTTPのリクエストを送り、それをWebSocketに切り替える(アップグレードする)ことで始まります。
- Connectionヘッダには「この接続を切り替えたい」という指示としてUpgradeを書きます。
- Upgradeヘッダに、切り替え先のプロトコル名websocketを書きます。
図1のリクエストも、まさにこの組合せ(Upgrade: websocketとConnection: Upgrade)です。応答も同じ組合せを返すので、aは(一)です。(二)の「Connection: websocket」は、2つのヘッダの役割を取り違えています。
bのステータスコードは、プロトコルの切り替えを表す101 Switching Protocolsです。通常の成功を表す200を返すと、HTTPのまま応答が終わったことになり、WebSocketは始まりません。
c:なぜSHA-1なのか
Sec-WebSocket-Acceptの値は、クライアントが送ったSec-WebSocket-Key(16バイトの乱数をBase64にした文字列)に、仕様で決められた固定のGUID「258EAFA5-E914-47DA-95CA-C5AB0DC85B11」を連結し、SHA-1でハッシュしてBase64にしたものです。
SHA-1は、電子署名などの暗号用途では使わないことが推奨されるようになりました。そのため、SHA-2を選びたくなるかもしれません。しかし、ここでのハッシュは秘密を守るためのものではなく、「仕様どおりに計算できた」ことを示すためのものです。RFC 6455はSHA-1のまま使われています。
d:「なりすましでない」ではない理由
一番のひっかけはdです。計算に使うのは、クライアント自身が送った値と、仕様に公開されている固定のGUIDだけです。秘密の値を使っていないので、誰でも同じ値を計算できます。したがって、Sec-WebSocket-Acceptを検証しても、相手が本物かどうか(なりすましでないか)は分かりません。
確認できるのは、相手がWebSocketのハンドシェイクを理解して、受け入れたことです。相手の正当性は、図1の冒頭にあるTLSのサーバ証明書の検証で確かめます。
時間をかけないコツ:「101」だけで候補が半分になる
解く時間の目安は3分ほどです(当サイトの推測)。知識の問題は、迷う時間を減らすことが一番の時間短縮です。
確実に分かる空欄から解答群を絞ります。たとえば「101」だけを知っていれば、10個の候補が5個(ア・イ・ウ・カ・キ)に減ります。さらに「Connection: Upgrade」を知っていれば3個(ア・イ・ウ)になり、残りはcとdの判断だけです。
システム間連携として読み直す:切断と認証
本文のA社は、取引先システムと「刻々と変化する原価情報や,注文情報」をやり取りしています。WebSocketを選んだ理由はリアルタイム性ですが、システム間連携としては、ほかにも決めておくことがあります。
WebSocketは接続を張り続ける方式なので、ネットワークの瞬断や相手の再起動で接続が切れます。再接続の手順と、切れている間に失われたメッセージをどう補うかを決めておかないと、注文情報が欠けるおそれがあります。
相手の認証も別に用意します。dで見たとおり、ハンドシェイクは相手の認証になりません。取引先との連携では、TLSのサーバ証明書の検証に加えて、接続時のトークンなどで、どの取引先からの接続かを確かめる仕組みが要ります。
参考にした資料
独立行政法人情報処理推進機構(IPA)(確認)
IETF(RFC Editor)(確認)