Let’s Encryptの無料SSL証明書で、ウェブサイトを安全に公開する

1.今回は何の記事?

はい、いつものようにまずは要るか要らないのかわけのわからないお決まりの第1章です。
「今回は何の記事?」てタイトル見りゃわかるやろが

SSL証明書を無料で取得して公開してるサイトをhttps化しちゃいましょうってやつです。

何がいいかってなんか良くない?
なんか、うん。
暗号化通信って響きがもうかっこいいよね

 

2.Let’s Encryptってなんなん

「そもそもLet’s Encryptってなんですの?」って人、絶対いますよね
どうやってこの記事までたどり着いたんですかねぇ…SSLとか証明書とかかな?

まぁいいけど、Let’s EncryptってのはSSL/TLS の暗号化通信に用いる証明書の認証局(CA; Certificate Authority)の1つ。
世界中には様々な認証局があるんだけど、Let’s Encrypt には次の特長がある

  • 自由に使える
  • 自動で署名される
  • オープン
  • 証明書の有効期間は90日
  • 期限が切れても自動で更新できる

って感じですかね

 

3.筆者の動作環境

筆者の動作環境…つまりこのサーバの動作環境はこんな感じ

  • RaspberryPi2
  • Raspbian4.3.30(?)
  • Apache2.4.10

 

4.Let’s Encryptをインストールする

インストールするっていうとちょっと違うかも。
まぁ細かいことは気にしないでさっさと本題に入ろうか

まずは、cert-botと言われる、Let’s Encryptと通信して証明書を取得するためのツールをゲットします。
今は仮に/usr/binに保存していますがどこでもいいです。
ただ、PATHが通ってるディレクトリの方が何かと便利

# curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
# chmod 700 /usr/bin/certbot-auto

ダウンロードしたら、certbot-autoコマンドを用いて証明書を発行していきます。

# certbot-auto certonly \    # 証明書の作成
    --webroot \              # 既存のウェブサーバを使うモードを選択
    -w /var/www \            # 証明書を得たいWebサイトのドキュメントルート
    -d koron0902.ddns.net \  # 認証するドメイン名
    --email <メール>@<アドレス>  # メールアドレス登録(証明書期限切れの通知用)

このコマンドを叩くと、必要なパッケージをインストールし始める場合があります。
その時は素直にインストールしてやってください。

パッケージがインストールされたら、利用規約が表示されます。
Agreeに合わせてやってEnterで同意してください。
同意すると証明書を得ることができます。(同意しないとどうなるんだろ…やっぱり取得できないんだろうね)

certbotはサイトが存在しているかどうかの確認を「サイトにアクセスできるかどうか」で確認しています。
なんで、自宅サーバでルータのポート解放を行なっていなかったり、iptablesとかの設定でアクセス拒否しているとうまく証明書を得ることができません。

うまく証明書を取得できるとこんな感じの文章が出てきます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/secure.zem.jp/fullchain.pem. Your cert will
   expire on 2016-10-09. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to <メールアドレス>.
 - 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

すると、証明書関連のファイルが/etc/letsencript/live以下に保存されています。
今回認証に使ったドメインはkoron0902.ddns.netなので、証明書が保存されているフォルダは/etc/letsencript/live/koron0902.ddns.netになります。

# ls -l /etc/letsencrypt/live/koron0902.ddns.net
total 0
lrwxrwxrwx 1 root root 42 Sep 15 12:38 cert.pem -> ../../archive/koron0902.ddns.net/cert1.pem
lrwxrwxrwx 1 root root 43 Sep 15 12:38 chain.pem -> ../../archive/koron0902.ddns.net/chain1.pem
lrwxrwxrwx 1 root root 47 Sep 15 12:38 fullchain.pem -> ../../archive/koron0902.ddns.net/fullchain1.pem
lrwxrwxrwx 1 root root 45 Sep 15 12:38 privkey.pem -> ../../archive/koron0902.ddns.net/privkey1.pem

これで、証明書の取得は終わりです

 

5.Apacheに証明書を適用する

最後に、実際にSSL通信を行うためにApacheにさっき取得したSSL証明書を適用します。
/etc/apache2/site-available内に、default-ssl.confがあると思います。
これが、SSL通信用の設定ファイルの雛形になります。
これをコピーして使います。

cd /etc/apache2/sites-available/
sudo cp default-ssl.conf 000-default-ssl.conf

必要になる設定は、

  • SSLEngine <– そもそもSSLを使うかどうか
  • SSLCertificateFile <– 証明書のファイルを指定
  • SSLCertificateKeyFile <– 証明書の鍵を設定

の3つです。
で、これをそれぞれ次のようにします。

  • SSLEngine on
  • SSLCertificateFile /etc/letsencrypt/live/ドメイン名/fullchain.pem
  • SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン名/privkey.pem

ファイル全体でまとめるとこんな感じ

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin 任意
                DocumentRoot /var/www
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
                SSLEngine on
                SSLCertificateFile      /etc/letsencrypt/live/ドメイン名/fullchain.pem
                SSLCertificateKeyFile   /etc/letsencrypt/live/ドメイン名/privkey.pem
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                BrowserMatch "MSIE [2-6]" \
                                nokeepalive ssl-unclean-shutdown \
                                downgrade-1.0 force-response-1.0
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

        </VirtualHost>
</IfModule>

で、そしたら保存
でもって、Apacheに関しても一つ二つやることがある。
まずは、SSLのモジュールを有効化してやる。

# a2enmod ssl

で、Apacheで有効になってるサイトは/etc/apache2/site-enabledにシンボリックリンクが貼られるんだけどどうするかってのもちゃんとコマンドがある。
今回のファイルは000-default-ssl.confだから

# a2ensite 000-default-ssl.conf

これで、site-enabledにシンボリックリンクが貼られてるからあとはApacheを再起動するだけ。

# service apache2 restart

これでサイトにアクセスしてみてちゃんとSSL通信が有効になってたら成功。

なってなかったらまた確認するなり他のサイトも見てみるなり諦めるなり選択肢はたくさんあるから頑張って

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です