PFXImportCertStore 関数 (wincrypt.h)

PFXImportCertStore 関数は、PFX BLOB をインポートし、証明書と関連付けられている秘密キーを含むストアのハンドルを返します。

構文

HCERTSTORE PFXImportCertStore(
  [in] CRYPT_DATA_BLOB *pPFX,
  [in] LPCWSTR         szPassword,
  [in] DWORD           dwFlags
);

パラメーター

[in] pPFX

エクスポートされた暗号化された証明書とキーを含む PFX パケットを含む CRYPT_DATA_BLOB構造体への ポインター。

[in] szPassword

PFX パケットの暗号化解除と検証に使用される文字列パスワード。 長さが 0 より大きい文字列に設定されているか、空の文字列または NULL に設定されているかにかかわらず、この値はパケットの暗号化に使用された値とまったく同じである必要があります。

Windows 8とWindows Server 2012以降、PFX パケットが PKCS12_PROTECT_TO_DOMAIN_SIDS フラグを使用して PFXExportCertStoreEx 関数に作成された場合、PFXImportCertStore 関数は、暗号化に使用された Active Directory (AD) プリンシパルを使用してパスワードの暗号化解除を試みます。 AD プリンシパルは pvPara パラメーターで指定されます。 PFXExportCertStoreEx 関数の szPassword パラメーターが空の文字列または NULL、dwFlags パラメーターが PKCS12_PROTECT_TO_DOMAIN_SIDS に設定されている場合、その関数はパスワードをランダムに生成し、pvPara パラメーターで指定された AD プリンシパルに暗号化しました。 その場合は、PFX パケットの作成時に使用された値 (空の文字列または NULL) にパスワードを設定する必要があります。 PFXImportCertStore 関数は、AD プリンシパルを使用してランダムなパスワードの暗号化を解除し、ランダムに生成されたパスワードを使用して PFX 証明書の暗号化を解除します。

パスワードの使用が完了したら、 SecureZeroMemory 関数を呼び出してメモリから消去します。 パスワードの保護の詳細については、「パスワードの 処理」を参照してください。

[in] dwFlags

dwFlags パラメーターには、次のいずれかの値を指定できます。

意味
CRYPT_EXPORTABLE
0x00000001
インポートされたキーはエクスポート可能とマークされます。 このフラグを使用しない場合、キー ハンドルを使用して CryptExportKey 関数を呼び出すと失敗します。
CRYPT_USER_PROTECTED
0x00000002
ユーザーは、このキーを使用する特定の試行が行われたときに、ダイアログ ボックスまたはその他の方法で通知されます。 正確な動作は、使用されている 暗号化サービス プロバイダー (CSP) によって指定されます。

インターネット エクスプローラー 4.0 より前のバージョンでは、Microsoft 暗号化サービス プロバイダーはこのフラグを無視しました。 Internet エクスプローラー 4.0 以降、Microsoft プロバイダーはこのフラグをサポートしています。

プロバイダー コンテキストが CRYPT_SILENT フラグを設定して開かれた場合、このフラグを使用するとエラーが発生し、最後のエラーが NTE_SILENT_CONTEXT に設定されます。

CRYPT_MACHINE_KEYSET
0x00000020
秘密キーは、現在のユーザーの下ではなく、ローカル コンピューターの下に格納されます。
CRYPT_USER_KEYSET
0x00001000
秘密キーは、PFX BLOB でローカル コンピューターに移動する必要があると指定されている場合でも、ローカル コンピューターの下ではなく、現在のユーザーの下に格納されます。
PKCS12_PREFER_CNG_KSP
0x00000100
CNG キー ストレージ プロバイダー (KSP) が優先されることを示します。 CSP が PFX ファイルで指定されている場合は、CSP が使用されます。それ以外の場合は KSP が推奨されます。 CNG KSP を使用できない場合、 PFXImportCertStore 関数は失敗します。

Windows Server 2003 および Windows XP: この値はサポートされていません。

PKCS12_ALWAYS_CNG_KSP
0x00000200
CNG KSP が常に使用されることを示します。 指定すると、 PFXImportCertStore は、PFX ファイル内のプロバイダー情報に関係なく、CNG KSP の使用を試みます。 CNG KSP が使用できない場合、インポートは失敗しません。

Windows Server 2003 および Windows XP: この値はサポートされていません。

PKCS12_ALLOW_OVERWRITE_KEY
0x00004000
既存のキーの上書きを許可します。 このフラグは、既に存在するキー名を含む PFX ファイルをインポートする必要があるシナリオが発生した場合に指定します。 たとえば、PFX ファイルをインポートするときに、キー コンテナーに一意の名前空間がないため、同じ名前のコンテナーが既に存在している可能性があります。 コンピューターに "TestKey" を作成し、キー コンテナーとして "TestKey" も含む PFX ファイルをインポートすると、 PKCS12_ALLOW_OVERWRITE_KEY 設定によってキーが上書きされます。

Windows Server 2003 および Windows XP: この値はサポートされていません。

PKCS12_NO_PERSIST_KEY
0x00008000
キーを保持しないでください。 キーを保持しない場合は、このフラグを指定します。 たとえば、検証後にキーを格納する必要がない場合は、コンテナーを作成してから削除する代わりに、このフラグを指定してキーをすぐに破棄できます。
メモPKCS12_NO_PERSIST_KEY フラグが *not* に設定されている場合、キーはディスク上に保持されます。 使用を超えてキーを保持しない場合は、dwFlags パラメーターに CRYPT_DELETEKEYSET フラグを設定して CryptAcquireContext 関数を呼び出して、キーを削除する必要があります。
メモ その他の考慮事項:
  • PKCS12_NO_PERSIST_KEYを使用する場合、プロパティ CERT_KEY_CONTEXT_PROP_IDは証明書に内部的に設定され、CERT_KEY_CONTEXT_PROP_IDにはNCRYPT_KEY_HANDLEが含まれます。

  • PKCS12_NO_PERSIST_KEYを使用しない場合は、CERT_KEY_PROV_INFO_PROP_ID プロパティが設定されます。

  • 非永続化キーを持つ証明書が別のプロセスにマーシャリングされた場合、CERT_KEY_CONTEXT_PROP_ID プロパティはマーシャリングされません。

  • NO_PERSISTを機能させるには、同 じプロセスにあり 、PCCERT_CONTEXTのユーザーがCERT_KEY_CONTEXT_PROP_IDをサポートしている必要があります。 これは通常、TLS ハンドシェイク中に適用されます。ハンドシェイクが LSASS.exe の呼び出し元プロセスの外部で実行される場合、呼び出し元プロセスから LSASS に移動するときにPKCS12_NO_PERSIST_KEYを使用することはできません (NCRYPT_KEY_HANDLEはカーネル ハンドルではなくデータ構造へのポインターであるため)。

 
Windows Server 2003 および Windows XP: この値はサポートされていません。
PKCS12_INCLUDE_EXTENDED_PROPERTIES
0x0010
エクスポート時に証明書に保存された証明書のすべての拡張プロパティをインポートします。

Windows Server 2003 および Windows XP: この値はサポートされていません。

0x10000000
開梱しますが、結果は保持されません。

戻り値

関数が成功した場合、関数は、インポートされた証明書を含む証明書ストアへのハンドル (使用可能な秘密キーを含む) を返します。

関数が失敗した場合、つまり、password パラメーターにエクスポートされたパケットの暗号化に使用されたパスワードとの完全な一致が含まれていない場合、または PFX BLOB のデコードに他の問題が発生した場合、関数は NULL を返し、 GetLastError 関数を呼び出してエラー コードを見つけることができます。

注釈

PFXImportCertStore 関数は、一時ストアを開きます。 関数が成功した場合は、 CertCloseStore 関数を呼び出してストアへのハンドルを閉じる必要があります。

PFX パケットから証明書をインポートすると、 CSP/KSP コンテナー名は、PKCS8ShroudedKeyBag SafeBag SafeBag の OID 1.3.6.1.4.1.311.17.1 の AttributeId を使用して決定されます bagId: 1.2.840.113549.1.12.10.1.2] (このの ASN.1 構造の詳細については 、PKCS #12 を参照してください)。

  • AttributeId: 1.3.6.1.4.1.311.17.1
  • 値: KSP 名または CSP 名

AttributeId が存在せず、PREFER_CNG フラグが渡された場合は、MS_KEY_STORAGE_PROVIDERが選択されます。 AttributeId が存在せず、PREFER_CNG フラグが渡されない場合、プロバイダー名は公開キー アルゴリズムに基づいて決定されます (つまり、公開キー アルゴリズムは PKCS #8 の AlgorithmIdentifier によって決定されます)。

  • Rsa: MS_ENHANCED_PROV_W
  • Dsa: MS_DEF_DSS_DH_PROV_W

同様に、キーの仕様は、次のように OID 2.5.29.15 (szOID_KEY_USAGE) の AttributeId を使用して決定されます。

CAPI キーを使用する場合:

  • KEY_ENCIPHERMENTまたはDATA_ENCIPHERMENTが設定されている場合、キー指定は AT_KEYEXCHANGE に設定されます。
  • DIGITAL_SIGNATUREまたはCERT_SIGNまたはCRL_SIGNが設定されている場合、キー指定は AT_SIGNATURE に設定されます。

CNG キーを使用する場合:

  • KEY_ENCIPHERMENT、DATA_ENCIPHERMENT、ENCIPHER_ONLY、またはDECIPHER_ONLYが設定されている場合、ncrypt キーの使用法は ALLOW_DECRYPT に設定されます。
  • DIGITAL_SIGNATUREまたはCERT_SIGNまたはCRL_SIGNが設定されている場合、ncrypt キーの使用法は ALLOW_SIGN に設定されます。
  • KEY_AGREEMENTが設定されている場合、ncrypt キーの使用法は ALLOW_KEY_AGREEMENT に設定されます。

AttributeId が存在しない場合、CAPI キー値は RSA または DH のAT_KEYEXCHANGEに設定され、アルゴリズムは PKCS #8 の AlgorithmIdentifier によって決定されます。それ以外の場合、アルゴリズムは AT_SIGNATURE に設定されます。 CNG キー値の場合、すべての ncrypt キーの使用法が設定されます。

注意

PFX パケットに無効なプロバイダー名が存在する場合、または基本または拡張暗号化プロバイダーがこのレジストリ キーに存在しない場合: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider、プロバイダー参照は、このレジストリ サブキーを使用してプロバイダーの種類によって実行されます: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types

Microsoft では、PFX をインポートするための 2 つの暗号化/ハッシュ アルゴリズムのみがサポートされています。

  • TripleDES-SHA1
  • AES256-SHA256

上記のいずれかのアルゴリズムでは、証明書の暗号化は省略可能です。

Microsoft は、選択を介して証明書ストアから PFX を All Tasks>Yes, export the private key エクスポートできます。 ここでは、これら 2 つの選択肢のいずれかに一致する暗号化/ハッシュ アルゴリズムを選択できます。

PowerShell を使用して、次の方法で PFX をエクスポートできます。

Export-PfxCertificate
[-CryptoAlgorithmOption <CryptoAlgorithmOptions>]

-CryptoAlgorithmOption は、PFX ファイル内の秘密キーを暗号化するためのアルゴリズムを指定します。 このパラメーターを指定しない場合、既定値は です TripleDES_SHA1。 このパラメーターの有効値は、次のとおりです。

説明
TripleDES_SHA1 秘密キーは、トリプル DES 暗号化を使用して PFX ファイルで暗号化されます。
AES256_SHA256 秘密キーは、AES-256 暗号化を使用して PFX ファイルで暗号化されます。

OpenSSL では、次のコマンドを使用して上記の 2 つのアルゴリズムがサポートされています。

  • openssl pkcs12 -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES -in in.pem -export -out out.pfx -password file:password.txt -passin file:password.txt
  • openssl pkcs12 -keypbe AES-256-CBC -certpbe AES-256-CBC -macalg sha256 -in in.pem -export -out out.pfx -password file:password.txt -passin file:password.txt

次のコマンドは前の 2 つのコマンドと同じですが、証明書は暗号化されません。

  • openssl pkcs12 -keypbe PBE-SHA1-3DES -certpbe NONE -in in.pem -export -out out.pfx -password file:password.txt -passin file:password.txt
  • openssl pkcs12 -keypbe AES-256-CBC -certpbe NONE -macalg sha256 -in in.pem -export -out out.pfx -password file:password.txt -passin file:password.txt

要件

要件
サポートされている最小のクライアント Windows XP [デスクトップ アプリ | UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー wincrypt.h
Library Crypt32.lib
[DLL] Crypt32.dll

こちらもご覧ください

PFXExportCertStore

PFXExportCertStoreEx