Let's Encrypt を使用して日本語ドメインのSSL証明書を取得する

前略

鴉河雛です

    というわけで、以前取得したSSL証明書も期限まで後6日に迫っていました・・

以前から、RapidSSLが切れたらLet’s Encryptを使用するつもりでいましたが、

IDNのサポート開始が8月予定から11月30日に・・・

これは困った!!!と思ってたら10月20日に使用できるようになっていました!

IDN Support
 ・Enabled: October 20, 2016
Let’s Encrypt now supports issuance for Internationalized Domain Names (IDNs).

https://letsencrypt.org/upcoming-features/

と言うことで、早速やっていきます・・・・が!

公式で提供しているCertbotはまだ対応していないとのことなので、Dev版で取得していかなければいけないそうです。

(知らなくて最初やった時に対応してない言われてちょっと焦った・・・)

大体の流れは、Let’s Encrypt 総合ポータルに記載されているやり方と同じです。

1、開発版を取得する

まず最新の開発版を取得します。

詳細はこちらに記載されていますので、そちらを確認してください。

では、記載されている通りに以下のコマンドを実行します。

git clone https://github.com/certbot/certbot cd certbot ./letsencrypt-auto-source/letsencrypt-auto --os-packages-only ./tools/venv.sh

と、ここでちょっとはまりました。

Python側でエラーが出たのです。

私はPythonとか知らないので適当にググった感じで出てきた対策で何とか使用できたので、

そちらも記載しておきます。

※エラーが出なかった方はスルーで・・

【Python】pip installで突如UnicodeDecodeErrorが出始めたので対処した

下記ファイルの、922行目を直します。

venv/lib/python2.7/site-packages/pip/\_vendor/distro.py

- stdout, stderr = stdout.decode('ascii'), stderr.decode('ascii') + stdout, stderr = stdout.decode('utf-8'), stderr.decode('utf-8')

修正が完了したら、以下を実行します。

pip install -e 'acme[dev]' -e '.[dev,docs]' -e certbot-apache -e certbot-nginx -e letshelp-certbot -e certbot-compatibility-test

これで開発版の準備は終わりです。

2、証明書を取得する

それでは証明書を取得していきましょう!

ここからの手順はほとんど総合ポータルと同じです。

まずは、WEBサーバを一時的に停止します。

systemctl stop nginx

次に以下を打ちます。

source ./venv/bin/activate

そして以下を実行して取得を開始します。

certbot certonly --standalone -d example.com -d www.example.jp

取得したいドメインが複数ある場合は、 オプション 「-d」で追加していきます。

問題がなければ、メールアドレスの入力を求められます。

Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):

緊急の通知や諸々の連絡で使用されるそうです。

完了したら利用規約への同意を求められますので同意します。

------------------------------------------------------------------------------- Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree in order to register with the ACME server at https://acme-v01.api.letsencrypt.org/directory ------------------------------------------------------------------------------- (A)gree/(C)ancel:

後は取得完了を待って、終わりです。

IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.jp/fullchain.pem. Your cert will expire on 2017-02-03. 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" - 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

取得したドメイン名と署名書の場所、有効期限が記載されていますので、確認してください。

Let’s Encryptだと3か月が有効期限みたいです。

以上で、取得は完了です

3、証明書を適用する

取得した証明書を適用していきます。

証明書は以下のフォルダに存在しています。

/etc/letsencrypt/ドメイン名/archive/

サーバ証明書は「cert N.pem」

中間証明書は「chain N.pem」

サーバ証明書と中間証明書の結合ファイルは「fullchain N.pem」

秘密鍵は「privkey N.pem」となります。

※Nには取得発行順で番号が振られます

以下にシンボリックシンクも存在している為、今回はそちらを使います。

/etc/letsencrypt/ドメイン名/live/

サーバ証明書は「cert.pem」

中間証明書は「chain.pem」

サーバ証明書と中間証明書の結合ファイルは「fullchain.pem」

秘密鍵は「privkey.pem」となります。

こちらのリンクは、最新の証明書を取得した時に自動で更新してくれます。

Nginxを使用している場合は、結合ファイルと秘密鍵が必要ですので、そちらを指定します。

ssl\_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem; ssl\_certificate\_key /etc/letsencrypt/live/ドメイン名/privkey.pem;

後は、Nginxを起動すれば終了です。

systemctl start nginx

4、自動更新を設定する

3か月ごとに証明書を手動で更新していたらきりがないので自動で更新できるように設定します。

更新には取得した時にも出ていたように、「certbot renew」を使用します。

また、更新を適用するにはWEBサーバを更新しなければいけないのでそれもあわせて行えるようする必要があります。

と言うことでcronに以下のスクリプトを作成して登録します。

systemctl stop nginx cd /letsencrypt/certbot source ./venv/bin/activate certbot renew --force-renew systemctl start nginx

00 05 1-12/2 \* \* /letsencrypt/renew.sh

これで2か月に1回自動更新されるはず?です。

※パスとかは環境に合わせて変えてください

と言うわけで、とりあえずの設定が完了しました。

Let’s Encryptのおかげで誰でも簡単にTLS証明書が使えるようになり、便利な世の中になりました。

ここで紹介したやり方はあくまで私個人がやったやり方であり、正しいやり方ではないかもしれません。

実際に実施して損害が起きたりしても一切の責任は取りませんのでご了承を。

では、また。