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 封包時所使用的值、空字串或 Null。 PFXImportCertStore函式會使用 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