相关文章推荐
长情的刺猬  ·  expected bytes, str ...·  3 月前    · 
性感的饼干  ·  mono.switchIfEmpty - ...·  4 月前    · 
睡不着的橡皮擦  ·  Flink CEP - ...·  1 年前    · 

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 封包的字串密碼。 不論設定為長度大於零的字串或設定為空字串或 Null,這個值必須與用來加密封包的值完全相同。

從Windows 8和Windows Server 2012開始,如果使用PKCS12_PROTECT_TO_DOMAIN_SIDS旗標在PFXExportCertStoreEx函式中建立 PFX 封包,PFXImportCertStore函式會嘗試使用 Active Directory (AD) 主體來解密密碼。 AD 主體是在 pvPara 參數中指定。 如果PFXExportCertStoreEx函式中的szPassword參數是空字串或Null,且dwFlags參數已設定為PKCS12_PROTECT_TO_DOMAIN_SIDS,該函式會隨機產生密碼,並將其加密至pvPara參數中指定的 AD 主體。 在此情況下,您應該將密碼設定為建立 PFX 封包時所使用的值、空字串或 NullPFXImportCertStore函式會使用 AD 主體來解密隨機密碼,而隨機產生的密碼將用來解密 PFX 憑證。

當您完成使用密碼時,請呼叫 SecureZeroMemory 函式 ,從記憶體中清除密碼。 如需保護密碼的詳細資訊,請參閱 處理密碼

[in] dwFlags

dwFlags參數可以是下列其中一個值:

CRYPT_EXPORTABLE
0x00000001
匯入的金鑰會標記為可匯出。 如果未使用此旗標,呼叫具有金鑰控制碼的 CryptExportKey 函式會失敗。 當使用者嘗試使用此金鑰時,會透過對話方塊或其他方法收到通知。 精確的行為是由使用 (CSP) 的密碼編譯服務提供者 所指定。

在 Internet Explorer 4.0 之前,Microsoft 密碼編譯服務提供者會忽略此旗標。 從 Internet Explorer 4.0 開始,Microsoft 提供者支援此旗標。

如果提供者內容是以CRYPT_SILENT旗標集開啟,則使用此旗標會導致失敗,並將最後一個錯誤設定為NTE_SILENT_CONTEXT。

表示偏好使用 CNG 金鑰儲存提供者 (KSP) 。 如果在 PFX 檔案中指定 CSP,則會使用 CSP,否則會偏好使用 KSP。 如果 CNG KSP 無法使用, PFXImportCertStore 函式將會失敗。

Windows Server 2003 和 Windows XP: 不支援此值。

表示一律使用 CNG KSP。 指定時,不論 PFX 檔案中的提供者資訊為何, PFXImportCertStore 會嘗試使用 CNG KSP。 如果 CNG KSP 無法使用,匯入將不會失敗。

Windows Server 2003 和 Windows XP: 不支援此值。

允許覆寫現有的金鑰。 當您遇到案例時,必須匯入包含已存在金鑰名稱的 PFX 檔案時,請指定此旗標。 例如,當您匯入 PFX 檔案時,可能已經有相同名稱的容器,因為索引鍵容器沒有唯一的命名空間。 如果您已在電腦上建立 「TestKey」,然後匯入 PFX 檔案也具有 「TestKey」 做為金鑰容器, 則PKCS12_ALLOW_OVERWRITE_KEY 設定可覆寫金鑰。

Windows Server 2003 和 Windows XP: 不支援此值。

請勿保存金鑰。 當您不想保存金鑰時,請指定此旗標。 例如,如果不需要在驗證之後儲存金鑰,而不是建立容器,然後刪除它,您可以指定此旗標立即處置金鑰。
注意 如果 PKCS12_NO_PERSIST_KEY 旗標是 *not* 設定,則金鑰會保存在磁片上。 如果您不想在金鑰使用範圍之外保存金鑰,您必須呼叫CryptAcquireCoNtext函式,並在dwFlags參數中設定CRYPT_DELETEKEYSET旗標來刪除金鑰。
注意 其他一些考慮:
  • 使用 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: 不支援此值。

如果函式成功,函式會傳回包含匯入憑證的憑證存放區控制碼,包括可用的私密金鑰。

如果函式失敗,也就是說,如果 password 參數未包含與用來加密匯出封包的密碼完全相符,或者如果有任何其他問題解碼 PFX BLOB,則函式會傳回 Null,而且呼叫 GetLastError 函式即可找到錯誤碼。

PFXImportCertStore函式會開啟暫存存放區。 如果函式成功,您應該呼叫 CertCloseStore 函式來關閉存放區的控制碼。

當您從 PFX 封包匯入憑證時,CSP/KSP 容器名稱是使用具有 PKCS8ShroudedKeyBag 之 OID 1.3.6.1.1.4.1.311.17.1 的 AttributeId 來決定 SafeBag [bagId: 1.2.840.113549.1.1.12.10.1.2] (請參閱 PKCS #12 ,以取得此) ASN.1 結構的詳細資料。

  • AttributeId: 1.3.6.1.4.1.311.17.1
  • 價值: KSP 名稱或 CSP 名稱
  • 如果 AttributeId 不存在且傳遞PREFER_CNG旗標,則會挑選MS_KEY_STORAGE_PROVIDER。 如果 AttributeId 不存在且未傳遞PREFER_CNG旗標,則提供者名稱會根據公開金鑰演算法 (決定,公開金鑰演算法是由 PKCS 中的 AlgorithmIdentifier #8) 所決定:

  • Rsa: MS_ENHANCED_PROV_W
  • Dsa: MS_DEF_DSS_DH_PROV_W
  • 同樣地,索引鍵規格是使用 AttributeId 搭配 OID 2.5.29.15 (szOID_KEY_USAGE) ,如下所示:

    如果使用 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 中的 AlgorithmIdentifier #8 所決定;否則,演算法會設定為 AT_SIGNATURE。 針對 CNG 金鑰值,會設定所有 ncrypt 金鑰使用方式。

    如果 PFX 封包中存在不正確提供者名稱,或此登錄機碼中不存在基底或增強式密碼編譯提供者: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider,則提供者查閱會使用此登錄子機碼執行提供者類型: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types

    Microsoft 僅支援兩種加密/雜湊演算法來匯入 PFX:

  • TripleDES-SHA1
  • AES256-SHA256
  • 針對上述任一演算法,憑證加密是選擇性的。

    Microsoft 可以透過 All Tasks>Yes, export the private key 選取專案從憑證存放區匯出 PFX。 您可以在該處選取加密/雜湊演算法,以符合這兩個選項之一。

    您可以使用 PowerShell 透過下列專案匯出 PFX:

    Export-PfxCertificate
    [-CryptoAlgorithmOption <CryptoAlgorithmOptions>]
    

    -CryptoAlgorithmOption 指定在 PFX 檔案中加密私密金鑰的演算法。 如果未指定此參數,則預設值為 TripleDES_SHA1 。 此參數可接受的值為:

    OpenSSL 透過下列命令支援上述兩種演算法:

  • 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
  • 下列命令相當於前兩個命令,但不會加密憑證:

  • 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
  •