问题描述
假设进程A 创建一个临时客户端证书存储,然后启动进程B ,并通过某种进程间通信传递继承的证书存储句柄,然后进程A 退出。 (请参见下文)
进程B 开始运行时,它将获取证书存储句柄并尝试处理临时客户端存储。
问题是:“子过程B 仍可以访问在父过程A (退出)中创建的临时证书存储吗?”谢谢!
Process A
+--------------------------------------------------+
| CreateFile("certificate.pfx",...) |
| ReadFile(hFile,...) |
| Create CRYPT_DATA_BLOB |
| PFXImportCertStore(&cryptBlob,...) |
| CreateProcess(Process B hCertStore,...,TRUE,...) |
| (TRUE indicates new process inherits hCertStore) |
| Process Exits |
+--------------------------------------------------+
Process B
+--------------------------------------------------+
| Get handle hCertStore using Inter-Process Comms |
| CertFindCertificateInStore{hCertStore,...) |
| Process the temporary cert store... |
+--------------------------------------------------+
解决方法
运行测试,将临时证书存储区句柄从进程A 传递到进程B ,并受到故障转储的欢迎:
STACK_TEXT:
00000017`7df4fcc0 00007ffa`655574c6 : 00000017`7df4fd30 00000017`7df4fd30 00000017`7df4fd10 00000000`ffffffff : crypt32!AutoResyncStore+0x10
00000017`7df4fd20 00007ff7`23c943cd : 0000016d`0dc53a2e 00000000`00000000 00007ff7`23cac7c2 00000000`0118b2d8 : crypt32!CertFindCertificateInStore+0x56
00000017`7df4fd70 0000016d`0dc53a2e : 00000000`00000000 00007ff7`23cac7c2 00000000`0118b2d8 00000000`00000000 : HelloWorld64!WinMain+0x121
00000017`7df4fd78 00000000`00000000 : 00007ff7`23cac7c2 00000000`0118b2d8 00000000`00000000 00000000`00000000 : 0x0000016d`0dc53a2e
SYMBOL_NAME: crypt32!AutoResyncStore+10
MODULE_NAME: crypt32
IMAGE_NAME: crypt32.dll
STACK_COMMAND: ~0s ; .ecxr ; kb
FAILURE_BUCKET_ID: INVALID_POINTER_READ_c0000005_crypt32.dll!AutoResyncStore
OS_VERSION: 10.0.18362.1
BUILDLAB_STR: 19h1_release
OSPLATFORM_TYPE: x64
OSNAME: Windows 10
似乎无法使用来自另一个进程的共享句柄访问临时证书存储。作为一种解决方法,我将研究通过以下方式传递PFX BLOB:
- 通过IPC将PFX BLOB(即pfx文件字节)传递给另一个进程。
- 为BLOB创建一个全局共享的命名内存映射,因此任何具有该进程的进程 内存句柄可以访问它并处理证书。
谢谢。