我用我的数字签名签署了文件,我怎样才能从这个文件中读取这个签名?
签名是可信的(Globalsign)。加密 RSA/SHA1。签名文件为 .exe
首先,您需要指定您正在处理的证书类型。如果您谈论的是 CLI 程序集,那么您可能正在处理 StrongName 签名,它们是完全不同的野兽,旨在防止 CLR 的全局程序集缓存中的名称冲突。
这听起来更像是您想阅读 Authenticode 签名,它们用于本机和 CLI 应用程序。如果您想阅读证书本身,那么您需要掌握 PE/COFF 规范,并为 PE(Portable Executable)文件格式实现解析器,这是 Windows NT 及其衍生文件使用的格式。如果您希望能够实际验证该证书,则需要调用WinVerifyTrust 函数,该函数将为您执行 Authenticode 验证。
当然,如果您只想检查您的证书是否有效,而不需要编写自己的应用程序来执行此操作,您可以右键单击该文件并在 Windows 资源管理器中选择 Properties...,它应该会显示您的签名状态文件。否则,您可以使用命令行实用程序SigCheck。
下面的代码应该做你想做的事。它取自安装程序应用程序以提取其自己的证书并将其安装到本地证书存储中。
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;
}