Yumei
Yumeiは、FreeGatewayのACME証明書管理デーモンです。HTTPSやIMAPSのサーバーを含め、X.509(TLS)証明書を使うあらゆるデーモンの証明書の取得と更新を自動的に行います。単一のサーバーでも、地理的に分散した複数のサーバーのクラスターでも動作します。YumeiはFreeBSD向けにC++で書かれており、お客様自身のハードウェア上で動作します。
すべてのデーモンに使える1つの更新ツール
Yumeiは、HTTPSに限らず、X.509証明書を使用するあらゆるデーモンに対応します。設定ファイルには、デーモンごとに、更新された証明書をどこに置くか、デーモンをどのように再起動またはリロードするかを記述するため、更新に手作業は不要です。FreeGateway自身のプロジェクトもYumeiを利用しています。Kojo、DTS、Kaigiは、いずれも証明書を最新の状態に保つためにYumeiを使っています。
Yumeiは単独でも問題なく動作します。設定オプションでスタンドアロンモードにできるため、サーバーが1台だけの環境でも利用できます。
課題:GeoDNS環境での証明書更新
Yumeiの特長は、地理的に分散した複数のサーバーのクラスターで提供されるホスト名の証明書を更新できることです。通常のACMEクライアントにはこれができません。
グローバルに分散したサービス(Webサイトやメールサーバーなど)では、多数のサーバーが、たとえばwww.example.comのような同じホスト名に応答し、GeoDNSが各ユーザーを最寄りのサーバーへ振り分けることがよくあります。このため、通常の証明書更新はうまくいきません。
サーバーがLet’s Encryptなどの認証局(CA)にそのホスト名の証明書を要求すると、CAはその要求が正当なものであることを確認する必要があります。そのためにCAはチャレンジを発行します。要求したサーバーは、そのホスト名の既知のURLに固有のトークンを置かなければなりません。CAはそのホスト名をDNSで調べ、返されたサーバーのIPアドレスに接続して、トークンの有無を確認します。GeoDNSでは、CAが受け取るIPアドレスはCAのいる場所によって変わるため、接続はCAに最も近いサーバーに届きます。それは要求を出したサーバーとは限りません。東京のサーバーが要求した更新が、トークンを一度も見ていないトロントのサーバーに対して検証され、チャレンジが失敗することがあります。
さらに、CAの確認は1回の接続とは限りません。CAは異なる場所から複数回接続することがあり、GeoDNSはそれぞれの接続を別のサーバーに振り分けることがあります。最初の接続がたまたま正しいサーバーに届いたとしても、他の接続は届かないかもしれません。そのため、CAが到達しうるすべてのサーバーがチャレンジに応答できなければなりません。
解決策:クラスター全体で一緒に更新する
Yumeiはクラスター内のすべてのサーバーで動作します。1台のサーバーを「ソース」に指定して更新を開始させ、トランザクションの状態やチャレンジのトークンなど、その取引に関するすべての情報を、他のすべてのサーバー(レプリカ)と共有します。CAがどのサーバーに到達しても、そのサーバーがチャレンジに応答できるため、CAからは単一のIPアドレスにある1台のサーバーとして見えます。証明書が発行されると、Yumeiは証明書とその秘密鍵をクラスター内のすべてのサーバーに配布します。
サーバー同士は、Sodium暗号ライブラリと事前共有の公開鍵を基盤とする、Yumei独自のピアツーピアチャネルで通信します。このチャネルはTLSから独立しているため、証明書の更新が、更新しようとしている証明書に依存することはありません。
ソースサーバーに障害が発生した場合は、管理者が任意のレプリカを新しいソースに指定できます。自動フェイルオーバーは今後のリリースで提供する予定です。
設計上、HTTP-01のみ
YumeiはACMEのHTTP-01チャレンジのみを使用します。このチャレンジは、RFC 8615で定義されている/.well-known/というURIパスから提供されます。これは意図的な設計です。DNSは、特にGeoDNSが関わる場合、分散システムの中で最も信頼性の低い部分になりがちです。そのためYumeiは、ホスト名を管理していることを証明するために、DNSレコードやDNSベースのチャレンジに依存しません。
名前の由来
Yumei(有名)は「有名な」「よく知られた」を意味する日本語で、ACMEが使う/.well-known/パスにちなんだ名前です。