Win32 API 日本語リファレンス
ホームSecurity.Cryptography › CERT_CHAIN_POLICY_STATUS

CERT_CHAIN_POLICY_STATUS

構造体
サイズx64: 24 バイト / x86: 20 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
cbSizeDWORD4+0+0この構造体のサイズ (バイト単位)。
dwErrorDWORD4+4+4

検証処理中にエラーまたは無効な状態が発生したことを示す値。このメンバーの値は、CertVerifyCertificateChainPolicy 関数の pszPolicyOID パラメーターの値で指定されるポリシーの種類ごとに固有です。

基本ポリシーのエラー (CERT_CHAIN_POLICY_BASE)

意味
TRUST_E_CERT_SIGNATURE
0x80096004L
証明書の署名を検証できません。
CRYPT_E_REVOKED
0x80092010L
証明書または署名が失効しています。
CERT_E_UNTRUSTEDROOT
0x800B0109L
証明書チェーンは正しく処理されましたが、信頼プロバイダーによって信頼されていないルート証明書で終端しています。
CERT_E_UNTRUSTEDTESTROOT
0x800B010DL
ルート証明書はテスト用証明書ですが、ポリシー設定によりテスト証明書は許可されていません。
CERT_E_CHAINING
0x800B010AL
証明書のチェーンが正しく作成されませんでした。
CERT_E_WRONG_USAGE
0x800B0110L
この証明書は、要求された用途に対して有効ではありません。
CERT_E_EXPIRED
0x800B0101L
必要な証明書が有効期間内にありません。
CERT_E_INVALID_NAME
0x800B0114L
証明書の名前が無効です。名前が許可リストに含まれていないか、明示的に除外されています。
CERT_E_INVALID_POLICY
0x800B0113L
証明書のポリシーが無効です。
TRUST_E_BASIC_CONSTRAINTS
0x80096019L
証明書の基本制約が無効であるか、存在しません。
CERT_E_CRITICAL
0x800B0105L
この証明書は、その CA が指定した目的以外の目的で使用されています。
CERT_E_VALIDITYPERIODNESTING
0x800B0102L
証明書チェーンの有効期間が正しく入れ子になっていません。
CRYPT_E_NO_REVOCATION_CHECK
0x80092012L
失効確認機能が、この証明書の失効を確認できませんでした。
CRYPT_E_REVOCATION_OFFLINE
0x80092013L
失効サーバーがオフラインであったため、失効確認機能は失効を確認できませんでした。
 

基本制約ポリシーのエラー (CERT_CHAIN_POLICY_BASIC_CONSTRAINTS)。

意味
TRUST_E_BASIC_CONSTRAINTS
0x80096019L
証明書の基本制約が無効であるか、存在しません。
 

Authenticode ポリシーのエラー (CERT_CHAIN_POLICY_AUTHENTICODE および CERT_CHAIN_POLICY_AUTHENTICODE_TS)。

これらのエラーは、基本ポリシーのエラーに加えて返されます。

意味
CERT_E_PURPOSE
0x800B0106L
この証明書は、発行元 CA が指定した目的以外の目的で使用されています。
CERT_E_REVOKED
0x800B010CL
この証明書は、発行者によって明示的に失効されています。
CERT_E_REVOCATION_FAILURE
0x800B010EL
失効処理を続行できなかったため、証明書を確認できませんでした。
 

SSL ポリシーのエラー (CERT_CHAIN_POLICY_SSL)。

これらのエラーは、基本ポリシーのエラーに加えて返されます。

意味
CERT_E_UNTRUSTEDROOT
0x800B0109L
証明書チェーンは正しく処理されましたが、信頼プロバイダーによって信頼されていないルート証明書で終端しています。
CERT_E_CN_NO_MATCH
0x800B010FL
証明書の CN 名が、渡された値と一致しません。
CERT_E_PURPOSE
0x800B0106L
この証明書は、その CA が指定した目的以外の目的で使用されています。
CERT_E_ROLE
0x800B0103L
エンドエンティティとしてのみ使用できる証明書が CA として使用されているか、またはその逆です。
 

Microsoft ルートポリシーのエラー (CERT_CHAIN_POLICY_MICROSOFT_ROOT)。

意味
CERT_E_UNTRUSTEDROOT
0x800B0109L
証明書チェーンは正しく処理されましたが、信頼プロバイダーによって信頼されていないルート証明書で終端しています。
 

EV ポリシーのエラー。

意味
CERT_E_CHAINING
0x800B010AL
信頼されたルート機関までの証明書チェーンを構築できませんでした。
CERT_E_WRONG_USAGE
0x800B0110L
この証明書は、要求された用途に対して有効ではありません。
lChainIndexINT4+8+8エラーまたは無効な状態が見つかったチェーンを示すインデックス。詳細については、「解説」を参照してください。
lElementIndexINT4+12+12エラーまたは無効な状態が見つかったチェーン内の要素を示すインデックス。詳細については、「解説」を参照してください。
pvExtraPolicyStatusvoid*8/4+16+16構造体へのポインター。構造体の型は、CertVerifyCertificateChainPolicy 関数の pszPolicyOID パラメーターの値によって決まります。dwError のエラーに加えて、ポリシー OID 固有の追加の状態をここで返し、チェーンの状態に関する追加情報を提供することもできます。このポインターには、必要に応じて AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS 構造体を指すように設定できます。

公式ドキュメント

CERT_CHAIN_POLICY_STATUS 構造体は、証明書チェーンの検証時に CertVerifyCertificateChainPolicy 関数から返される、証明書チェーンの状態情報を保持します。

解説(Remarks)

lChainIndexlElementIndex の両方が –1 に設定されている場合、エラーまたは無効な状態はチェーンコンテキスト全体に適用されます。lElementIndex のみが –1 に設定されている場合、エラーまたは無効な状態は lChainIndex でインデックス指定されるチェーンに適用されます。それ以外の場合、エラーまたは無効な状態は pChainContext->rgpChain[lChainIndex]->rgpElement[lElementIndex] にある証明書要素に適用されます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// CERT_CHAIN_POLICY_STATUS  (x64 24 / x86 20 バイト)
typedef struct CERT_CHAIN_POLICY_STATUS {
    DWORD cbSize;
    DWORD dwError;
    INT lChainIndex;
    INT lElementIndex;
    void* pvExtraPolicyStatus;
} CERT_CHAIN_POLICY_STATUS;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct CERT_CHAIN_POLICY_STATUS
{
    public uint cbSize;
    public uint dwError;
    public int lChainIndex;
    public int lElementIndex;
    public IntPtr pvExtraPolicyStatus;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure CERT_CHAIN_POLICY_STATUS
    Public cbSize As UInteger
    Public dwError As UInteger
    Public lChainIndex As Integer
    Public lElementIndex As Integer
    Public pvExtraPolicyStatus As IntPtr
End Structure
import ctypes
from ctypes import wintypes

class CERT_CHAIN_POLICY_STATUS(ctypes.Structure):
    _fields_ = [
        ("cbSize", wintypes.DWORD),
        ("dwError", wintypes.DWORD),
        ("lChainIndex", ctypes.c_int),
        ("lElementIndex", ctypes.c_int),
        ("pvExtraPolicyStatus", ctypes.c_void_p),
    ]
#[repr(C)]
pub struct CERT_CHAIN_POLICY_STATUS {
    pub cbSize: u32,
    pub dwError: u32,
    pub lChainIndex: i32,
    pub lElementIndex: i32,
    pub pvExtraPolicyStatus: *mut core::ffi::c_void,
}
import "golang.org/x/sys/windows"

type CERT_CHAIN_POLICY_STATUS struct {
	cbSize uint32
	dwError uint32
	lChainIndex int32
	lElementIndex int32
	pvExtraPolicyStatus uintptr
}
type
  CERT_CHAIN_POLICY_STATUS = record
    cbSize: DWORD;
    dwError: DWORD;
    lChainIndex: Integer;
    lElementIndex: Integer;
    pvExtraPolicyStatus: Pointer;
  end;
const CERT_CHAIN_POLICY_STATUS = extern struct {
    cbSize: u32,
    dwError: u32,
    lChainIndex: i32,
    lElementIndex: i32,
    pvExtraPolicyStatus: ?*anyopaque,
};
type
  CERT_CHAIN_POLICY_STATUS {.bycopy.} = object
    cbSize: uint32
    dwError: uint32
    lChainIndex: int32
    lElementIndex: int32
    pvExtraPolicyStatus: pointer
struct CERT_CHAIN_POLICY_STATUS
{
    uint cbSize;
    uint dwError;
    int lChainIndex;
    int lElementIndex;
    void* pvExtraPolicyStatus;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; CERT_CHAIN_POLICY_STATUS サイズ: 20 バイト(x86)
dim st, 5    ; 4byte整数×5(構造体サイズ 20 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwError : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; lChainIndex : INT (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; lElementIndex : INT (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; pvExtraPolicyStatus : void* (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; CERT_CHAIN_POLICY_STATUS サイズ: 24 バイト(x64)
dim st, 6    ; 4byte整数×6(構造体サイズ 24 / 4 切り上げ)
; cbSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwError : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; lChainIndex : INT (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; lElementIndex : INT (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; pvExtraPolicyStatus : void* (+16, 8byte)  qpoke st,16,値 / qpeek(st,16)  ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global CERT_CHAIN_POLICY_STATUS
    #field int cbSize
    #field int dwError
    #field int lChainIndex
    #field int lElementIndex
    #field intptr pvExtraPolicyStatus
#endstruct

stdim st, CERT_CHAIN_POLICY_STATUS        ; NSTRUCT 変数を確保
st->cbSize = 100
mes "cbSize=" + st->cbSize