2013-09-09 7 views
1

У меня есть приложение 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 с помощью работы с установленным локальным макетом без основной ошибки.

Если кто-то может помочь была бы оценена

+0

Лучше всего надеяться, что Евгений Майевский из ElDos увидит этот вопрос и поможет вам. http://stackoverflow.com/users/47961/eugene-mayevski-eldos-corp –

ответ

0

Если это проблема с проверкой подлинности пользователя, и у вас есть (всего) контроль над сервером, я хотел бы рассмотреть обертыванием немного подписи в активной библиотеке X, и добавление его в пакет COM +; используя Службы компонентов, вы можете управлять активацией и аутентификацией, чтобы она выполнялась с олицетворением в отдельном файле dllhost.exe.

+0

Это не об авторизации пользователя. Я использую сертификат для подписи файла XML ... но спасибо – Davi

+0

Ну, аутентификация может быть неправильным словом, но я имею в виду все, что связано с данными профиля пользователя, например, с частным хранилищем сертификатов. –

 Смежные вопросы

  • Нет связанных вопросов^_^