証明書の概要

この記事では、ユニバーサル Windows プラットフォーム (UWP) アプリでの証明書の使用について説明します。 デジタル証明書は、公開キーを個人、コンピューター、組織にバインドするために、公開キーの暗号化で使われます。 バインドされた識別情報は、あるエンティティを別のエンティティに対して認証する際に最も頻繁に使われます。 たとえば、証明書は、Web サーバーをユーザーに対して、また、ユーザーを Web サーバーに対して認証するためによく使われます。 証明書要求を作成し、発行された証明書をインストールまたはインポートすることができます。 また、証明書階層で証明書を登録することもできます。

共有証明書ストア

UWP アプリは、Windows 8 で導入された新しい分離アプリケーション モデルを使います。 この分離モデルでは、アプリ コンテナーと呼ばれる低レベルのオペレーティング システム構造内で実行し、明示的に許可されない限り、アプリの外にあるリソースやファイルにアクセスすることは禁止されます。 次のセクションでは、これが公開キー基盤 (PKI) に与える影響について説明します。

アプリ コンテナーごとの証明書ストレージ

特定のアプリ コンテナー内での使用を目的とした証明書は、ユーザーごと、アプリ コンテナーの場所ごとに格納されます。 アプリ コンテナー内で実行されるアプリは、そのアプリが持つ証明書ストレージにだけ書き込みアクセスが許可されます。 アプリが自分のストアのどこかに証明書を追加した場合には、その証明書は他のアプリから読み取られることはありません。 アプリがアンインストールされると、そのアプリに固有の証明書もすべて削除されます。 アプリは、MY ストアや REQUEST ストア以外にローカル コンピューターの証明書ストアにも読み取りアクセスが許可されます。

キャッシュ

各アプリ コンテナーは分離されたキャッシュを持ち、その中に検証に必要な発行者証明書、証明書失効リスト (CRL)、オンライン証明書ステータス プロトコル (OCSP) の応答を格納できます。

共有証明書とキー

スマート カードがリーダーに入れられると、カードに含まれている証明書とキーが MY ストアに伝えられ、ユーザーが実行している完全信頼アプリで共有されます。 しかし、既定ではアプリ コンテナーはユーザーごとの MY ストアにはアクセスできません。

この問題に対応し、プリンシパル グループがリソース グループにアクセスできるように、アプリ コンテナー分離モデルは使う機能の概念をサポートしています。 使う機能を指定すると、アプリ コンテナーのプロセスによる特定のリソースへのアクセスが許可されます。 sharedUserCertificates 機能は、MY ストアとスマート カードの信頼されたルート ストア内にある証明書とキーへの読み取りアクセス許可を、アプリ コンテナーに与えます。 この機能によってユーザーの REQUEST ストアへの読み取りアクセス許可が与えられることはありません。

次の例に示すようにマニフェスト内で sharedUserCertificates 機能を指定します。

<Capabilities>
    <Capability Name="sharedUserCertificates" />
</Capabilities>

証明書フィールド

X.509 公開キー証明書標準は、長い間に改定されてきました。 データ構造の継続的な各バージョンでは、次の図に示すように、以前のバージョンで存在していたフィールドを維持し、さらにフィールドを追加してきました。

x.509 証明書バージョン 1、2、3

これらのフィールドと拡張機能の一部は、CertificateRequestProperties クラスを使って証明書要求を作成するときに直接指定できます。 ほとんどはできません。 それらのフィールドは、発行元の機関によって入力される場合や、空欄のままにしておける場合があります。 フィールドについて詳しくは、次のセクションをご覧ください。

バージョン 1 のフィールド

フィールド 説明
バージョン エンコードされた証明書のバージョン番号を指定します。 現在、このフィールドに指定可能な値は、0、1、または 2 です。
シリアル番号 証明機関 (CA) によって証明書に割り当てられる、正の一意な整数を格納します。
署名アルゴリズム 証明書への署名に CA が使うアルゴリズムを指定するオブジェクト識別子 (OID) を格納します。 たとえば、1.2.840.113549.1.1.5 は、SHA-1 ハッシュ アルゴリズムと、RSA Laboratories による RSA 暗号化アルゴリズムの組み合わせを示します。
発行者 証明書を作成し署名した CA の X.500 識別名 (DN) を格納します。
有効期限までの日数 証明書が有効である時間間隔を指定します。 2049 年末までの日付には、協定世界時 (グリニッジ標準時) 形式 (yymmddhhmmssz) を使います。 2050 年 1 月 1 日以降の日付には、一般化された時刻形式 (yyyymmddhhmmssz) を使います。
サブジェクト 証明書に含まれる公開キーに関連付けられているエンティティの X.500 識別名を格納します。
公開キー 公開キーと関連するアルゴリズム情報を格納します。

バージョン 2 のフィールド

X.509 バージョン 2 の証明書には、バージョン 1 で定義された基本フィールドが含まれており、さらに次のフィールドが追加されています。

フィールド 説明
発行者の一意な ID 時間を経て別のエンティティによって再利用されたときに、CA の X.500 名を明白にするために使うことができる一意な値を格納します。
サブジェクトの一意な ID 時間を経て別のエンティティによって再利用されたときに、証明書のサブジェクトの X.500 名を明白にするために使うことができる一意な値を格納します。

バージョン 3 の拡張機能

X.509 バージョン 3 の証明書には、バージョン 1 とバージョン 2 で定義されたフィールドが含まれており、さらに証明書の拡張機能が追加されています。

フィールド 説明
機関キー識別子 証明書への署名に使われる証明機関 (CA) 秘密キーに対応する CA 公開キーを識別します。
基本制限 エンティティを CA として利用できるかどうか、またできる場合は、証明書チェーンにおいてその下位に存在できる下位 CA の数を指定します。
証明書ポリシー 証明書が発行されたポリシーと、許可されている使用目的を指定します。
CRL 配布ポイント 基本の証明書失効リスト (CRL) の URI を格納します。
拡張キー使用法 証明書に含まれる公開キーを使うことができる方法を指定します。
発行者の別名 証明書要求の発行者に対する 1 つ以上の別名形式を指定します。
キー使用法 証明書に含まれる公開キーによって実行可能な操作に関する制限を指定します。
名前の制限 証明書階層内のすべてのサブジェクト名が存在している必要がある名前空間を指定します。 この拡張機能は CA 証明書でのみ使われます。
ポリシーの制限 ポリシー マッピングを禁止するか、階層内の各証明書に許容可能なポリシー識別子を含めることを要求することによって、パス検証を制限します。 この拡張機能は CA 証明書でのみ使われます。
ポリシー マッピング 発行元の CA のポリシーに対応する、下位 CA のポリシーを指定します。
秘密キーの使用期間 秘密キーが関連付けられている証明書の有効期間と異なる場合に、秘密キーに別の有効期間を指定します。
サブジェクト代替名 証明書要求のサブジェクトに対する 1 つ以上の別名形式を指定します。 別名形式の例として、メール アドレス、DNS 名、IP アドレス、URI などがあります。
Subject Directory Attributes (サブジェクト ディレクトリ属性) 証明書サブジェクトの国籍など、識別属性を指定します。 この拡張機能の値は、OID と値のペアが連続する形になります。
サブジェクト キー識別子 証明書サブジェクトが保持する複数の公開キーを区別します。 この拡張機能の値は、通常は、キーの SHA-1 ハッシュです。