我有一个 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 中工作的代码)或使这个工作与本地机器安装的证书一起工作而没有密钥错误。
如果有人可以提供帮助将不胜感激