包装Windows Crypto API的Active-X控件有时会返回“未定义键集”的错误。我已经与Active-X控件的供应商讨论了这个问题,他们也同样感到困惑。他们使用NULL作为提供程序,允许Crypto API自行选择。
这篇Microsoft文章CryptAcquireContext() use and troubleshooting以及其他一些信息表明注册问题或Windows注册表问题。
我的问题是,在大部分时间我们没有看到这个问题时,有时会发生这种情况的原因是什么?
我们可以使用哪些程序来收集导致根本原因的数据?
实际建议的解决方案会很好,但是根本原因分析的一些额外数据收集会有所帮助。
实际部署环境是一组平板电脑,它们在移动环境中使用蜂窝网络进行LAN访问。这些平板电脑有一组在部署旅行时设置和配置。旅行结束后,平板电脑将重新存放。
我们无法在实验室中复制此问题。即使环境被复制到使用现场使用的蜂窝LAN,实验室测试似乎也能正常工作。
编辑01。
我们在该领域看到的一件事是,一旦遇到问题,它就会在短时间内发生,就像在半分钟内一样。我们知道这一点,因为我们有一些日志显示正在处理的一系列记录中的Decrypt,并且在每个错误上我们跳到下一条记录,这再次给出了Decrypt错误。如果有30个记录要处理,我们将看到30个日志,每个记录一个,但错误相同。
我们正在查看以下内容,一旦有其他信息,我将更新此问题:
在第一次失败时停止处理,以便重新启动并重试
审核平板电脑跟踪以确定它是否只是特定的平板电脑
我目前正在研究Window C/C++ Crypto API Examples and tips的各种链接,在收集数据时可能有用的一件事是在应用程序启动时枚举提供程序列表以生成列表。< / p>
编辑02
供应商提供了正在使用的CryptAcquireContext()
函数的用法。它是在关闭UNICODE的情况下编译的,因此LPCTSTR是标准的char
字符串,而不是wchar_t
字符串。
if(!::CryptAcquireContext(&m_hCryptProv,NULL,MS_ENHANCED_PROV,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT))
{
m_strLastError = LookupSystemError(::GetLastError() );
DestroySession();
return false;
}