Friction River Software

  • お問い合わせ

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

B美

インターネット上に公開しているWebサーバって、当然「HTTPS(SSL/TLS)」による暗号化がなされているわよね

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

A子

ふむ
だから何だってんの?

B美

実は、WebSocketにも平文ひらぶんと暗号による通信があって、現時点では平文ひらぶん通信のみ(ws://)となっているわ

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

C菜

えっと~

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

B美

さすがはC菜ね
(話が早い!)

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

A子

うへぇー
難しそう…

てか、「サーバ証明書」への署名って、お金がかかるんじゃなかったっけ?

C菜

ですね~

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

B美

Let'sレッツ Encryptエンクリプト」でしょ?

たしかにあそこは無料で署名してくれるわね
(定期的な更新作業が必要だけど…)

ま、でも開発環境だったら「オレオレ証明書」で十分よ

A子

オレオレ詐欺かよ(笑)

B美

似たようなものね(笑)

自分で自分を証明(署名)するのよ
(つまり「自己署名証明書」)

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

A子

んじゃ、さっそくやってみようよ
(難しそうだけど、B美がいれば大丈夫っしょ)

B美

まずは「MATE端末」を開いて、rootになってね

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菜

ドメイン名って「friction-river.jp」や「friction-river.mydns.jp」ではないんですか~?
(どう見ても「IPアドレス」なんですけど~)

B美

インターネット上に公開するなら、そうなるわね

でも(テスト実行の際)LAN内で動かしているWebサーバ(開発環境)に、LAN内のPCからIPアドレスを使ってアクセスしてるじゃない?
(http://192.168.1.205/authapp等)

なので、ドメイン名の箇所は「IPアドレス」でなければならないってわけ
(だからこそ「自己署名」しかできないんだけどね)

A子

CNが「Common Name」、つまりドメイン名ってのは知ってるけどさ

subjectAltName」って何なのよ?

B美

異なるドメイン名を一つの証明書内に入れる仕組みで、「SANsサンズ(Subject Alternative Names)」ってやつよ

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

C菜

同じ「IPアドレス」が指定されてますけど、これって必要なんでしょうか~?

B美

いや、無くても大丈夫だと思うけどね(苦笑)
(一応、念のため…って感じ)

それでは、今作った「server.cnf」というファイルを使って「サーバ証明書」を作っていくよ

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout server.key -out server.crt -config ./server.cnf

ちなみに、有効期間を3650日(約10年)にしといたから…

C菜

二つのファイル(「server.crt」と「server.key」)が生まれましたね~

B美

「server.crt」が公開鍵で、「server.key」が秘密鍵

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

A子

これで終わりなの?

B美

いいえ、まだよ
Webサーバである「Apache2」の設定をしなければいけないわ

まずは以下のコマンドを叩いてね
(カレントディレクトリはどこでもOKだけど、必ずrootユーザで実行すること)

a2enmod ssl[Enter]
a2ensite default-ssl.conf[Enter]

これで「SSL/TLS」が有効になるの

B美

続けて、Apache2の設定ファイルを書き換えましょう

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子

ブラウザのURLとして「https://192.168.1.205/authapp」を指定したら、こんな画面になったよ

C菜

自己署名証明書」を使うとブラウザが警告を出すって、こういう意味だったんですね~

B美

詳細設定」をクリックすると、「192.168.1.205に進む(安全ではありません)」って出るから、それをクリックしてね

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



A子

URLの「https」の箇所って、取り消し線が付いてるじゃん
(「セキュリティ保護なし」とも表示されてるし…)

これって、ほんとに「SSL/TLS」による暗号化通信になってんの?
(実は「http」による平文ひらぶん通信になってない?)

B美

大丈夫!
間違いなく暗号化通信(https)になってるわよ

ブラウザのこの表示は、「サーバ証明書が信頼できない」って意味なのよ
(なにしろ認証局による署名をやってないからね)

その証拠に「サーバ証明書」の表示もできるわよ
(以下は、その例)

Edgeの場合、「セキュリティ保護なし」をクリックしてから、一番上の「」をクリック
右上にある証明書のアイコンをクリックすると、「証明書ビューアー」が起動するわ
(有効期間が約10年間になっているのも確認できたでしょ?)





A子

うーん、なるほどねぇ

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

C菜

B美部長がいたからですよ~

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

B美

違う違う!
「署名無し」のサーバ証明書なんて存在しない(できない)わ

さっき叩いた「openssl」コマンドの中に、オプションとして「-x509」があったでしょ?
あれが「署名を行う」ための指定ってわけ
(自己署名だけど…(苦笑))

C菜

なるほどですねぇ~

理解できました~