Shammer's Philosophy

My private adversaria

X509証明書項目-鍵用途(KeyUsage)

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

KeyUsage拡張領域は公開鍵を使用する目的を定義します。
この拡張領域にはクリティカルの印をつけることを推奨します。
この拡張領域にクリティカルのフラグがついている場合、鍵はその指定された目的のみ使用されなければなりません。クリティカルのフラグがついている場合、CAはその鍵がその目的のためにのみ証明していることを示しています。これはある鍵が他の目的に使用されて信頼性が問題になった場合、重要な概念になります。
拡張領域に非クリティカルのフラグがついている場合、その拡張領域は勧告フィールドのステータスとなります。その鍵は証明書ユーザーの裁量で他の目的に使用することができます。ユーザーが複数の証明書と鍵ペアをもっていて、そこから正しい証明書と鍵ペアを選択することがその設定の第一目的である場合にも、このフィールドは非クリティカルに設定できます。
以下のような設定が可能です。

KeyCertSign

鍵は証明書にある署名の検証に使用されます。この設定はCA証明書でのみ有効です。

CRLSign

鍵は証明書失効リストにあるCA署名の検証に使用されます。

NonRepudiation

鍵は否認防止サービスを提供する際に使用されます。この鍵は、エンドエンティティの署名の検証と署名が行われた後でその署名が使用されたということが否認されないように、何らかの形式で公証サービスを提供するサードパーティによって使用されることがあります。

DigitalSignature

この設定は前述の署名鍵タイプ以外のデジタル署名を行うために使用される鍵であることを示します。

KeyEncipherment

この鍵は他の鍵やセキュリティ情報を暗号化するのに使用されます。これは鍵の安全な送信のために使用されることがあります。これが指定された場合は、この鍵の使用が制約され、その暗号化の鍵がEncipherOnlyまたはDecipherOnlyにのみ使用可能となることがあります。

DataEncipherment

この鍵はユーザーデータの暗号化に使用されます。この鍵タイプは鍵その他のセキュリティデータ(の暗号化)をカバーしていません。セキュリティデータの暗号化にはKeyEncipherment鍵を使用しなければなりません。

KeyAgreement

この鍵は、さらに操作を先に進めるために使用されるべき鍵の確立あるいは取り決めの過程で使用されます。Diffie-Hellmanアルゴリズムは鍵の取り決めプロトコルのひとつの例です。

OpenSSLの設定例

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

# grep keyUsage openssl.cnf 
# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# keyUsage = cRLSign, keyCertSign
# This is typical in keyUsage for a client certificate.
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
#

個人的見解

この内容が一番重要なような。。。CAの証明書とサーバー証明書では証明書の使用用途が異なる。証明書を作成しても、この設定を間違えて作成すると期待している作業を実施することはできないと思われる。この内容は今後もしっかり確認して、必要とされるKeyUsageは何か、作成する証明書にKeyUsage不足はないか等をしっかり確認しないといけない。