在多个进程之间共享一个临时客户端证书存储

问题描述

假设进程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:

  1. 通过IPC将PFX BLOB(即pfx文件字节)传递给另一个进程。
  2. 为BLOB创建一个全局共享的命名内存映射,因此任何具有该进程的进程 内存句柄可以访问它并处理证书。

谢谢。