У меня есть приложение delphi 7 CGI webService (в Windows XP, но Windows 7 не входит в таблицу) приложение в том, что мне нужно получить доступ к цифровому сертификату для подписи документа XML.Delphi CGI WebService - Цифровые сертификаты
я импортировал CApicom_TLB и успешно получил сертификат создания экземпляра, но с некоторыми проблемами ...
сервер Apache, который работает мое приложение запускает его с пользователем различных окон в Wich я установлен сертификат, которым листы хранилище сертификатов пустое, когда я запрашиваю флаг CAPICOM_CURRENT_USER_STORE. Я работал над ним, установив сертификат A1 (Pfx с закрытым ключом) на локальном компьютере (через консоль MMC, добавьте новую оснастку) и получив доступ к хранилищу сертификатов с флагом CAPICOM_LOCAL_MACHINE_STORE. Я получаю сертификат (я могу прочитать его серийный номер, дружественное имя, действительное на сегодняшний день), но когда я пытаюсь подписать документ, я получаю ошибку «Ключевая пара не существует».
Тот же код работает (успешно знаменем XML) в обычном APP (Not-cgi) с тем же PFx.
код я использую, чтобы получить сертификат:
Store := CoStore.Create;
Store.Open(CAPICOM_LOCAL_MACHINE_STORE, CAPICOM_STORE_NAME, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
Certs := Store.Certificates as ICertificates2;
for i:= 1 to Certs.Count do
begin
Cert := IInterface(Certs.Item[i]) as ICertificate2;
if Cert.SerialNumber = FNumeroSerie
then begin
if DFeUtil.EstaVazio(NumCertCarregado)
then NumCertCarregado := Cert.SerialNumber;
if CertStoreMem = nil
then begin
CertStoreMem := CoStore.Create;
CertStoreMem.Open(CAPICOM_MEMORY_STORE, 'Memoria', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
CertStoreMem.Add(Cert);
end;
Затем я использую CertStoreMem подписать usign на следующие
OleCheck(IDispatch(Certificado.PrivateKey).QueryInterface(IPrivateKey,PrivateKey));
xmldsig.store := CertStoreMem;
dsigKey := xmldsig.createKeyFromCSP(PrivateKey.ProviderType, PrivateKey.ProviderName, PrivateKey.ContainerName, 0);
Ошибка (ключевой пары) находится в последней строке кода.
Существует два подхода: сделать приложение CGI для проверки сертификата тем же пользователем, который его установил (код, который работает в не-cgi), или сделать этот work-arround с помощью работы с установленным локальным макетом без основной ошибки.
Если кто-то может помочь была бы оценена
Лучше всего надеяться, что Евгений Майевский из ElDos увидит этот вопрос и поможет вам. http://stackoverflow.com/users/47961/eugene-mayevski-eldos-corp –