CryptAPI 取得 证书序列号 的操作
通过Win32 CryptAPI查找个人证书库(MY)中的指定的证书的序列号。显示之。证书的序列号经过处理,和IE中显示的一样(只是人为地去掉了空格)。
#pragma comment(lib, "comsupp.lib")
头文件
- //
去除指定字符 - //
下面的代码用于字符串替换 - static
char* trim(char *str, char chr){ -
return (*str==0)?str:(((*str!=chr)?(((trim(str+1, chr)-1)==str)?str:(*(trim(str+1,chr)-1)=*str,*str=chr,trim(str+1,chr))):trim(str+1,chr))); - }
-
- //
删除字符串中的指定字符, 返回字符串 - static
char *trimString(char *str, char chr) - {
- #pragma
warning( disable: 4996 ) -
return lstrcpy(str, trim(str, chr)); - #pragma
warning( default: 4996 ) - }
-
- //
提取X509证书序列号,返回与IE看到的证书序列一致(去掉空格) - static
BOOL parseX509CertSerialNumbe r(PCCERT_CONTEXT hCert, char sn[]) - {
-
int i, len; -
char c0, c1; -
BOOL bResult; -
CRYPT_INTEGER_BLOB SerialNumber; -
char *s; -
-
// 取得要解码的信息尺寸 -
bResult = CryptFormatObject( -
hCert->dwCertEncodingType, -
0, -
0, -
NULL, -
0, -
hCert->pCertInfo->SerialNumber.pbData, -
hCert->pCertInfo->SerialNumber.cbData, -
NULL, -
&SerialNumber.cbData); -
ASSERT(bResult); -
if (!bResult) -
return FALSE; -
-
// 分配解码数据存放 -
SerialNumber.pbData = (BYTE *) malloc(SerialNumber.cbData); -
-
// 解码数据 -
bResult = CryptFormatObject( -
hCert->dwCertEncodingType, -
0, -
0, -
NULL, -
0, -
hCert->pCertInfo->SerialNumber.pbData, -
hCert->pCertInfo->SerialNumber.cbData, -
SerialNumber.pbData , -
&SerialNumber.cbData); -
ASSERT(bResult); -
if (!bResult){ -
free(SerialNumber.pbData); -
return FALSE; -
} -
-
s = (char*) malloc(48); -
s = ::_com_util::ConvertBSTRToString((BSTR)SerialNumber.pbData); -
lstrcpy(sn, s); -
free(s); -
free(SerialNumber.pbData); -
-
// 去除空格 -
trimString(sn, 32); -
-
// 颠倒字符串 -
len = strlen(sn); -
ASSERT(len%2==0); -
-
for(i=0; i<len/2; i+=2){ -
c0 = sn[i]; -
c1 = sn[i+1]; -
-
sn[i]=sn[len-i-2]; -
sn[i+1]=sn[len-i-1]; -
-
sn[len-i-2]=c0; -
sn[len-i-1]=c1; -
} -
-
return TRUE; - }
==========================
如下代码调用:
------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------