私は 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 (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);
エラー (キー ペア) は、コードの最後の行にあります。
2 つの方法があります: CGI アプリケーションに、それをインストールしたのと同じユーザーの証明書を読み込ませる (非 CGI で動作するコード) または、ローカル マシンにインストールされた証明書を使用してこの回避策をキー エラーなしで動作させる。
誰かが助けてくれれば大歓迎です