(WIN32: 1400 ERROR_INVALID_WINDOW_HANDLE) при подписании CSR с помощью смарт-карты - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь сгенерировать CSR из смарт-карты, используя библиотеку CertEnroll :: CX509CertificateRequestPkcs10. Это работает нормально, если я просто запускаю его в начале. Однако, если я запускаю поток входа в систему ADAL раньше, я получаю следующую ошибку

CertEnroll :: CX509CertificateRequestPkcs10 :: Код: Неверный дескриптор окна. 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 Ответ

1 голос
/ 17 мая 2019

Я смог обойти это, изменив мой провайдер на более новую версию и 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...