我正在创建一项服务,以在仅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身份用于请求(我通过检查此System.Security.Principal.WindowsIdentity.GetCurrent().Name
的输出来确认它在上下文中运行)?
答案 0 :(得分:1)
you are getting the certificate as machine context, change this line:
_cSignerCertificateWrapper.Initialize(true, X509PrivateKeyVerify.VerifyNone, EncodingType.XCN_CRYPT_STRING_BASE64, Convert.ToBase64String(_x509Certificate2Wrapper.RawData));
to:
_cSignerCertificateWrapper.Initialize(false, X509PrivateKeyVerify.VerifyNone, EncodingType.XCN_CRYPT_STRING_BASE64, Convert.ToBase64String(_x509Certificate2Wrapper.RawData));
and remove this line
innerRequest.InitializeDecode("ContextMachine", EncodingType.XCN_CRYPT_STRING_BINARY);