1

デジタル署名でファイルに署名しました。このファイルからこの署名を読み取るにはどうすればよいですか?

署名は信頼されています (Globalsign)。暗号化 RSA/SHA1。署名されたファイルは .exe です

4

2 に答える 2

1

次のコードはあなたが望むことをするはずです。インストーラーアプリケーションから取得して、独自の証明書を抽出し、ローカルの証明書ストアにインストールします。

bool driver_setup::install_embeded_cert_to_lm( const std::wstring& filepath )
{

    bool rval = false;

    DWORD dwEncoding = 0;
    DWORD dwContentType = 0;
    DWORD dwFormatType = 0;
    HCERTSTORE hStore = NULL;
    HCRYPTMSG hMsg = NULL;

    // Get message handle and store handle from the signed file.
    BOOL fResult = CryptQueryObject(CERT_QUERY_OBJECT_FILE,
        filepath.c_str(),
        CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED,
        CERT_QUERY_FORMAT_FLAG_BINARY,
        0,
        &dwEncoding,
        &dwContentType,
        &dwFormatType,
        &hStore,
        &hMsg,
        NULL);
    if (!fResult)
    {
        return false;
    }

    DWORD singer_info_size = 0;
    // Get signer information size.
    fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &singer_info_size);
    if (!fResult)
    {
        CryptMsgClose(hMsg);
        CertCloseStore(hStore, 0);
        return false;
    }

    // Allocate memory for signer information.
    std::vector<byte> signer_info_data( singer_info_size );
    PCMSG_SIGNER_INFO pSignerInfo = reinterpret_cast<PCMSG_SIGNER_INFO>(signer_info_data.data());

    // Get Signer Information.
    fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, (PVOID)pSignerInfo, &singer_info_size);
    if( fResult )
    {
        CERT_INFO CertInfo = {};
        CertInfo.Issuer = pSignerInfo->Issuer;
        CertInfo.SerialNumber = pSignerInfo->SerialNumber;

        PCCERT_CONTEXT pCertContext = CertFindCertificateInStore(hStore,dwEncoding,0,CERT_FIND_SUBJECT_CERT,(PVOID)&CertInfo,NULL);
        if( pCertContext != 0 )
        {
            // rval = add_cert_to_lm_trustedpublishers( pCertContext );

            CertFreeCertificateContext(pCertContext);
        }
    }

    CryptMsgClose(hMsg);
    CertCloseStore(hStore, 0);
    return rval;
}
于 2012-08-09T17:18:20.020 に答える
1

まず、扱っている証明書の種類を指定する必要があります。CLI アセンブリについて話している場合は、StrongName 署名を扱っている可能性があります。これは、CLR のグローバル アセンブリ キャッシュでの名前の衝突を防ぐように設計された、まったく異なるビーストです。

ネイティブ アプリケーションと CLI アプリケーションの両方で使用される Authenticode 署名を読みたいと思われているようです。証明書自体を読み取りたい場合は、PE/COFF 仕様を入手し、Windows NT とその派生で使用される形式である PE ( Portable Executable ) ファイル形式のパーサーを実装する必要があります。その証明書を実際に検証できるようにしたい場合は、 WinVerifyTrust 関数を呼び出す必要があります。これにより、Authenticode 検証が実行されます。

もちろん、独自のアプリケーションを作成せずに証明書が検証されることを確認するだけの場合は、ファイルを右クリックして Windows エクスプローラーで [プロパティ...] を選択すると、署名ステータスが表示されます。ファイル。それ以外の場合は、コマンド ライン ユーティリティSigCheckを使用できます。

于 2012-08-09T17:12:17.970 に答える