Не удается запросить сертификаты SmartCard от имени пользователя - PullRequest
1 голос
/ 11 апреля 2019

Я создаю службу для получения смарт-карт пользователей только в домене 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)?

1 Ответ

1 голос
/ 17 апреля 2019

вы получаете сертификат как контекст машины, измените эту строку:

_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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...