2018/04/02更新

[サーバー] Let's EncryptとNginxで、https対応を行う

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日は、無料でSSL対応ができるLet's Encryptを使って、Nginxのhttps対応を書きたいと思います。



目次




Let's Encryptとは

Let's Encryptは、無料でSSL証明書を発行できるサービスです。さらに証明書の自動更新もできます。SSL証明書は安いものでも1年に数千円かかりますが、無料でできるなんて素敵ですね。

非営利団体が運営していて、「Webにおける暗号化(HTTPS)の使用率を100%にする」ことを使命に活動しているようです。カッコイイ。有名企業や団体がスポンサーにいて、かなり頼もしいです。



Let's Encryptを使ってhttps対応を行う

ここでは、EC2とNginxの環境(構築方法はこちらのブログ参考)を例に、導入手順を書きたいと思います。UbuntuやCentOS7なども流れは同じなので、非公式解説サイトも参考にしながら流れを追っていただけたら幸いです。


事前に

以降の作業は、ルートユーザーで行います。
$ sudo su -

また、SSL化対象のWebサーバーが起動していて、ドメインも指定されている必要があります。この記事ではドメインがmy.example.comであると仮定して、話を進めます。
# 80ポートで表示されるか
# ブラウザで以下のURL
http://my.example.com
SSL設定中に、Let's Encryptのサーバーから80番ポートでアクセスされるので、80ポートは公開しておく必要があります。


Let's Encryptを導入する

Let's Encryptを利用するために、cerbotというツールを導入します。以下のコマンドでインストールします。
# cerbotのインストール
$ curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot
$ chmod 700 /usr/bin/certbot
インストール後に、以下のコマンドが認識されればOKです。
$ cerbot-auto


SSL証明書を発行する

cerbot-autoコマンドを使って、証明書の発行を行います。以下のコマンドを実行します。
# 証明書の発行
certbot certonly --webroot -w /usr/share/nginx/html -d my.example.com --debug

# オプションの説明
# --webroot : Webサーバーを用いてSSL発行の手続きを行う
# -w        : ドキュメントルートを指定
# -d        : SSL化対象のドメインを指定
# --debug   : (Amazon Linuxの場合のみ)まだ実験的な位置付けだが使いたい場合に付与
上記コマンドを実行すると、メールアドレスの入力を求められるので、入力します。
# メールアドレスが求められる
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): 
次に、同意を求められるので、規約を読んで「(A)gree」を選択します。
## 同意が求められる
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel:
次に、登録したメールアドレスにて更新情報を受け取るかを問われます。必要なければ「(N)o」を選択します。
-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: 
しばらく待つとSSLの発行が終わり、証明書の保存先が表示されて正常終了します。
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/my.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/my.example.com/privkey.pem
   Your cert will expire on 2018-02-26. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
実際に上記で示されたディレクトリを確認すると、証明書があることを確認できます。
# 証明書の確認
$ ls /etc/letsencrypt/live/my.example.com/
cert.pem  chain.pem  fullchain.pem  privkey.pem  README
これで証明書の導入は完了です。



Nginxでhttpsを有効化する

nginx.confなどの設定ファイルを編集して、SSLを有効化します。
# /etc/nginx/nginx.conf など
server {
  ...
  # SSLを利用.
  listen 443 ssl;
  # SSL証明書のパスを指定.
  ssl_certificate     /etc/letsencrypt/live/my.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/my.example.com/privkey.pem;
  ...
}
設定を読み込んで有効化します。
service nginx reload
ブラウザからhttpsでアクセスできればOKです。
# SSLでアクセス.
https://my.example.com



証明書の自動更新

Let's Encryptの証明書の有効期限は3ヶ月です(執筆時2017/12の場合)。cerbotとcronを用いることで、自動的に更新することができます。
# crontab -e

## 証明書の自動更新(毎月10日の3時)
0 3 10 * * /usr/bin/certbot renew && /sbin/service nginx reload



参考ドキュメント

以下のサイトを参照しました、ありがとうございます。基本的には日本語サイトが分かりやすいですが、時々古い場合があるので適宜公式サイトも見ながら情報を得ると良さそうです。

Let's Encrypt Documentation(公式、英語)

Let's Encrypt 総合ポータル(非公式、日本語)



関連記事

Let's Encryptについては下記の記事も書きました。参考になれば幸いです。

[サーバー] Let's Encryptで複数ドメインに対応した証明書を作成する


最後に

2018年1月からはワイルドカード証明書も発行できるようになるようです。楽しみですね。

最後になりますが本ブログでは、インフラ、Linux、Node.js、Python、Swift、Go言語、フロントエンド、Java、機械学習、などの技術トピックを発信をしていきます。「プログラミングで困ったその時に、解決の糸口を見つけられる」そんな目標でブログを書き続けています。今後も役立つネタを書いていきますので、ぜひ本ブログのRSSTwitterをフォローして貰えたら嬉しいです ^ ^

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

[NodeJS] nodeで例外処理を書いて、最低限落ちないサーバー実装を行うException Handler
[NodeJS] requestモジュールを使って、サーバーから画像ファイルをダウンロードする
[サーバー] さくらVPSのセットアップ② 〜 nginxのインストール、Jenkinsのインストール、nginxとJenkinsの接続(リバースプロキシ)、nginxとPHP、パケットフィルタリング、など 〜
[サーバー] さくらVPSのセットアップ① 〜 OSの確認、ユーザー作成、Git、Ruby導入 〜
[サーバー] AmazonLinuxにMySQL5.7をインストールする
[サーバー] MySQL5.7でrootのパスワードを忘れた場合のリセット方法(CentOSやAmazonLinuxの場合)
[Go] net/httpパッケージでWebサーバー(handlerの書き方、静的ファイル配信、Basic認証、など)
RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。