このクライアントとサーバを実行して、Wiresharkeで見てみると、サーバからCertifiacateRequestが送られるようになりました。クライアントはそれに対応するため、ClientKeyExchangeの前にCertifiacate、後にCertifiacateVerifyを入れてからChangeCipherSpec、FinishedMessageと続いてます。実装していきましょう。追加部分を解説していきます。サーバからのCertifiacateRequestを読み取る処理を追加します。[]byte}サーバのHandshakeメッセージをparseするところに追加します。CertificateVerifyを送れるようにします。クライアント証明書を送る構造体は、サーバから送られてるくるものと同じです。RFCに以下書いてあります。節に定義されている証明書の構造体を使って送られる。クライアント証明書と鍵を読みこんでおいた結果をCertifiacateメッセージを作成する関数に渡します。clientCertBytes}次にCertifiacateVerifyメッセージです。ここで何をすればよいのかというと、ここまでやり取りされたHandshakeメッセージをクライアントの秘密鍵で署名してサーバに送ります。サーバは受信したクライアント側証明書の中にある公開鍵で署名を検証し、成功すれば無事クライアント認証が完了です。verifyHandshakeSignatureで署名を検証しています。↑という仕組みなのでClientHelloからClientKeyExchangeまでのメッセージをsha256でハッシュしてから秘密鍵で署名してCertificateVerifyを作る関数を定義します。certVerifyBytes}CertificateとCertifiacateVerifyメッセージが作れたらひとまとめにしてサーバにWriteします。サーバからChangeCipherSpecとFinishedが正しく送られてくれば、クライアント認証が正しく出来ています。all)では確認してみましょう。150303001a000000000000000292ba9afe8b0c77bcb941887d1f07e9f578b3Wiresharkで見ても正しくTLSのクライアント認証を経てからApplicationDataがやり取りされています。nginxは設定が面倒くさいので省略ww😇😇😇おわりにというわけで足りてない箇所も多々あると思いますが、TLS1.2プロトコルスタックを自分で実装してみました。いう車輪の再開発で自分で作ったものって実用できるものでは全くないのですけども、実装する過程で得られた知識っていうのは自分の財産になりますよね😊😊😊WiresharkeとRFC、tlsパッケージの実装を毎日にらめっこしていると段々わかるようになりましたし、これをやる前よりTLSについて自分で説明できるようになったかなと思います。完全に理解したとは言えませんがwというわけで次はTLS1.3を作りましょうか、俺達のプロトコルスタック開発はこれからだ!satokenの次回作にご期待ください終ツイートsatokenこの世界の片隅にいるエンジニアバッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフト券が還元されます。タイプECHDE鍵交換の実装TLSクライアント認証おわりにZennエンジニアのための情報共有コミュニティAboutZennについて運営会社お知らせ・リリースGuides使い方Publicationよくある質問LinksTwitterGitHubメディアキットLegal利用規約プライバシーポリシ。