我将用户证书添加到可信CA(例如HandyCache应用程序的证书)
然后使用另一个应用程序,它初始化CertificateChainEngine并检查加密连接上的证书,初始化代码如下:
CERT_CHAIN_ENGINE_CONFIG config = { sizeof(config) };
config.dwFlags = CERT_CHAIN_CACHE_END_CERT;
HCERTCHAINENGINE engine;
::CertCreateCertificateChainEngine(&config, &engine);
经过一些工作,我关闭了一个应用程序,引擎被破坏了:
::CertFreeCertificateChainEngine
此函数内部存在奇怪的行为:在调用过程中,从受信任的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上重现
答案 0 :(得分:1)
Catch :: CertCreateCertificateChainEngine在IE中的调试器中,发现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;
来自受信任的CA的用户证书在引擎空闲时不再未删除。
不知道,为什么这些标志缺失会影响证书的删除。