今回はタイトルの通りにhttps通信をできるようにしていきます。環境は前回 vps環境でpython,flaskでハローワールドするまで で使用していた環境で行います。お時間があれば前回の記事を読んでおいていただけると、わかりやすいと思います。
前回までの環境でサイトを開くと、http通信ですので、googleさんから安全でないサイトですと、警告されてします。 このままでは読者に見てもらいにくいので、安全なhttps通信にしていきます。 まずはfirewallの確認をします。以下のコマンドを打つと確認できます。 (複数行に分けれているコマンドは1行ずつ実行してください)
sudo firewall-cmd --list-service --zone=public
httpを使えるように設定します。以下コマンドを入力してください。
sudo firewall-cmd --add-service=http --zone=public --permanent
続いて、httpsを使用できるようにます。以下コマンドを入力してください。
sudo firewall-cmd --add-service=https --zone=public --permanent
firewallを再起動します。以下コマンドを入力してください。
sudo firewall-cmd --reload
これで設定できているはずですので、先ほど紹介したforewallを確認するコマンドを入力してください。 以下コマンドでしたね。
sudo firewall-cmd --list-service --zone=public
上記コマンドを入力後、httpsがあればここまではOKです。
https通信に関しては、例えばxserverなどの共用サーバーを利用している分には、共用サーバーで 簡単に設定できますが、vpsなどでは自分で設定しなくてはいけません。vpsでも有料でhttps化 できるものもありましが(自分はconoha vpsです)、自分は無料で行いたいので、色々調べたら let's encryptが良さそうだったので、これを利用する事にしました。
このlet's encryptを使用するのに証明書の制作ツールであるcertbotを導入する必要があります。 自分はこれにかなり手こずりました。色々なサイトをみてみるとcertbotを導入するのに、 certbot-autoを使用しているサイトが多かったのでが、centOS8からうまくいかないようでした。 色々探して以下手順でcertbotを導入しました。snapを使用してやる方法にたどりつきました。
yumレポジトリの導入、以下全てsudoだった気がします。。忘れた
yum repolist epel
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
snapの導入
yum install snapd
snapを自動実行にする
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap
snap起動
snap install core
updateしているかもしれないので以下コマンド実行
snap refresh core
snapを使用してcertbotをインストールします。以下実行してください。
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
ここまでで、certbotインストールができました。
まずはnginxを一旦stopしておきます。
sudo systemctl stop nginx
ssl証明を作成(myapp.demo.comに対して作成)
sudo certbot certonly --standalone -d myapp.demo.com
すると英語でドバーーーっと色々な文章が出てきますが、聞かれるのは3つ
/etc/letsencrypt/live/myapp.demo.com/fullchain.pem
/etc/letsencrypt/live/myapp.demo.com/privkey.pem
ここまでできたら、現在のmyapp_nginx.confの内容を変更します。差し替える前のはhttp通信用 ですので、https通信用にします。またhttp通信でリクエストされたときにhttps通信にリダイレクト するようにします。以下が差し替え前です。
server {
listen 80;
server_name myapp.demo.com;
charset utf-8;
client_max_body_size 75M;
location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/var/www/myapp/myapp_uwsgi.sock;
}
}
そして以下が差し替え後です。
#sslリダイレクト
server {
listen 80;
listen [::]:80;
charset utf-8;
client_max_body_size 1000M;
server_name myapp.demo.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name myapp.demo.com;
charset utf-8;
client_max_body_size 1000M;
ssl_certificate /etc/letsencrypt/live/myapp.demo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/myapp.demo.com/privkey.pem
location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/var/www/myapp/myapp_uwsgi.sock;
}
}
上記のssl_certificateの2行の所で先ほどメモしたものを使用しています。 ここまでできればnginxを再起動しましょう。
sudo systemctl start nginx
このブログで紹介している仮の環境であればhttps://myapp.demo.comにアクセスして、サイトが 保護されていれば完了です!!
このブログで紹介したやり方ですと、SSLの証明の有効期間は90日です。 面倒ですが90日後には有効期限が切れてしまうので証明書の更新が必要です。 自動更新の設定の仕方もあるようなのですが、自分はそれが残念ながらできなかった ので、ここでは手動での更新の仕方を紹介します。もちろん自動更新ができれば それが一番いいので、自動更新の設定ができる方はそうしてください。 本当にどうしたら自動にできるんだろう。。。 まぁ現在同一サーバーで3つのSSLを発行していますが、以下の手動のやり方でも 3つ全部更新されるのでそこまで手間ではないですけどね。 まずは80番ポートエラーが出るのでnginxを停止。
sudo systemctl stop nginx
そのあとで以下のコマンドを入力してください
sudo certbot renew --force-renew
これでnginx再起動してSSLの更新もできました。今回はここまでです。最後まで読んでいただいて ありがとうございました。自分は初めてSSL化した時は調べに調べて3日もかかりました。 めちゃくちゃ大変だったのでまとめておきました。誰かの役に立てば幸いです!!