2

アンマネージC++を使用して以下のC#コードと同等の方法を実行する方法を知っている人はいますか?つまり、X509証明書ストアから指紋で証明書をクエリしますか?

        var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

        store.Open(OpenFlags.ReadOnly);

        var allCerts = store.Certificates;

        foreach (var certificate in from X509Certificate2 certificate in allCerts
                                    where certificate.Thumbprint != null
                                       && certificate.Thumbprint.Equals(thumbprint, StringComparison.OrdinalIgnoreCase)
                                    select certificate)
        {
            return certificate;
        }

前もって感謝します

デイブ

4

2 に答える 2

6

目的を達成するには、Win32CryptAPIライブラリを調べる必要があります。.NETほど簡単ではありません。CertOpenStoreとCertFindCertificateInStoreを調べます。

証明書ストアを開いてCertFindCertificateStoreに渡し、証明書の検索に使用する基準を保持する構造を作成する必要があります。シリアル番号や署名などが使えます。

    HCERTSTORE hSysStore = NULL;
    PCCERT_CONTEXT  pDesiredCert = NULL;
if(hSysStore = CertOpenStore(
   CERT_STORE_PROV_SYSTEM,          // The store provider type
   0,                               // The encoding type is
                                    // not needed
   NULL,                            // Use the default HCRYPTPROV
   CERT_SYSTEM_STORE_CURRENT_USER,  // Set the store location in a
                                    // registry location
   L"MY"                            // The store name as a Unicode 
                                    // string
   ))
{
    //We have our store, let's do stuff with it
    if (pDesiredCert = CertFindCertificateInStore(.....) {  ..... }
}
else
{
    //Error stuff
}

あなたはする必要が#include <Wincrypt.h>あります#include <windows.h>

于 2011-11-09T17:18:13.373 に答える
0

CertFindCertificateInStoreからのコード。新しいシステムでは動作しません。新しいバージョンのWindowsでは、証明書の名前または件名はUnicode形式であり、各文字に2バイトを使用します。次の行:

LPCSTR lpszCertSubject = (LPCSTR) "Cert_subject_1";

次のように変更する必要があります:

LPCWSTR lpszCertSubject = (LPCWSTR ) L"Cert_subject_1";

また

LPCTSTR lpszCertSubject = (LPCTSTR ) _T"Cert_subject_1"; // add #include <tchar.h> 

必要なものに応じて。

于 2018-07-10T10:37:07.830 に答える