(WIN32: 1400 ERROR_INVALID_WINDOW_HANDLE) 使用智能卡签署 CSR 时

Posted

技术标签:

【中文标题】(WIN32: 1400 ERROR_INVALID_WINDOW_HANDLE) 使用智能卡签署 CSR 时【英文标题】:(WIN32: 1400 ERROR_INVALID_WINDOW_HANDLE) while Signing a CSR with a SmartCard 【发布时间】:2019-05-16 22:08:01 【问题描述】:

我正在尝试使用 CertEnroll::CX509CertificateRequestPkcs10 库从智能卡生成 CSR。如果我只是在开始时运行它,它就可以正常工作。但是,如果我事先运行 ADAL 登录流程,则会收到以下错误。

CertEnroll::CX509CertificateRequestPkcs10::Encode:窗口句柄无效。 0x80070578 (WIN32: 1400 ERROR_INVALID_WINDOW_HANDLE)

我查看了错误,似乎是当您调用一个不再存在的窗口时引起的。由于我无法控制 CertEnroll::CX509CertificateRequestPkcs10::Encode 调用的窗口,有没有办法清除指针或避免此错误?

这里是我的注册码供参考

var request = new CX509CertificateRequestPkcs10();
request.Initialize(X509CertificateEnrollmentContext.ContextUser);
request.PrivateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_NONE;
request.PrivateKey.Length = 2048;
request.PrivateKey.ProviderName = "Microsoft Base Smart Card Crypto Provider";
request.PrivateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_SIGNING_FLAG;
request.PrivateKey.KeySpec = X509KeySpec.XCN_AT_KEYEXCHANGE;
request.PrivateKey.MachineContext = false;
if (!subjectName.StartsWith("CN="))
    subjectName = $"CN=subjectName";
var subjectEncoded = new CX500DistinguishedNameClass();
subjectEncoded.Encode(subjectName);
request.Subject = subjectEncoded;
request.Encode();

这是我的验证码

result = authContext.AcquireTokenAsync(ResourceId, clientId, redirectUri, new PlatformParameters(PromptBehavior.Always));
result.Wait();
_userName = result.Result.UserInfo.DisplayableId;
return result.Result.AccessToken;

【问题讨论】:

【参考方案1】:

我可以通过将我的 Provider 更改为较新版本并将 KeySec 更改为 None 来解决这个问题(因为这是新的 Gen Storage 提供者所必需的):

request.PrivateKey.ProviderName = "Microsoft Smart Card Key Storage Provider";
request.PrivateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_SIGNING_FLAG;
request.PrivateKey.KeySpec = X509KeySpec.XCN_AT_NONE;

【讨论】:

以上是关于(WIN32: 1400 ERROR_INVALID_WINDOW_HANDLE) 使用智能卡签署 CSR 时的主要内容,如果未能解决你的问题,请参考以下文章

win32 是啥病毒?

win32com安装

win32是啥

win32编辑框设置提示文字

win32是啥?

Win32是啥