1台のサーバーで運用したいウェブサイトなどではなるべくコストを減らしたかったりすると思います。AWSのELBやGCPのロードバランサーなどクラウドサービスで提供されているロードバランサーを使うと簡単にSSLの設定ができてHTTPSできたりしますが、少々お値段が高くなってしまうということでLet's Encryptを使ってなるべく安く運用してみようということで試してみました。
Let's Encryptのページの案内をみてみると利用する場合はcertbotを使うと良いですよと書かれているので、certbotを使ってみることにしました。certbotはLet's Encryptの証明書の発行などを行ってくれるソフトウェアです。Webページをみてみると、
My HTTP web site is running on セレクトボックス(Software) on セレクトボックス(System)
というところがあるので、SoftwareとSystemを選ぶとインストール方法の案内のページにいきます。今回は、NginxとDebian 9 (stretch)を選びました(試しにGCPを使ってみましたので)。 この後は、この案内ページの通りに進めれば大丈夫です。
SSHでサーバーにログイン
ssh -i {サーバーのキー} {ログイン名}@{IPアドレス}
などでログインしてから、certbotをインストールします。
sudo apt install certbot python-certbot-nginx
次に設定を行います。今回は証明書の発行だけお願いしてnginxの設定は自分で行うことにしたので次のコマンドを入力しました。
sudo certbot certonly --nginx
するといくつか質問事項があるので答えます。Terms of Serviceなどのの同意に加えて、SSL証明書の発行に特に関係するのがドメインのところです。今回設定するドメインを入力します。 入力が終わるとSSL証明書の発行を行い自動的に保存してくれます。ここでの注意点ですが、発行する前にHTTPでこのドメインにアクセスできる環境を作っておく必要があるのであらかじめサーバーをDNSに登録しておく必要があります。
発行が完了するとIMPORTANT NOTESに、発行された証明書のファイルのパスが2つ書かれているのでメモしておきます。次のようになっていると思います。
/etc/letsencrypt/live/{ドメイン名}/fullchain.pem /etc/letsencrypt/live/{ドメイン名}/privkey.pem
今回は設定は自分で行う方を選んだので、nginxの設定を追加します。
環境によって違うとは思いますが、今回の環境では次のように設定ファイル(Debianの場合は/etc/nginx/site-enabled/default など)を変更しました。 以下のの部分を追加しています。{ドメイン名}のところは置き換えます。
server { listen 443 ssl; server_name {ドメイン名}; ssl_certificate /etc/letsencrypt/live/{ドメイン名}/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/{ドメイン名}/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; root /var/www/html; index index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ =404; } }
これでnginxを再起動してブラウザでhttps://から始まるURLでアクセスできれば完了です。
Let's Encryptは発行される証明書の期間が短いので定期的に再発行が必要になりますが、こちらもcertbotが行ってくれるようです。
sudo systemctl list-timers
のコマンドを実行するとスケジュールされているようでした。
参考にさせていただいたページ: letsencrypt.org certbot.eff.org nginx.org