Delphi CGI WebService - 数字证书

时间:2013-09-09 20:06:52

标签: web-services apache delphi cgi capicom

我有一个delphi 7 CGI webService(在Windows XP中,但是Windows 7不在桌面之外),我需要访问数字证书来签署XML文档。

我已经导入了CApicom_TLB并且成功地获得了证书,但是有一些问题......

运行我的应用程序的apache服务器使用不同的Windows用户运行它,我安装了证书,当我使用CAPICOM_CURRENT_USER_STORE标志查询时,证书存储空了。我通过在本地计算机上安装A1证书(Pfx with privatekey)(通过MMC控制台,添加新的管理单元)并使用CAPICOM_LOCAL_MACHINE_STORE标志访问证书存储来解决这个问题。我拿到证书(我可以读取其序列号,友好名称,迄今为止有效),但是当我尝试签署文件时,我得到“密钥对不存在”错误。

相同的代码在具有相同PFx的普通APP(Not-cgi)中工作(成功签署XML)。

我用来获取证书的代码:

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签署下面的

OleCheck(IDispatch(Certificado.PrivateKey).QueryInterface(IPrivateKey,PrivateKey));
 xmldsig.store := CertStoreMem;

 dsigKey := xmldsig.createKeyFromCSP(PrivateKey.ProviderType, PrivateKey.ProviderName, PrivateKey.ContainerName, 0);

错误(密钥对)位于最后一行代码中。

有两种方法:让CGI应用程序在安装它的同一用户中读取证书(在非cgi中工作的代码)或者使用localmachine安装的证书工作,而不会出现密钥错误。

如果有人可以提供帮助将非常感激

1 个答案:

答案 0 :(得分:0)

如果这是用户身份验证的问题,并且您(完全)控制服务器,我会考虑将签名位包装在Active X库中,并将其添加到COM +包中;使用组件服务,您可以控制激活和身份验证,以便在单独的dllhost.exe中模拟运行