0

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;
4

1 に答える 1

1

プロバイダーを新しいバージョンに変更し、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;
于 2019-05-16T22:59:48.713 に答える