1

我有一个 delphi 7 CGI webService(在 windows XP 中,但 windows 7 不在表中)应用程序,我需要访问数字证书来签署 XML 文档。

我已经导入 CApicom_TLB 并成功实例化证书,但有一些问题......

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

相同的代码在具有相同 PFx 的普通 APP(非 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 中工作的代码)或使这个工作与本地机器安装的证书一起工作而没有密钥错误。

如果有人可以提供帮助将不胜感激

4

1 回答 1

0

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

于 2013-09-09T21:28:42.897 回答