19.07.2006 16:56:09Добавление корневого сертификата из сервиса Ответов: 9
Алексей
Пытаюсь добавить сертификат в "Доверенные корневые центры сертификации" (хранилище ROOT) из сервиса. Использую функцию CertAddEncodedCertificateToStore с параметром CERT_STORE_ADD_ALWAYS. GetLastError возвращает RPC_S_SERVER_UNAVAILABLE - "Сервер RPC недоступен". Сервис запускаю под текущим пользователем, "выставляю" у него рабочий стол текущего пользователя. ОС Win2000+SP4. В чем может быть причина?
 
Ответы:
19.07.2006 18:01:58Василий
Хранилище текущего пользователя или локального компьютера? Если - пользователя, то должно рисоваться окно-предупреждение об этом. Этот сервис точно умеет рисовать окошки на десктопе пользователя?
20.07.2006 7:17:18Алексей
Текущего пользователя. Я знаю, что должно выдаваться окно с предупреждением. Сервис умеет рисовать на десктопе текущего пользователя - перед началом работы он отображает другое окно. Но дело не в сервисе, т.к. из простого оконного приложения выдается та же самая ошибка. Причем раньше этот код точно работал.
20.07.2006 11:50:23Василий
Если код работал и не менялся - вряд ли он неправильный :)
Установка сертификата в "Доверенные корневые..." может быть запрещена доменной политикой (если компьютер в домене).

Попробуйте поставить в "Промежуточные..." ("CA") - поставится?
20.07.2006 12:41:18Алексей
Нет, компьютер не в домене. В CA нормально поставился.
Вот код установки:
if (!(hCertStore = CertOpenSystemStore(NULL, "CA")))
break;
if (!CertAddEncodedCertificateToStore(hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pBuffer, cBuffer, CERT_STORE_ADD_REPLACE_EXISTING|CERT_STORE_ADD_ALWAYS, NULL))
break;
Тут вроде бы напутать то негде :)
20.07.2006 13:15:07Алексей
Самое интересное в том, что на другой ОС - WinXP + SP2 все работает, т.е. сертификаты нормально установились в хранилище ROOT.
20.07.2006 18:58:16Василий
Может, NULL не нравится в CertOpenSystemStore ?
из MSDN:
hprov
[in] Handle of a cryptographic service provider (CSP). Set hProv to NULL to use the default CSP. If hProv is not NULL, it must be a CSP handle created using CryptAcquireContext.

На той машине вообще установлен подходящий CSP для этого сертификата?
21.07.2006 8:32:04Алексей
Да, там только этот криптопровайдер и установлен (не считая дефолтовых). Попробовал передать хэндл криптопровайдера (CryptAcquireContext вызвал с параметром CRYPT_VERIFYCONTEXT), все равно не помогло.
21.07.2006 12:15:09Kirill Sobolev
А руками этот сертификат можно в Root поставить?
24.07.2006 11:36:50Алексей
Спасибо всем, нашлась ошибка. Просто в папке, где располагается сервис, находилась библиотека Crypt32.dll. Поэтому и вылазила эта ошибка.
Еще раз спасибо.