1

我正在创建一个服务来获取SmartCard唯一域中的用户智能卡(所以我无法通过用户的身份验证,因为他们没有注册智能卡,所以我使用其他身份验证方法来验证用户)然后用户向我发送他的 CSR但是当我尝试代表用户创建证书时,出现以下错误:

“CertEnroll::CX509Enrollment::Enroll:这种类型的证书只能颁发给用户。:未为应用程序 0x8004e00c (-2147164148 CONTEXT_E_ROLENOTFOUND) 配置指定的角色”

我创建了一个有权访问的服务帐户,Enrollment Agent Certificate并为该帐户创建了一个证书。我还创建了一个智能卡模板,该模板需要注册代理证书签名才能代表用户请求证书,并授予该服务帐户对该模板的完全访问权限。该应用程序在使用该服务帐户作为身份的 IIS 应用程序池中运行,我使用此代码请求证书(它使用CERTENROLLLib):

_cSignerCertificateWrapper.Initialize(true, X509PrivateKeyVerify.VerifyNone, EncodingType.XCN_CRYPT_STRING_BASE64, Convert.ToBase64String(_x509Certificate2Wrapper.RawData));
var innerRequest = new CX509CertificateRequestPkcs10Class();
innerRequest.InitializeDecode("ContextMachine", EncodingType.XCN_CRYPT_STRING_BINARY);
innerRequest.InitializeDecode(request);

_cx509CertificateRequestCmcWrapper.InitializeFromInnerRequestTemplateName(innerRequest, templateName);
_cx509CertificateRequestCmcWrapper.RequesterName = requesterName;
_cx509CertificateRequestCmcWrapper.SignerCertificate = _cSignerCertificateWrapper.WrappedObject;
_cx509CertificateRequestCmcWrapper.Encode();

_cx509EnrollmentWrapper.InitializeFromRequest(_cx509CertificateRequestCmcWrapper.WrappedObject);

try
{
    _cx509EnrollmentWrapper.Enroll();
}

我还将 IIS 帐户切换为在我的用户下运行,但仍然出现错误。我是否必须以某种方式向 CA 进行身份验证,或者它是否使用我的 IIS 身份来请求请求(我确实通过检查 this 的输出来验证它是否在上下文中运行System.Security.Principal.WindowsIdentity.GetCurrent().Name)?

4

1 回答 1

1

您将证书作为机器上下文,更改此行:

_cSignerCertificateWrapper.Initialize(true, X509PrivateKeyVerify.VerifyNone, EncodingType.XCN_CRYPT_STRING_BASE64, Convert.ToBase64String(_x509Certificate2Wrapper.RawData));

至:

_cSignerCertificateWrapper.Initialize(false, X509PrivateKeyVerify.VerifyNone, EncodingType.XCN_CRYPT_STRING_BASE64, Convert.ToBase64String(_x509Certificate2Wrapper.RawData));

并删除此行

innerRequest.InitializeDecode("ContextMachine", EncodingType.XCN_CRYPT_STRING_BINARY);

于 2019-04-17T00:49:47.597 回答