Let's Encrypt で DNS-01を利用したSSL証明書の取得方法

  • 15
    Like
  • 1
    Comment

DNS-01 方式

Let’s EncryptでSSL証明書を取得する方法で、WEBサーバが1つのみ稼働させている時はHTTP-01方式として沢山紹介されています。
負荷分散させている場合などでは、ドメイン確認が出来ません。
そこで、Let’s Encryptでは、ドメイン認証方式による確認方法として、DNS−01方式が用意されています。

Let’s EncryptのAutomatic Certificate Management Environment(ACME)の仕様には、ドメイン認証方式(DNS-01)がありますので、詳しい仕様についてはサイトを確認して下さい。

ここでは、サクッと認証とSSL証明書の生成方法だけを説明します。
※ ApacheやNginxなどのSSL証明書の設定方法は割愛してます。

インストール&セットアップ

現時点で、DNS-01方式のスクリプトが、公式で用意されていませんので、
クライアントはサードパーティ製のletsencrypt.shを使用します。
以下のgitより取得して下さい。
以降、letsencrypt.shディレクトリにて作業します

git clone  https://github.com/lukas2511/letsencrypt.sh
cd letsencrypt.sh

DNS認証では、Hookスクリプトでトークン認証を行います。
サンプルはdocs/examples/hook.shとして、Hookスクリプトが用意されていますのでコピーします。

cp -pr docs/examples/hook.sh .

以下の通り、deploy_challengeメソッド部分を修正します。

vi hook.sh

function deploy_challenge {
    local DOMAIN="${1}" TOKEN_FILENAME="${2}" TOKEN_VALUE="${3}"

    echo "Set TXT record of _acme-challenge.$DOMAIN to $TOKEN_VALUE"
    read
}

証明書取得

letsencrypt.shを実行します。
hookスクリプトにより、readの箇所で停止し、認証用のトークンが表示されます。

./letsencrypt.sh -c -d hogehoge.com --challenge dns-01 -k ./hook.sh

Set TXT record of _acme-challenge.hogehoge.com to PMulhL3LmSiTgd00xORGZUNknemC0zPFWew7ToqcKm4

表示されたトークンを、TXTレコードとして、DNSに設定します。
上記の例では、 _acme-challenge.hogehoge.comをTXTキーとして、PMulhL3LmSiTgd00xORGZUNknemC0zPFWew7ToqcKm4を値に設定します。

DNS設定後は、反映にある程度時間が掛かると思いますので、1時間程度待つ必要があるでしょう。
その間、シェルのWindowを閉じないようにして下さい。
再度実行するとトークンが変更されますので、DNSレコードも再設定が必要です。

ある程度待ったら、Enterキーで実行を続け、以下の通り成功すればOKです。

 + Responding to challenge for kosokubus.ex-xyz.xyz...
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Done!

成功すると、以下のディレクトリに認証キーなどが生成されます。
letsencrypt.sh/certs/hogehoge.com/

概ね、利用するのは、次のファイルです。

lrwxrwxrwx 1 root root   19 Aug  4 07:16 cert.csr -> cert-1470260375.csr
lrwxrwxrwx 1 root root   19 Aug  4 07:16 cert.pem -> cert-1470260375.pem
lrwxrwxrwx 1 root root   20 Aug  4 07:16 chain.pem -> chain-1470260375.pem
lrwxrwxrwx 1 root root   24 Aug  4 07:16 fullchain.pem -> fullchain-1470260375.pem
lrwxrwxrwx 1 root root   22 Aug  4 07:16 privkey.pem -> privkey-1470260375.pem

ここまで取得できれば、あとは各WEBサーバにファイルをコピーするなり、rsyncするなり好きに料理しましょう。