仕事でTLS関連のトラブルがあったが全然基礎知識がなかったので1から学んだ。この記事は特にTLSの仕様を解説したいわけではなくどこを参照してまだかメモっておく。僕が解説するよりそっちを参照したほうが確実。
まずSSLとTLSの違いすらわからないレベルだったのでウィキペディア読んだ。
ウィキペディアがいいのは常に更新されているところで、例えばPOODLE攻撃とか比較的最近のトピックも網羅されている可能性が高い。ウィキペディアで得た知識だけでPOODLE攻撃がわかるかというと微妙だけどインデックスは貼れる。
今回の問題はハンドシェイクに問題があるとわかっていたのでハンドシェイクの詳細が知りたい。ウェブ上の記事だと
が一番詳しく、かつ信頼性がありそうだった。胆力のある人間はこの時点でRFCを頭から読むのかもしれないけどその元気はなかった。(部分的には参照した)
書籍だとマスタリングTCP/IP SSL/TLS編読んだけど内容がめっちゃ古かった。2002年の本なのでSSL/TLS界隈の流れの速さにはついていけてない感じ。でもまぁ僕が必要だったのは基本的な部分だったのでそこそこ役に立った。正常にハンドシェイクできなかった場合の処理とかはWeb上にはあんまりいい言及がなかったので。
今だったら
が良さそう。(関係ないけどURIが大胆)
あとは
が良かった。仕様とかは書籍読めばわかるけど
実はこれをちゃんと実装していないサーバが多く存在していて問題になっています。
こういう知識はプロトコルの解説からは抜けてることが多いので一言あると救われる場合がある。(まぁでももともとGREASEの解説記事なのでそこまでカバーしている本や記事ならば言及されてはいそう)
この辺からあんまり仕様みててもしょうがないなと思ったので実装みて感覚つかもうと思いWebサーバーの実装見始めた。
僕はC言語読めないのでgolangの実装読んだ。
以上の活動によりどうなっているべきかがわかったので、あとは実験してどこがどう悪いのか確認していけば良い。このフェイズに役に立ったのは
openssl s_client
tcpdump
- Wireshark
最初はcurlで繋がる繋がんないやってたけどopenssl s_client
のほうが適している。特に-msg
はClientHelloなどで送っている内容まで見れるので捗る。実際の通信キャプチャしたければtcpdumpやWiresharkを使う。今回はハンドシェイク部分の問題だったので暗号化解除するなどめんどくさいことはせずに解決した。他のソフトウェア(ブラウザなど)のハンドシェイクの様子などもみてどうあるべきか確認もした。
あとサーバーサイドの状況の確認は
が便利だった。もちろんopennssl
コマンド使っても良いが。
まぁ根本的にはServerHelloをちゃんと返してくれない問題だったんだけど、断言するのに随分時間のかかった仕事だった。インターネット難しいね。