じょりらぼ

野菜だったりプログラムだったり電子工作だったり

ConoHaでSSL化してみる(CentOS7/nginx)

流れは常時SSL化なので波にのっちゃうしかないでしょ。

作業前の状態

・CentOS7
・ nginxをインストール&起動済み
sshも起動済み
・独自のドメイン設定済み

まずはポートの確認

  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh dhcpv6-client http
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

うん、httpsが空いてないね、なので空けます

firewall-cmd --permanent --add-service=https --zone=public
firewall-cmd --reload

これだけ、再度確認して、httpsが追加されてればOKです

証明書をインストールする

あくまで個人サイトのレベルなので無償で証明書を作ってくれるLet's Encryptを利用します。
有名なやつですね。
Let's Encryptは証明期間が90日なのですが、90日立つたびに手作業で証明を入れ替えるのはめんどうです。
故にcertbotと呼ばれるものを利用します。

git clone https://github.com/certbot/certbot

gitが入っていないようであれば「yum install git」とでも打ってインストールしちゃってください。

次に証明を作っていきます。

cd ./certbot
sudo ./certbot-auto certonly --webroot -w /home/hogehoge/html/ -d hogehoge.com

「/home/hogehoge/html/」はnginxのルートディレクトリ、
hogehoge.comは取得したドメインに書き換えてくださいね。

あとは質問に答えていきます。
メールアドレスの入力とライセンスに同意するかの確認、
また、メールアドレスにメルマガ的な通知がいるかの確認、そして最後にドメインの入力です。

うまく証明書ができあがると下記フォルダにデータが出来上がります。

/etc/letsencrypt/

サーバに設定するときは「/etc/letsencrypt/live/」配下のフォルダにあるシンボリックリンクを使うようです。
シンボリックリンクは常に最新を指し示すようです。

nginxを設定する

nginxの設定は特になにも変えてなければ「/etc/nginx/nginx.conf」にあるかと思います。
そのファイルの中にhttpの設定があると思いますので、
その中にhttpsの設定を書き加えます。

server {
     ・・・
     listen 443 ssl;
     ssl_certificate      /etc/letsencrypt/live/hogehoge.com/fullchain.pem;
     ssl_certificate_key  /etc/letsencrypt/live/hogehoge.com/privkey.pem;
 ・・・
}

「sudo nginx -s reload」でサービスを再起動してhttpsでアクセスしてみましょう!
どうですか?見れましたか?やったね★

httpのアクセスをhttpsへリダレクトする

httpsを設定したなら積極的に使いたいですよね!
httpアクセスをhttpsへリダイレクトするようにしてみます。

「/etc/nginx/nginx.conf」を以下のように書き換えました。

変更前

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  hogehoge.com;
        root         /home/hogehoge/html;

        # SSL
        listen 443 ssl;
        ssl_certificate      /etc/letsencrypt/live/hogehoge.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/hogehoge.com/privkey.pem;
        ・・・
    }

変更後

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  hogehoge.com;
        root         /home/hogehoge/html;

        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        ssl_certificate      /etc/letsencrypt/live/hogehoge.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/hogehoge.com/privkey.pem;

        server_name  hogehoge.com;
        root         /home/hogehoge/html;
        ・・・
    }

証明書を自動更新してみる

cronをつかって定期的に証明書を自動生成するようにしてみます。

0 2 1 * * /home/hogehoge/certbot/certbot-auto renew --post-hook "/bin/systemctl reload nginx"

これで月初めの夜中の2時に動くはずです!たぶん!