amustallホーム

vpsで作ったサイトをhttps通信できるようにするまでを徹底解説

まずはfirewallの確認

今回はタイトルの通りに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です。

certbotの導入

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インストールができました。

SSL証明書発行

まずはnginxを一旦stopしておきます。


sudo systemctl stop nginx
            

ssl証明を作成(myapp.demo.comに対して作成)


sudo certbot certonly --standalone -d myapp.demo.com
            

すると英語でドバーーーっと色々な文章が出てきますが、聞かれるのは3つ

  • メールアドレス
  • 規約に同意します?
  • メールアドレス公開していいですか?
  • メールアドレスは自分のメールアドレスを入力、規約に同意はYを選択、メールアドレスの公開 に関しては自分はNにしてました。その後に以下が生成されるのでメモしてください。 後でnginx.confを差し替える時に使用します。

    
    /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の更新について

    このブログで紹介したやり方ですと、SSLの証明の有効期間は90日です。 面倒ですが90日後には有効期限が切れてしまうので証明書の更新が必要です。 自動更新の設定の仕方もあるようなのですが、自分はそれが残念ながらできなかった ので、ここでは手動での更新の仕方を紹介します。もちろん自動更新ができれば それが一番いいので、自動更新の設定ができる方はそうしてください。 本当にどうしたら自動にできるんだろう。。。 まぁ現在同一サーバーで3つのSSLを発行していますが、以下の手動のやり方でも 3つ全部更新されるのでそこまで手間ではないですけどね。 まずは80番ポートエラーが出るのでnginxを停止。

    
    sudo systemctl stop nginx
                

    そのあとで以下のコマンドを入力してください

    
    sudo certbot renew --force-renew
                

    これでnginx再起動してSSLの更新もできました。今回はここまでです。最後まで読んでいただいて ありがとうございました。自分は初めてSSL化した時は調べに調べて3日もかかりました。 めちゃくちゃ大変だったのでまとめておきました。誰かの役に立てば幸いです!!

    ブログ一覧へ戻る