サイトをhttpsにするには以下の手順を踏む必要がある。
参考)
ちゃんと理解するSSL/TLS 前編 - Qiita
事前準備(認証局に認証してもらって証明書をもらう)
hostの公開鍵とhostの情報を含めた「署名文書」を認証局に送る。
認証局は署名文書から実在性確認や信頼性チェックを行う。
問題なければ署名文書をハッシュ化して、その文字列を認証局の秘密鍵で暗号化する。
暗号化したものを署名文書に付け加える(署名)。これが証明書となる
できた証明書をhostに返却する。
hostは受け取った証明書と秘密鍵をつかってhttps通信できるように設定を行う。
クライアントからhttpsリクエストがあったとき
hostは証明書(署名文書[hostの情報 + hostの公開鍵] + 認証局の署名)をクライアントに送る。
クライアントは証明書の「署名文書の部分」をハッシュ化する。(A)
クライアントは「認証局の署名の部分」を認証局の公開鍵で複合する。(B)
クライアントは(A)と(B)を比較し、同一であればこの証明書は認証局が認証したものである(=通信相手は意図通り)と確認できる。
(※クライアントのブラウザには最初から(信頼されている)認証局の公開鍵がインストールされている。)
クライアントはhostの公開鍵を使って共通鍵を暗号化し、hostへ送信する
以降は共通鍵を使って暗号化通信を行う。
opensslのコマンドで対応づけると
参考)
オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まつてゐる
hostの秘密鍵(server.key)を作成
$ openssl genrsa 2048 > server.key
署名文書の作成
openssl req -new -key server.key > server.csr
コマンドを実行すると対話形式で色々聞かれる(署名文書の内容につかわれる)
秘密鍵を指定しているけど、内部で公開鍵を取り出して署名文書に追加してくれている。
署名文書を受け取って署名する。(認証局が行う)
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
nginxにはserver.keyとserver.crtを設定する。
クライアントにはserver.crtが送信される。