CakePHP5入門【補足③】開発環境のSSL/TLS化

B美
でも、(私たちが使っている)現状の開発環境(のWebサーバ)は単なる「HTTP」であって、暗号化はサポートされていないのよ

A子
だから何だってんの?

B美
ただ、本番環境に設置する場合、WebSocketサーバのほうも暗号化(wss://)する必要があるのよ

C菜
もしかして暗号化通信のための「サーバ証明書」が必要なんでしょうか~?

B美
(話が早い!)
というわけで、開発環境で使える「サーバ証明書」を作成して、とりあえずは「HTTPS」環境にしてみましょう
(WebSocketの暗号化については、次回やる予定…)

A子
難しそう…
てか、「サーバ証明書」への署名って、お金がかかるんじゃなかったっけ?

C菜
あ、そういえば無料のサービスもあったような気が…

B美
たしかにあそこは無料で署名してくれるわね
(定期的な更新作業が必要だけど…)
ま、でも開発環境だったら「オレオレ証明書」で十分よ

A子

B美
自分で自分を証明(署名)するのよ
(つまり「自己署名証明書」)
本来は認証局(CA)によって署名されるべき「サーバ証明書」を自分自身で署名するってわけ

A子
(難しそうだけど、B美がいれば大丈夫っしょ)

B美
su -[Enter] |
次は、各種ファイルの置き場所となるディレクトリを作成しましょう
(以下は一つの例であって、別にどこでも構わないんだけど…)
cd /etc/apache2[Enter]
mkdir ssl[Enter] cd ssl[Enter] |
では次に、証明書内に埋め込む値を記述した設定ファイルを作りましょう
(コマンドを実行して対話的に入力していっても良いんだけど、設定ファイルを作っておいたほうが便利だと思う)
nano server.cnf[Enter] |
この中に記述するのが以下の内容ね
[ req ]
default_bits = 2048 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [ dn ] C = JP(国) ST = Fukuoka(都道府県名) L = Tagawa(市町村名) O = FrictionRiver(会社名) OU = IT(部門) CN = 192.168.1.205(ドメイン名) [ req_ext ] subjectAltName = @alt_names [ alt_names ] IP.1 = 192.168.1.205(ドメイン名) |
もちろん、その赤字コメントのある行の値は、自分の環境に合わせて適宜変更してね
(言うまでもないと思うけど…)

↓

↓


C菜
(どう見ても「IPアドレス」なんですけど~)

B美
でも(テスト実行の際)LAN内で動かしているWebサーバ(開発環境)に、LAN内のPCからIPアドレスを使ってアクセスしてるじゃない?
(http://192.168.1.205/authapp等)
なので、ドメイン名の箇所は「IPアドレス」でなければならないってわけ
(だからこそ「自己署名」しかできないんだけどね)

A子
「subjectAltName」って何なのよ?

B美
要するに「マルチドメイン証明書」を実現する方法ね

C菜

B美
(一応、念のため…って感じ)
それでは、今作った「server.cnf」というファイルを使って「サーバ証明書」を作っていくよ
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt -config ./server.cnf |
ちなみに、有効期間を3650日(約10年)にしといたから…


C菜

B美
本来は、CSR(Certificate Signing Request…証明書署名要求)を作って、それを認証局(CA)によって署名してもらわなきゃいけないんだけど、LAN内で使うだけだから自己署名で十分なのよ
(httpsアクセスすると、ブラウザが警告を出すけどね(苦笑))

A子

B美
Webサーバである「Apache2」の設定をしなければいけないわ
まずは以下のコマンドを叩いてね
(カレントディレクトリはどこでもOKだけど、必ずrootユーザで実行すること)
a2enmod ssl[Enter]
a2ensite default-ssl.conf[Enter] |
これで「SSL/TLS」が有効になるの


B美
nano /etc/apache2/sites-enabled/default-ssl.conf[Enter] |
変更する箇所は以下の二行ね
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key |
あ、ドキュメントルート(DocumentRoot)の値(/home/bimi/html)については、それぞれの環境に合わせて書き換えてね
んで、上書き保存したらWebサーバを再起動してちょうだい
systemctl restart apache2[Enter] |
これで完了よ

↓


↓


A子


C菜

B美
ちなみに、一度選択しておけば、今後は表示されなくなるから安心してね

↓


A子
(「セキュリティ保護なし」とも表示されてるし…)
これって、ほんとに「SSL/TLS」による暗号化通信になってんの?
(実は「http」による平文通信になってない?)

B美
間違いなく暗号化通信(https)になってるわよ
ブラウザのこの表示は、「サーバ証明書が信頼できない」って意味なのよ
(なにしろ認証局による署名をやってないからね)
その証拠に「サーバ証明書」の表示もできるわよ
(以下は、その例)
Edgeの場合、「セキュリティ保護なし」をクリックしてから、一番上の「>」をクリック
右上にある証明書のアイコンをクリックすると、「証明書ビューアー」が起動するわ
(有効期間が約10年間になっているのも確認できたでしょ?)

↓

↓


A子
難しいかって問われると、そうでもなかったって感じだね

C菜
それにしても「自己署名証明書」というよりは、「署名無し証明書」というべきじゃないでしょうか~?

B美
「署名無し」のサーバ証明書なんて存在しない(できない)わ
さっき叩いた「openssl」コマンドの中に、オプションとして「-x509」があったでしょ?
あれが「署名を行う」ための指定ってわけ
(自己署名だけど…(苦笑))

C菜
理解できました~