Shammer's Philosophy

My private adversaria

X509証明書項目-基本制約(basicConstraints)

説明(書籍から一部引用)

BasicConstraints拡張領域でCA証明書の識別ができます。この拡張領域はCAフィールドとPathLenConstraintフィールドを保持しています。基本制約CAフィールドが真にセットされた証明書で証明されている公開鍵を持つエンティティは、証明書に署名することが許可されます。
CAフィールドが真にセットされると、証明書パスでもこの証明書のあとに続いてもよいCA証明書の最大数を示すPathLenConstraintフィールドも設定されます。経路の長さが0に設定されると、対象CAはエンドエンティティ証明書しか発行できなくなります。他のCAに証明書を発行できなくなるということになります。
X.509はこの拡張領域にcriticalの印をつけることを推奨しています。そうしないと証明書を発行する権限がエンドエンティティに与えられてしまうかもしれません。CAフィールドが偽にセットされると、証明書にある公開鍵は、他の証明書の署名を検証するのに使用できません。CAフィールドが真にセットされ、パスの長さが指定されたら、証明書ユーザーはパスの長さの値に従って証明書パスを検証しなければなりません。
この拡張領域がない、あるいはnon-criticalの印がついている場合、その証明書はエンドエンティティ証明書と見なされなければなりません。また、公開鍵は他の証明書の署名を検証するのに使用することはできません。
CA証明書では、この拡張領域にcriticalの印をつけなければなりません。

OpenSSLの設定例

設定ファイルをgrepすると以下のようになっている。

# grep -i basicConstraints openssl.cnf 
basicConstraints=CA:FALSE
basicConstraints = CA:FALSE
#basicConstraints = critical,CA:true
basicConstraints = CA:true
# basicConstraints= critical, DER:30:03:01:01:FF
basicConstraints=CA:FALSE
# 

個人的見解

CAの証明書を作成するときは、basicConstraintsをCA:trueでcriticalにする、これはもう知っていた。手元の環境のopenssl.cnfではPathLengthは未定義だが、サイトを探すと以下のような感じで定義している。

basicConstraints=critical,CA:true,pathlen:1

この設定だと、サーバー証明書までの中に一つ中間CAの署名があっても問題ないってことだ。証明書チェーンの中でpathlenが0のCA証明書の次はサーバー証明書じゃないといけない。この設定は知っておいた方がよさそうだ。