CertFindCertificateInStore не может найти сертификат, если приложение запущено с другими учетными данными пользователя - PullRequest
0 голосов
/ 13 марта 2019

У меня есть сертификаты в моих пользовательских сертификатах Windows-> Личная папка и ее CA в папке Trusted Root.

У меня есть приложение-служба Windows, которое пытается получить сертификат с помощью API CertFindCertificateInStore ().

HCERTSTORE hMy = CertOpenSystemStore(0, _T("MY"));
CString cert = _T("1.2.3.4");
PCCERT_CONTEXT context =  CertFindCertificateInStore( hMy, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, cert ,    NULL ); 

Работает нормально, если я запускаю службу с текущим логином в учетных данных пользователя Windows.

Я создал локального пользователя (скажем, TEST) и добавил в группу администраторов. Также добавлено в LocayPolicies-> Управление правами пользователей -> «Заменить токен уровня процесса» и «Логотип в качестве политик обслуживания».

Я запустил службу с учетными данными пользователя TEST. Служба запущена. Но тот же код, CertFindCertificateInStore () API, не может найти сертификат, и API возвращает NULL.

Буду признателен за вашу помощь!

1 Ответ

0 голосов
/ 16 марта 2019

Я нашел основную причину.Кадровые сертификаты CURRENT_USER не доступны для другого пользователя.Я импортировал сертификаты в LOCAL MACHINE и использовал приведенный ниже обновленный код для решения проблемы.

HCERTSTORE hMy = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY");
...