![見出し画像](https://assets.st-note.com/production/uploads/images/119581020/rectangle_large_type_2_8a718f361156f7fa7c35bbcdc254467c.jpeg?width=1200)
#100 TLS
TLSは、現代の通信を支えている重要なプロトコルです。ネットワークを流れるデータを暗号化し、他者から見えないようにしてくれています。
最近は、ブラウザでhttp://から始まるWebサイトにアクセスすると警告が表示されますが、これは通信が暗号化されないHTTP通信を使っているためです。このようなサイトでパスワードやクレジットカード情報を送信してしまうと、通信の途中で傍受されてしまう可能性があり危険です。
一方のHTTPSは、HTTP通信をTLS上で行うので、通信内容は暗号化されます。私たちが安心してオンラインサービスを使えるのは、TLSのおかげなのです。
それでは、やってみましょう!
HTTPSサーバー
前回作った、HTTPサーバーを改造して、TLSに対応しました。
TLSの仕様はRFC8446として公開されていますが、これを実装するのはさすがに大変なので、OpenSSLのライブラリを使いました。
準備
sudo apt install libssl-dev
TLSで通信するには、サーバー証明書が必要です。手元で試すだけなので、自己署名証明書を作成します。
openssl genrsa 4096 > key.pem
openssl req -new -key key.pem > server.csr
openssl x509 -req -days 3650 -signkey key.pem < server.csr > cert.pem
makeでビルドします。
make
準備OKです。
テスト
プログラムを起動して、curlで通信してみます。
$ sudo build/bin/server
Start simple TLS Server
curlは自己署名証明書だとエラーを出すので、insecureオプションで回避します
$ curl --insecure https://localhost
Hello World!
ちゃんと通信できました!
Wiresharkで通信をみてみると、ちゃんとハンドシェイクが行われて、通信も暗号化されているようでした!
![](https://assets.st-note.com/img/1697958646149-xMf6ipRfi4.png?width=1200)
なぜか、クライアントからのHTTPリクエストの内容がうまく取得できていないので、もう少し調べます…
まとめ
TLSも日々進化していて、2023/10現在はTLS1.3が最新です。同じTLSでも、古いバージョンだったり使用する暗号化アルゴリズムによっては脆弱になることもあります。しっかり仕様を理解して、サーバーの設定やプログラムの実装ができるようになりたいです!
EOF
この記事が気に入ったらサポートをしてみませんか?