Windows CRYPT32 CertFreeCertificateChainEngine 从受信任的根权限中删除用户证书
Windows CRYPT32 CertFreeCertificateChainEngine removes user certificate from trusted root authority
我将用户证书添加到受信任的 CA(例如 HandyCache 应用程序的证书)。
然后使用另一个应用程序,它初始化CertificateChainEngine并检查加密连接上的证书,初始化代码如下:
CERT_CHAIN_ENGINE_CONFIG config = { sizeof(config) };
config.dwFlags = CERT_CHAIN_CACHE_END_CERT;
HCERTCHAINENGINE engine;
::CertCreateCertificateChainEngine(&config, &engine);
完成一些工作后,我关闭了一个应用程序,引擎被破坏了:
::CertFreeCertificateChainEngine
这个函数内部有一个奇怪的行为:提到的用户证书在调用过程中从 Trusted CA 中删除,堆栈如下:
CRYPT32!RegDeleteKeyExW
CRYPT32!ILS_DeleteElementFromRegistry+0x4e
CRYPT32!ShipAssertUserRootStoreCertificateAddition+0x13d
CRYPT32!IPR_DeleteUnprotectedRootsFromStore+0x8e
CRYPT32!ResyncFromRegistry+0xdc
CRYPT32!RegistryNotifyChange+0x38
CRYPT32!RegStoreProvControl+0x8e
CRYPT32!CertControlStore+0x4c
CRYPT32!ControlCollectionStore+0x61
CRYPT32!CertControlStore+0x2c
CRYPT32!ControlCollectionStore+0x61
CRYPT32!CertControlStore+0x2c
CRYPT32!CCertChainEngine::~CCertChainEngine+0xf9
CRYPT32!CCertChainEngine::`scalar deleting destructor'+0xd
CRYPT32!CCertChainEngine::Release+0x1d
CRYPT32!CertFreeCertificateChainEngine+0x23
CRYPT32!RegDeleteKeyExW 中的用户证书被删除。
所以,我有一个问题:
为什么 CertFreeCertificateChainEngine 可以决定从用户受信任的 CA 存储中删除所有自定义证书?
任何可以控制此行为的未记录的初始化标志的想法?
UPD:转载于 Windows 7 和 Windows 8.1
在调试器中的 IE 中捕获 ::CertCreateCertificateChainEngine,发现 IE 使用以下初始化标志:
0x30 // CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE | CERT_CHAIN_ENABLE_SHARE_STORE
将问题应用程序中的标志更改为
后
config.dwFlags = CERT_CHAIN_CACHE_END_CERT |
CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE | CERT_CHAIN_ENABLE_SHARE_STORE;
Trusted CA 的用户证书未删除 不再依赖引擎。
不知道,为什么这些标志缺失会影响证书删除。
我将用户证书添加到受信任的 CA(例如 HandyCache 应用程序的证书)。
然后使用另一个应用程序,它初始化CertificateChainEngine并检查加密连接上的证书,初始化代码如下:
CERT_CHAIN_ENGINE_CONFIG config = { sizeof(config) };
config.dwFlags = CERT_CHAIN_CACHE_END_CERT;
HCERTCHAINENGINE engine;
::CertCreateCertificateChainEngine(&config, &engine);
完成一些工作后,我关闭了一个应用程序,引擎被破坏了:
::CertFreeCertificateChainEngine
这个函数内部有一个奇怪的行为:提到的用户证书在调用过程中从 Trusted CA 中删除,堆栈如下:
CRYPT32!RegDeleteKeyExW
CRYPT32!ILS_DeleteElementFromRegistry+0x4e
CRYPT32!ShipAssertUserRootStoreCertificateAddition+0x13d
CRYPT32!IPR_DeleteUnprotectedRootsFromStore+0x8e
CRYPT32!ResyncFromRegistry+0xdc
CRYPT32!RegistryNotifyChange+0x38
CRYPT32!RegStoreProvControl+0x8e
CRYPT32!CertControlStore+0x4c
CRYPT32!ControlCollectionStore+0x61
CRYPT32!CertControlStore+0x2c
CRYPT32!ControlCollectionStore+0x61
CRYPT32!CertControlStore+0x2c
CRYPT32!CCertChainEngine::~CCertChainEngine+0xf9
CRYPT32!CCertChainEngine::`scalar deleting destructor'+0xd
CRYPT32!CCertChainEngine::Release+0x1d
CRYPT32!CertFreeCertificateChainEngine+0x23
CRYPT32!RegDeleteKeyExW 中的用户证书被删除。
所以,我有一个问题:
为什么 CertFreeCertificateChainEngine 可以决定从用户受信任的 CA 存储中删除所有自定义证书?
任何可以控制此行为的未记录的初始化标志的想法?
UPD:转载于 Windows 7 和 Windows 8.1
在调试器中的 IE 中捕获 ::CertCreateCertificateChainEngine,发现 IE 使用以下初始化标志:
0x30 // CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE | CERT_CHAIN_ENABLE_SHARE_STORE
将问题应用程序中的标志更改为
后config.dwFlags = CERT_CHAIN_CACHE_END_CERT |
CERT_CHAIN_ENABLE_CACHE_AUTO_UPDATE | CERT_CHAIN_ENABLE_SHARE_STORE;
Trusted CA 的用户证书未删除 不再依赖引擎。
不知道,为什么这些标志缺失会影响证书删除。