我有一个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安装的证书工作,而不会出现密钥错误。
如果有人可以提供帮助将非常感激
答案 0 :(得分:0)
如果这是用户身份验证的问题,并且您(完全)控制服务器,我会考虑将签名位包装在Active X库中,并将其添加到COM +包中;使用组件服务,您可以控制激活和身份验证,以便在单独的dllhost.exe中模拟运行