動作の仕組み

最終更新日:

Let’s Encrypt と ACME プロトコルの目標は、HTTPS サーバーのセットアップと、ブラウザが信頼する証明書の自動的な取得を、人間の仲介なしに可能にすることです。この目標は、ウェブサーバー上で証明書管理エージェントを実行することで実現されます。

このプロセスには2つのステップがあります。1つ目は、CA に対して、ウェブサーバーがドメインをコントロールしていることを証明するプロセスです。2つ目は、そのドメインに対して、エージェントが証明書のリクエスト・更新・無効化を行うプロセスです。

ドメインの検証

Let’s Encrypt はサーバーの管理者を公開鍵で特定します。エージェントソフトウェアが Let’s Encrypt と初めて通信するとき、新しいキーペアを生成し、Let’s Encrypt CA に対して、1つ以上のドメインがコントロールしていることを証明します。これは、アカウントを作成し、そのアカウントにドメインを追加する、という伝統的な CA プロセスと同様です。

このプロセスを始めるために、エージェントは Let’s Encrypt CA に対して、自分が example.com をコントロールしていることを証明するためには何をすればいいか、と質問します。Let’s Encrypt CA はリクエストされたドメイン名を見て、1つ以上のチャレンジのセットを答えます。エージェントがドメインをコントロールしていることを証明する方法は複数あるためです。たとえば、CA はエージェントに対して、以下のような選択肢を与えます。

チャレンジの間に、Let’s Encrypt CA はエージェントに対してノンスを与えます。エージェントは秘密鍵を使ってこのノンスに署名する必要があります。これにより、エージェントがキーペアをコントロールしていることも証明します。

example.com を検証するためのチャレンジのリクエスト

エージェント・ソフトウェアは、提示されたチャレンジのうちの1つをクリアします。今、上の例で提示された2つ目のチャレンジをエージェントがクリアできるとしましょう。このとき、エージェントは http://example.com のサイト上の特定のパスにファイルを1つ生成します。また、エージェントは提示されたノンスに秘密鍵を使って署名します。エージェントがこれらのステップをクリアしたら、CA に検証の準備ができたことを伝えます。

すると、CA は、チャレンジが正しく行われたかをチェックします。CA はノンスの署名が正しいことを検証し、ウェブサーバーからファイルをダウンロードし、その中に期待どおりのコンテンツが含まれているかどうかを確認します。

example.com の代表として振る舞うための認証リクエスト

もし、ノンスに書かれた署名が有効であり、チャレンジがクリアされたならば、公開鍵を持つエージェントは example.com に対する証明書の管理を行うことを認証されたことになります。私たちは、このエージェントが使用するキーペアのことを、example.com に対して「認証されたキーペア」と呼びます。

証明書の発行と無効化

一度エージェントが認証されたキーペアを取得したら、証明書のリクエスト・更新・無効化は簡単です。証明書管理メッセージを生成し、認証されたキーペアで署名して送信すればいいだけです。

ドメインの証明書を取得するには、エージェントは Let’s Encrypt CA に対して、example.com の証明書を発行する依頼と公開鍵を含めた、PKCS#10 証明書署名リクエスト (Certificate Signing Request) を作ります。通常、CSR の中には、CSR に同梱された公開鍵に対応する秘密鍵による署名が含まれています。さらに、エージェントは CSR 全体を example.com に対して認証されたキーで署名します。これにより、Let’s Encrypt CA は CSR が認証されていることを確認できます。

Let’s Encrypt CA がこのリクエストを受け取ると、両方の署名を検証します。すべてが問題なければ、example.com の証明書を発行し、CSR に同梱されていた公開鍵で暗号化してエージェントへ送り返します。

example.com に対する証明書のリクエスト

無効化の作業も同じ方法で行われます。エージェントは無効化リクエストを作り、example.com に対して認証されたキーペアで署名をして送ります。Let’s Encrypt CA はリクエストが認証されているかどうかを検証します。もし認証されていれば、証明書の無効化の情報を一般の無効化チャンネル (たとえば、OCSP) に公開します。その結果、このチャンネルを使用しているブラウザなどは、無効化された証明書を受け入れてはいけないことを知ることができます。

example.com に対する証明書の無効化リクエスト