Windows CRYPT32 CertFreeCertificateChainEngine从受信任的根颁发机构中删除用户证书

时间:2015-12-21 16:49:39

标签: windows ssl ssl-certificate

我将用户证书添加到可信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上重现

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的用户证书在引擎空闲时不再未删除
不知道,为什么这些标志缺失会影响证书的删除。