HTTPSのシーケンシャルは以下です。この辺の説明は省きます。


[**CLIENT**] [**SERVER**]

CT_HANDSHAKE ----------------------------->
CLIENT_HELLO
(client_randam)

<----------------------------- CT_HANDSHAKE
SERVER_HELLO
(serevr_randam)
CERTIFICATE
(x509)
SERVER_HELLO_DONE
CT_HANDSHAKE ---------------------------->
CLIENT_KEY_EXCHANGE
(encrypted_pre_secret_master)

CT_CHANGE_CHIPER_SPEC
CT_HANDSHAKE
FINISHED1

<---------------------------- CT_CHANGE_CHIPER_SPEC
CT_HANDSHAKE
FINISHED2


一番むかついたのは、難しいのはCT_CHANGE_CHIPER_SPEC以降のFINISHEDの処理です。ここではこれまでの通信内容をすべてマージしてハッシュを計算し内容を確認します。
ところが、これが中々一致しません。マージしたデータが悪いのかハッシュ計算方法が悪いのか、答えに近づいているのかどうか、すらわからず普通なら投げ出す所です。
HTTPSでは鍵交換だけでは終わらず、データCHECKに関する処理が必ず発生します。ちなみにFINISHEDはCT_CHANGE_CHIPER_SPECの後なので、これ自体暗号化されてます。


FINISHED1の計算元マージデータ
CLIENT_HELLO 0x01,0x00,0x00,0x71,,,
SERVER_HELLO 0x02,0x00,0x00,0x26,,,
CERTIFICATE 0x0b,0x00,0x02,0x62,,,
SERVER_HELLO_DONE 0x0e,0x00,0x00,0x00
CLIENT_KEY_EXCHANGE 0x10,0x00,0x00,0x82,0x00,0x80,,,


FINISHED2の計算元マージデータ
CLIENT_HELLO 0x01,0x00,0x00,0x71,,,
SERVER_HELLO 0x02,0x00,0x00,0x26,,,
CERTIFICATE 0x0b,0x00,0x02,0x62,,,
SERVER_HELLO_DONE 0x0e,0x00,0x00,0x00
CLIENT_KEY_EXCHANGE 0x10,0x00,0x00,0x82,0x00,0x80,,,
FINISHED1 0x14, 0x00,0x00,0x0c,90