Let's Encryptで無料SSL化!安全な通信を!

2018/04/18 14:00

こんにちは。

きっと気付かない方もいらっしゃると思うので、初めに書いておきます!

このサイトのURLが「http://」から「https://」になりました!わーい

で、ユーザーさんになんのメリットがあるの?というと、通信保護されます。

特に今の時代、公共のWi-Fiとか、パスワードの無いWi-Fiが沢山ありますよね?

そこで「やったー!無料だしつなげちゃおー!」って感じでつなげてしまうと、

サイトが「http」の場合、その通信内容はハッカーには筒抜けになってます(盗聴されてます)。

これは割と簡単にできちゃいます。

通信先、通信内容が丸見えなので、もしそのサイトにパスワードやメールアドレスのフォームがあったら・・・ぞっとします。

あと、無線のSSIDって簡単に変更できちゃうので、本当にそのWi-FiのSSIDが正当なものか、なんて私もわかりません。

っていうかいちいち調べたくないです。。。

ハッカーはこういった公共Wi-Fi等になりすまして、ユーザーがアクセスしている情報を抜き取ってしまいます。

そこで話を戻すと「https」です。この「s」がついていれば、通信先、通信の内容等を暗号化して保護します。

そうすれば、いくらハッカーでも破るのはかなり難しいです。(というか現時点では不可能?)

そこで、このサイトも安全にしよう!って事で Let's Encrypt の出番です。

 

ここから先はエンジニア向けの内容です。(意味不明だよって方はブラウザバックを・・・w)

 

certbotのインストールは検索すればいっぱい出てくるので割愛します。

で、SSL証明書の取得にはいくつか方法があります。

  1. standalone
  2. webroot

 

standalone

スタンドアローンサーバーが自動で立ち上がり、80番ポートを使い認証します。

そのため、今稼働しているWEBサーバーは一旦STOPしないといけません。

apache、nginx等ですね。

webroot

今稼働しているWEBサーバーを使い、特定のディレクトリに認証用のファイルをセットし認証します。

おすすめはこちらですね。ダウンタイムが無いのでWEBサーバーを止めたくないよって方にはおすすめ。

ただし、面倒な点もあります。

・特定のファイルを配置するため、少し設定をいじる必要がある

・リダイレクトがかかっているとうまくいかない

くらいです。

 

とりあえず、私の環境

・CentOS7

・Nginx

 

では、早速とりかかります。

一番初めに、ちゃんとDNSレコードがひっぱれるか確認しておいてください。

AレコードもしくはAAAAレコードで引ける事が前提です。

以下digコマンドで確認できます。

$ dig loootus.com

ちゃんと引けていれば、ANSWERが帰ってきます。

;; ANSWER SECTION:
loootus.com.            3600    IN      A       xxx.xxx.xxx.xxx(IP)

 

お次に、Nginxの設定を少し変更。「.well-known」ってとこが変更点です。

webrootプラグインを使うとこのディレクトリにファイルを作成してきます。

server {
    listen       80;
    server_name  loootus.com;

    # Let's Encrypt (SSL)
    location ^~ /.well-known/acme-challenge/ {
        root  /var/www/hoge;
    }
#...
}

終わったら、Nginxを再起動します。

 

次にインストールです。「hoge」の部分は適宜、自分のディレクトリとドメインに変えてください。

$ certbot-auto certonly --webroot -w /var/www/hoge -d hoge.com

実行中・・・デバッグログが吐かれます。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for loootus.com
Using the webroot path /var/www/hoge for all unmatched domains.
Waiting for verification...
Cleaning up challenges

うまくいけば、以下のように「Congratulations!」が表示されます!

で、「/etc/letsencrypt/live/loootus.com/」ディレクトリに「fullchain.pem」と「privkey.pem」を作りましたよ。ってメッセージが出ます。

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/loootus.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/loootus.com/privkey.pem
   Your cert will expire on 2018-07-17. 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 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

 

あとは、これをNginxに設定するだけ!

server {
    listen       443 ssl;
    server_name  loootus.com;
    ssl_certificate           /etc/letsencrypt/live/loootus.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/loootus.com/privkey.pem;
    ssl_session_cache         shared:SSL:1m;
    ssl_session_timeout       5m;
    ssl_ciphers               AESGCM:HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
#...
}

 

httpはもう使わないよって方は、リダイレクトしちゃって問題ないと思います。

※ただ、更新用にwell-knownはそのままにしておきます。

server {
    listen       80;
    server_name  loootus.com;

    # Let's Encrypt (SSL)
    location ^~ /.well-known/acme-challenge/ {
        root  /var/www/hoge;
    }

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

 

これで、再起動すれば、無事にサイトがSSL化されてます!

で、もう一つ重要なのが、証明書の有効期限です。

3ヶ月くらいなので、crontabに追加しておいたほうが無難です。

便利なコマンドも用意されていますので、簡単にできます。

毎月1日の3時にrenewコマンドを実行して、nginxの設定をリロードします。

$ crontab -e
00 03 01 * * /usr/bin/certbot-auto renew && /bin/systemctl reload nginx

この renew コマンドが証明書を更新するコマンドです。

 

これで、自動でSSL証明書が更新されます!

ではまた!