Skip to content

Instantly share code, notes, and snippets.

@kazuho

kazuho/answer.md Secret

Last active April 30, 2021 16:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kazuho/48aa2167a3ca16451a7e13529b75fe81 to your computer and use it in GitHub Desktop.
Save kazuho/48aa2167a3ca16451a7e13529b75fe81 to your computer and use it in GitHub Desktop.

まず、クロスサインとは、ある認証局が、別の認証局の発行する証明書に署名する行為を指します。相互にお互いのルート証明書を署名しているとは限りませんし、今回の let’s encrypt の用法 (cf. https://letsencrypt.org/2020/12/21/extending-android-compatibility.html) とも異なります。よって選択肢2は誤り。

次に、X.509において、ルート証明書とは自己署名証明書を指します。なので、「クロスサインされたルート証明書」というものは厳密には存在しません。

では、「ルート証明書がクロスサインされている」という表現が何を意味するかというと、同一の識別子をもつ、自己署名証明書と、他のCAによって署名された中間証明書の2種類が存在する(注1)、ということを意味します。よって、選択肢3が正解。

選択肢1について言うと、CA属性は、他の証明書を署名できる証明書(つまりルートあるいは中間証明書)であるか否かを表す真偽値であって、ルート証明書であるかどうかを表すものではありません。「他の認証局によって署名されたCA属性をもつ証明書(つまり中間証明書)が存在する」とのは誤りではないですが、自己署名されたものと中間証明書の両者が存在するという点を説明している選択肢3のほうが、より「適切」。

注1: X.509証明書の検証手法について

X.509スタックは、通信相手から受け取ったエンド証明書と、通信相手から受け取った中間証明書と手元にある中間証明書をさまざまな順序で組み合わせて、エンド証明書から手元にあるルート証明書のいずれかにまでたどりつくような証明書のチェインが作れるかどうか、検証します。不要な証明書は無視されます。

今回の Let's Encrypt のケースについていうと、"ISRG Root X1"という識別子をもつルート証明書と中間証明書の二種類が存在し、2021年以降は、TLSサーバは後者の中間証明書を送信するようになります(設定を変えない限り)。

クライアントにISRG Root X1という識別子をもつルート証明書がインストール済である場合、同一名称の中間証明書は(受信したとしても)それを無視してルート証明書までのチェインを構築することができます。したがって認証が成功します。

クライアントにISRG Root X1という識別子をもつルート証明書がインストールされていない場合、クライアントはサーバから受信した同一名称の中間証明書を介して、DST Root CA X3という旧来のルート証明書までのチェインを構築することができます。したがって認証が成功します。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment