如何在重启CNG Key Isolation服务后无需重启应用重新打开NCrypt存储提供者?
解决CNG存储提供者重启服务后无法重新打开的问题
问题原因
重启CNG Key Isolation服务后,之前通过NCryptOpenStorageProvider获取的提供者句柄会失效——因为该服务是CNG句柄的承载进程,服务重启会切断应用与服务之间的跨进程句柄关联,导致旧句柄变为无效句柄,直接复用或重复调用打开函数会返回ERROR_INVALID_HANDLE(80070006)。
解决方案
不需要重启应用,按以下步骤操作即可重新获取有效的存储提供者句柄:
- 第一步:释放失效的旧句柄
无论服务是主动重启还是意外重启,一旦检测到句柄失效,必须先调用NCryptFreeObject(myProvider)释放旧的提供者句柄。这一步是关键,若跳过,系统中残留的无效句柄引用会干扰后续的新句柄获取。 - 第二步:确保CNG Key Isolation服务完全启动
服务重启后需要等待其进入稳定运行状态,不能立即调用打开函数。可以通过Windows服务管理API(如OpenService、QueryServiceStatus)检查服务状态,确认其处于SERVICE_RUNNING状态后再继续。 - 第三步:重新调用
NCryptOpenStorageProvider获取新句柄
服务就绪后,再次执行NCryptOpenStorageProvider(&myProvider, MS_KEY_STORAGE_PROVIDER, 0),此时应该能成功返回ERROR_SUCCESS(00000000),获取到有效的新句柄。
额外建议
在应用中增加错误处理逻辑:当调用任何CNG相关API返回ERROR_INVALID_HANDLE时,自动触发上述"释放旧句柄→等待服务就绪→重新获取句柄"的流程,实现自动恢复,避免手动干预。
内容的提问来源于stack exchange,提问作者kazuser
相关产品推荐
相关产品推荐

