【发布时间】:2019-04-11 15:47:25
【问题描述】:
我正在创建一项服务,以在仅限 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 的输出来验证它是否在上下文中运行)?
【问题讨论】:
-
应用程序是在本地机器上运行而不是在 IIS 服务器上运行吗?我认为证书必须在客户端机器上,而不是 IIS 服务器上。用户是 GUEST 帐户,并且在 IIS 服务器上的访问权限非常有限。您必须以管理员身份运行 IIS 服务才能为用户提供更多访问权限,这是不推荐的。
-
客户端以Web请求的形式提交证书,IIS服务器代表用户请求证书。这部分是因为用户没有到域的网络连接(只有 443 对这台机器开放)。用户认证与IIS上使用的账号无关
标签: c# .net x509certificate certificate-authority certenroll