5と12のリビジョン間の差分 (その間の編集: 7回)
2017-06-02 00:07:55時点のリビジョン5
サイズ: 8089
コメント:
2017-06-04 23:22:08時点のリビジョン12
サイズ: 13753
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 6: 行 6:
   * 認証局のブランドの一つである。これは「Symantec(旧Verisign)セキュア・サーバーID」「!CyberTrust !SureServer」「!SecomTrust セコムパスポート for Web3.0」「!GlobalSign クイック認証SSL」「!GeoTrust RapidSSL」「Comodo PositiveSSL」などの一つと考えれば良い。たぶんどれかは聞いたことあるはずと思う。    * 認証局のブランドの一つである。
   *
これは「Symantec(旧Verisign)セキュア・サーバーID」「!CyberTrust !SureServer」「!SecomTrust セコムパスポート for Web3.0」「!GlobalSign クイック認証SSL」「!GeoTrust RapidSSL」「Comodo PositiveSSL」などの一つと考えれば良い。
   *
たぶんどれかは聞いたことあるはずと思う。
   * 他の認証局と同じような点は、
     * 1証明書をどのように(複数IP, 複数バックエンド, 複数プロトコル)使用しても1取得で済む(安い認証局は大抵そうだよね)。
     * 親ドメインをまたぐ、マルチドメイン証明書(Subject Alternative Names)に対応している(全ての認証局で対応してるね)。
     * その代わり、ワイルドカード証明書には対応していない(対応してるブランドと対応してないブランドとあるね)。
     * DV(Domain Validation)証明書のみ提供(対応してるブランドと対応してないブランドとあるね)。
     * ただしOV(Organization Validation)証明書やEV(Extended Validation)証明書との純技術的な優劣は無い。
行 8: 行 16:
     * 無償。当然ではあるが、1証明書をどのように(複数IP, 複数バックエンド, 複数プロトコル)使用しても1取得で済む。
     * 親ドメインをまたぐ、マルチドメイン証明書(Subject Alternative Names)に対応している。
     * その代わり、ワイルドーカード証明書には対応していない

     * RSA(2048bit, 3072bit, 4096bit), ECDSA(prime256v1, secp384r1) の5種類の鍵が選べる。
     * 無償。
     * RSA(2048bit, 3072bit, 4096bit), ECDSA(prime256v1, secp384r1) の5種類の鍵が選べる(ここまで選べる認証局は限られるね)
行 13: 行 19:
     * 扱える端末が(比較的)少ない。全アクセスの 0.5% であってもフォローしないといけない用途なら使えない。逆に今時のメジャーどころのブラウザは対応している。
     * DV(Domain Validation)証明書のみ。ただしOV(Organization Validation)やEV(Extended Validation)との純技術的な優劣は無い。
     * 今時誤差かもしれないが、扱える端末が(他の認証局と比べて)少ない。
     * エンドユーザーが粘り強く使用している、全アクセスの0.5%以下の端末であってもフォローしないといけない用途であるならお勧めしない。
     * 逆に今時のメジャーどころの端末・ブラウザは対応している。
     * よってPC相手にはほぼ問題無い(Windows XP? IE6? 知らんがな)。
行 18: 行 26:
     * !IdentTrust なの? DST なの? については旧会社のブランドも残ってるらしい、としか認識してない。
行 22: 行 31:
 * ここでは「チャレンジ・レスポンス」を HTTP ではなく、DNS を使う方法について説明する。  * ここでは「チャレンジ・レスポンス」をHTTP(http-01)ではなく、DNS(dns-01)を使う方法について説明する。
行 24: 行 33:
 * DNSサーバーとの連携(諸設定)が必要になってしまうが、この味を知ってしまうと http-01 手順には戻れなくなること請け合いである:-)。  * DNSコンテンツサーバーとの連携(諸設定)が必要になってしまうが、この味を知ってしまうと http-01 手順には戻れなくなること請け合いである:-)。
 * どれくらい戻れないかというと、Webサーバーに対しても dns-01 手順を適用したくなる。
行 27: 行 37:
 * OSは FreeBSD 11.0-R。
 * ACMEクライアントは dehydrated 0.4.0。
 * DNSサーバーは BIND 9.11.0-P3。
 * いずれも最新のリリースということで確認しているが、ある程度古い環境でも問題無いと思われ。
 * 本例では、www.example.jp というコモンネームに対して証明書を発行するものとする。
 * チャレンジ/レスポンスコードをDNSダイナミックアップデートするため、example.jp ゾーンに対するDNSコンテンツサーバーへの更新権限があるものとする。
 * ある程度制限できるとは言え、DNSダイナミックアップデートは「ゾーン」に対してフリーダムに更新できてしまうので、_acme-challenge.www.example.jp ゾーン(に分けて/委任してもらって)に、更新が閉じるよう制限するのが必要と思われる。
 * ここでは敢えて「example.jp」ゾーンから「_acme-challenge.www.example.jp」を自分自身(DNSコンテンツサーバー)へ委任するものとし、外部のDNSコンテンツサーバーへは向けないものとする。
 * ここまでお膳立てが整えられていれば、例えば、サービスゾーンのDNSコンテンツサーバーへの更新権限は得られなくても、自分のDNSコンテンツサーバーに委任してもらって、更新できるようにするのは難しくないと思う。
行 31: 行 44:
いずれも最新のリリースということで確認しているが、ある程度古い環境でも問題無いと思われ。 === 想定サーバー・ドメイン ===
 * DNSコンテンツサーバーは ns.example.jp とする。
   * 実際には複数のDNSコンテンツサーバーで運用されていると思う。
   * それらサーバーへの反映は ns.example.jp の notify yes; およびIXFR(Incremental Zone Transfer)により、全てのサーバーへ即時通達されるものとする。
   * それら詳細についてはここでは取り上げない。
 * SSLサーバーは www.example.jp とする。
 * 上記サーバーは同一でもかまわないし、別々でもかまわない。
 * OSは FreeBSD 11.0-R での想定で行っているが、設定ファイルの位置以外は他のOSでも有効である。
 * インストールされるパッケージ如何によっては細かい振る舞いが変わるが、詳細は取り扱わない。
 * あくまでも FreeBSD 11.0-R 環境における検証結果とする。
行 33: 行 55:
本例では、www.example.jp というコモンネームに対して証明書を発行するものとする。
チャレンジ/レスポンスコードをダイナミックアップデートするため、
example.jp ゾーンに対する権威DNSサーバーへの更新権限があるものとする。
少なくとも _acme-challenge.www.example.jp ゾーン(と分けて/委任してもらって)に対する更新権限は最低限必要である。
=== DNSコンテンツサーバー側 ===
 * DNSサーバーは BIND 9.11.1([[https://www.freshports.org/dns/bind911|ports/dns/bind911]])。

=== SSLサーバー側 ===
 * DNSダイナミックアップデートクライアントは BIND 9.11.1([[https://www.freshports.org/dns/bind-tools|ports/dns/bind-tools]])。
   * 既に BIND 9.11.1 ([[https://www.freshports.org/dns/bind911|ports/dns/bind911]])がインストールされている環境では不要。
   * FreeBSD 9.x 等といった古い環境では nsupdate コマンドが存在したため、そのような環境でもインストールは不要である。
 * ACMEクライアントは dehydrated 0.4.0([[https://www.freshports.org/security/dehydrated|ports/security/dehydrated]])。
行 39: 行 65:
 * いずれも ports/security/dehydrated、ports/dns/bind911 よりインストールする。  * いずれも ports/security/dehydrated、ports/dns/bind911 または ports/dns/bind-utils よりインストールする。
行 42: 行 68:
= DNSサーバーの設定 = = DNSコンテンツサーバーの設定 =
行 44: 行 70:
 * よってディレクトリ作成は不要である。
 * ここでは「example.jp」ゾーンから「_acme-challenge.www.example.jp」を委任する。
 * また自分自身(権威DNSサーバー)への委任とし、特に外部のDNSサーバーへは向けない。
 * DNS権威(コンテンツ)サーバーは ns.example.jp とする。
 * よってディレクトリ作成作業は不要である。
行 67: 行 90:
 * 「DNS権威サーバー」と「SSL証明書を発行したいサーバー」とで、TSIG(Transaction SIGnature)キーを共有する。  * 「DNSコンテンツサーバー」と「SSLサーバー」とで、TSIG(Transaction SIGnature)キーを共有する。
行 71: 行 94:
 * また変更できるレコード名およびリソースレコードを限定する(name _acme-challenge.www.example.jp. TXT)。
行 87: 行 111:
 * 本ファイルの設置場所、命名規則はそれぞれのポリシーに従う。
 * 少なくともFreeBSD的には、/usr/local/etc/namedb/master/ ディレクトリ以下に設置されるものとしている。
 * さらに「example.jp.db」とするか「jp.example.db」とするかなどは、特に明言しない。
行 101: 行 129:
 * 本ファイルの設置場所、命名規則はそれぞれのポリシーに従う。
 * 少なくともFreeBSD的には、/usr/local/etc/namedb/master/ ディレクトリ以下に設置されるものとしている。
 * さらに「_acme-challenge.www.example.jp.db」とするか「jp.example.www._acme-challenge.db」とするかなどは、特に明言しない。
行 113: 行 145:
chmod 0400 ダイナミックアップデートキーファイル名
行 116: 行 149:
もちろん secret の部分は毎回ランダムに発行される。  * もちろん secret の部分は毎回ランダムに発行される。
 * このファイルは named.conf でも、(後で説明する)nsupdate コマンド(-k オプションで)でもそのまま解釈してくれる。
 * 本ファイルの設置場所、命名規則については一概に言えることが無く、「ポリシーで」で逃げるには無責任すぎるので、例を出してみる。
行 118: 行 153:
このファイルは named.conf でも(後で説明する)nsupdate コマンドでもそのまま解釈してくれる。 === 本例における具体的設定例 ===
 * BIND側に設置する場合は、/usr/local/etc/namedb/ ディレクトリに設置することとする。
 * dehydrated側に設置する場合は、/usr/local/etc/dehydrated/ ディレクトリに設置することとする。
 * ファイル名についてだが、「キー名.key」とするのが違和感なくていいと思う。
 * 肝心のキー名だが、[[https://ftp.isc.org/isc/bind9/cur/9.11/doc/arm/Bv9ARM.ch04.html#tsig|BIND9.11のマニュアル(TSIG)]]によれば「ホスト名1-ホスト名2.」という例がある。
 * 本気かどうかわからないが、「DNSコンテンツサーバー-ダイナミックアップデートするサーバー.」というニュアンスらしい。
 * 本件の場合、ns.example.jp と www.example.jp であることから「ns-www.」とするのが妥当か(ほんと?)。
 * まぁなんでもいいけど、わかりやすいようにね。

{{{
key "ns-www." {
    algorithm hmac-sha256;
    secret "PfzeGvXiOqtPOwQJY/iNFrvlD3/eKAHRZ0TbyK5GYII=";
};
}}}

 * /usr/local/etc/namedb/ns-www.key
 * /usr/local/etc/dehydrated/ns-www.key


= 参考文献 =
 * [[https://ftp.isc.org/isc/bind9/cur/9.11/doc/arm/Bv9ARM.html|BIND 9 Administrator Reference Manual]]

Let's EncryptでSSL証明書の新規作成と自動更新(dns-01編)

  • Lets' EncryptによるSSL証明書の自動取得・自動更新に関するメモを残す。

  • Let's Encrypt について復習ではあるが、
    • 認証局のブランドの一つである。
    • これは「Symantec(旧Verisign)セキュア・サーバーID」「CyberTrust SureServer」「SecomTrust セコムパスポート for Web3.0」「GlobalSign クイック認証SSL」「GeoTrust RapidSSL」「Comodo PositiveSSL」などの一つと考えれば良い。

    • たぶんどれかは聞いたことあるはずと思う。
    • 他の認証局と同じような点は、
      • 1証明書をどのように(複数IP, 複数バックエンド, 複数プロトコル)使用しても1取得で済む(安い認証局は大抵そうだよね)。
      • 親ドメインをまたぐ、マルチドメイン証明書(Subject Alternative Names)に対応している(全ての認証局で対応してるね)。
      • その代わり、ワイルドカード証明書には対応していない(対応してるブランドと対応してないブランドとあるね)。
      • DV(Domain Validation)証明書のみ提供(対応してるブランドと対応してないブランドとあるね)。
      • ただしOV(Organization Validation)証明書やEV(Extended Validation)証明書との純技術的な優劣は無い。
    • 他の認証局と明確に違う点は、
      • 無償。
      • RSA(2048bit, 3072bit, 4096bit), ECDSA(prime256v1, secp384r1) の5種類の鍵が選べる(ここまで選べる認証局は限られるね)。
      • ACME(Automated Certificate Management Environment)プロトコルによる証明書の認証から発行までの一連のバッチ化(自動化)が可能。
      • 今時誤差かもしれないが、扱える端末が(他の認証局と比べて)少ない。
      • エンドユーザーが粘り強く使用している、全アクセスの0.5%以下の端末であってもフォローしないといけない用途であるならお勧めしない。
      • 逆に今時のメジャーどころの端末・ブラウザは対応している。
      • よってPC相手にはほぼ問題無い(Windows XP? IE6? 知らんがな)。
      • 取得数制限(特に単位時間あたりの)があるので注意。詳しくは Rate Limits を参照のこと。

      • 検証(ステージング)用認証局も用意されているので、セットアップ時の検証や、ACMEクライアントの開発といった用途ではこちらを使う。

      • 「現在の」ルート証明書は「IdentTrust|DST(Digital Signature Trust) Root CA X3」である。

      • IdentTrust なの? DST なの? については旧会社のブランドも残ってるらしい、としか認識してない。

      • 少なくとも中間証明書の発行者(Issuer)はそうである(ISRG - Internet Security Research Group ではない)。

      • このルート証明書がインストールされた端末が対応端末となる。
      • 中間証明書は「Let's Encrypt Authority X3」である(場合によってはこっち「も」入ってることがあるかもしれない)。
  • 使用するツール・傾向については Let's EncryptでSSL証明書の新規取得と自動更新(http-01編) を参照のこと。

  • ここでは「チャレンジ・レスポンス」をHTTP(http-01)ではなく、DNS(dns-01)を使う方法について説明する。
  • 環境(イントラネット内など)によってはこの方法しか採れないケースもありうる。
  • DNSコンテンツサーバーとの連携(諸設定)が必要になってしまうが、この味を知ってしまうと http-01 手順には戻れなくなること請け合いである:-)。
  • どれくらい戻れないかというと、Webサーバーに対しても dns-01 手順を適用したくなる。

検証環境

  • いずれも最新のリリースということで確認しているが、ある程度古い環境でも問題無いと思われ。
  • 本例では、www.example.jp というコモンネームに対して証明書を発行するものとする。
  • チャレンジ/レスポンスコードをDNSダイナミックアップデートするため、example.jp ゾーンに対するDNSコンテンツサーバーへの更新権限があるものとする。
  • ある程度制限できるとは言え、DNSダイナミックアップデートは「ゾーン」に対してフリーダムに更新できてしまうので、_acme-challenge.www.example.jp ゾーン(に分けて/委任してもらって)に、更新が閉じるよう制限するのが必要と思われる。
  • ここでは敢えて「example.jp」ゾーンから「_acme-challenge.www.example.jp」を自分自身(DNSコンテンツサーバー)へ委任するものとし、外部のDNSコンテンツサーバーへは向けないものとする。
  • ここまでお膳立てが整えられていれば、例えば、サービスゾーンのDNSコンテンツサーバーへの更新権限は得られなくても、自分のDNSコンテンツサーバーに委任してもらって、更新できるようにするのは難しくないと思う。

想定サーバー・ドメイン

  • DNSコンテンツサーバーは ns.example.jp とする。
    • 実際には複数のDNSコンテンツサーバーで運用されていると思う。
    • それらサーバーへの反映は ns.example.jp の notify yes; およびIXFR(Incremental Zone Transfer)により、全てのサーバーへ即時通達されるものとする。
    • それら詳細についてはここでは取り上げない。
  • SSLサーバーは www.example.jp とする。
  • 上記サーバーは同一でもかまわないし、別々でもかまわない。
  • OSは FreeBSD 11.0-R での想定で行っているが、設定ファイルの位置以外は他のOSでも有効である。
  • インストールされるパッケージ如何によっては細かい振る舞いが変わるが、詳細は取り扱わない。
  • あくまでも FreeBSD 11.0-R 環境における検証結果とする。

DNSコンテンツサーバー側

SSLサーバー側

  • DNSダイナミックアップデートクライアントは BIND 9.11.1(ports/dns/bind-tools)。

    • 既に BIND 9.11.1 (ports/dns/bind911)がインストールされている環境では不要。

    • FreeBSD 9.x 等といった古い環境では nsupdate コマンドが存在したため、そのような環境でもインストールは不要である。
  • ACMEクライアントは dehydrated 0.4.0(ports/security/dehydrated)。

インストール

  • いずれも ports/security/dehydrated、ports/dns/bind911 または ports/dns/bind-utils よりインストールする。
  • オプションの選択によって手順が変わる点は無いため、ここでは明示しない。

DNSコンテンツサーバーの設定

named.conf の設定例

include "ダイナミックアップデートキーファイル名";

zone "example.jp" {
    type master;
    file "example.jpゾーンファイル名";
};

zone "_acme-challenge.www.example.jp" {
    type master;
    file "_acme-challenge.www.example.jpゾーンファイル名";
    update-policy {
        grant ダイナミックアップデートキー名 name _acme-challenge.www.example.jp. TXT;
    };
};
  • 「DNSコンテンツサーバー」と「SSLサーバー」とで、TSIG(Transaction SIGnature)キーを共有する。
  • TSIGキーはキー名と秘密鍵で構成された、named.conf の書式に準拠したテキストファイルである。
  • このTSIGキーを「ダイナミックアップデートキーファイル名」で保存しておく(所有者は root:wheel、パーミッションは 0400 で)。
  • また、ダイナミックアップデートキーファイル名で定義されているキー名に対して、更新許可設定を与える(update-policy および grant)。
  • また変更できるレコード名およびリソースレコードを限定する(name _acme-challenge.www.example.jp. TXT)。

example.jp ゾーンファイルの設定例

$TTL               300

@                       IN SOA ns.example.jp. domain.example.jp. (
                               2017032201 ; serial
                               7200       ; refresh (2 hours)
                               900        ; retry (15 minutes)
                               2419200    ; expire (4 weeks)
                               86400      ; minimum (1 day)
                               )
                        IN NS ns
_acme-challenge.www     IN NS ns
  • 本ファイルの設置場所、命名規則はそれぞれのポリシーに従う。
  • 少なくともFreeBSD的には、/usr/local/etc/namedb/master/ ディレクトリ以下に設置されるものとしている。
  • さらに「example.jp.db」とするか「jp.example.db」とするかなどは、特に明言しない。

_acme-challenge.www.example.jp ゾーンファイルの設定例

$TTL               300

@                       IN SOA ns.example.jp. domain.example.jp. (
                               2017032201 ; serial
                               7200       ; refresh (2 hours)
                               900        ; retry (15 minutes)
                               2419200    ; expire (4 weeks)
                               86400      ; minimum (1 day)
                               )
                        IN NS ns
  • 本ファイルの設置場所、命名規則はそれぞれのポリシーに従う。
  • 少なくともFreeBSD的には、/usr/local/etc/namedb/master/ ディレクトリ以下に設置されるものとしている。
  • さらに「_acme-challenge.www.example.jp.db」とするか「jp.example.www._acme-challenge.db」とするかなどは、特に明言しない。

ダイナミックアップデートキーファイルの設定例

key "キー名" {
    algorithm hmac-sha256;
    secret "PfzeGvXiOqtPOwQJY/iNFrvlD3/eKAHRZ0TbyK5GYII=";
};

上記ファイルは以下のコマンドにより生成することができる。

tsig-keygen -a hmac-sha256 キー名 > ダイナミックアップデートキーファイル名
chmod 0400 ダイナミックアップデートキーファイル名
  • もちろん secret の部分は毎回ランダムに発行される。
  • このファイルは named.conf でも、(後で説明する)nsupdate コマンド(-k オプションで)でもそのまま解釈してくれる。
  • 本ファイルの設置場所、命名規則については一概に言えることが無く、「ポリシーで」で逃げるには無責任すぎるので、例を出してみる。

本例における具体的設定例

  • BIND側に設置する場合は、/usr/local/etc/namedb/ ディレクトリに設置することとする。
  • dehydrated側に設置する場合は、/usr/local/etc/dehydrated/ ディレクトリに設置することとする。
  • ファイル名についてだが、「キー名.key」とするのが違和感なくていいと思う。
  • 肝心のキー名だが、BIND9.11のマニュアル(TSIG)によれば「ホスト名1-ホスト名2.」という例がある。

  • 本気かどうかわからないが、「DNSコンテンツサーバー-ダイナミックアップデートするサーバー.」というニュアンスらしい。
  • 本件の場合、ns.example.jp と www.example.jp であることから「ns-www.」とするのが妥当か(ほんと?)。
  • まぁなんでもいいけど、わかりやすいようにね。

key "ns-www." {
    algorithm hmac-sha256;
    secret "PfzeGvXiOqtPOwQJY/iNFrvlD3/eKAHRZ0TbyK5GYII=";
};
  • /usr/local/etc/namedb/ns-www.key
  • /usr/local/etc/dehydrated/ns-www.key

参考文献

certificate/レッツエンクリプトでSSL証明書の新規取得と自動更新(dns-01編) (最終更新日時 2019-12-14 23:31:51 更新者 NorikatsuShigemura)