一段 CryptAPI 取得 证书序列号 的代码
2009-02-24 13:37
246 查看
CryptAPI 取得 证书序列号 的操作
cheungmine
通过Win32 CryptAPI查找个人证书库(MY)中的指定的证书的序列号。显示之。证书的序列号经过处理,和IE中显示的一样(只是人为地去掉了空格)。
==========================
如下代码调用:
------------------------------------------------------------------------------------------------------------
HCERTSTORE hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,
PKCS_7_ASN_ENCODING|X509_ASN_ENCODING,
0,
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY");
if (hStore==NULL){
throw "Fail to open my cert store";
}
// 要查找的证书
char szBuf[512];
szBuf[511]=0;
BOOL bRet;
DWORD cbSize;
PCCERT_CONTEXT hCert = 0;
char SerialNumber[48]; // 必须是48
while((hCert=CertEnumCertificatesInStore(hStore, hCert)) != NULL){
// 发行者名称
cbSize = CertGetNameString(hCert,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
CERT_NAME_ISSUER_FLAG,
0,
szBuf,
128);
// 取出序列号
if (!parseX509CertSerialNumber(hCert, SerialNumber)){
bRet = CertCloseStore(hStore, 0);
throw "Fail to get serial number";
}
// SerialNumber存放了你想要的序列号,如:
// "df48a548cef576bb4ae7a726b6938424"
// 做你喜欢的事
......
}
// 关掉这个家伙
bRet = CertCloseStore(hStore, 0);
------------------------------------------------------------------------------------------------------------
补充:很讨厌这套API。真的。
cheungmine
通过Win32 CryptAPI查找个人证书库(MY)中的指定的证书的序列号。显示之。证书的序列号经过处理,和IE中显示的一样(只是人为地去掉了空格)。
// 去除指定字符 // 下面的代码用于字符串替换 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 parseX509CertSerialNumber(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; }
==========================
如下代码调用:
------------------------------------------------------------------------------------------------------------
HCERTSTORE hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,
PKCS_7_ASN_ENCODING|X509_ASN_ENCODING,
0,
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY");
if (hStore==NULL){
throw "Fail to open my cert store";
}
// 要查找的证书
char szBuf[512];
szBuf[511]=0;
BOOL bRet;
DWORD cbSize;
PCCERT_CONTEXT hCert = 0;
char SerialNumber[48]; // 必须是48
while((hCert=CertEnumCertificatesInStore(hStore, hCert)) != NULL){
// 发行者名称
cbSize = CertGetNameString(hCert,
CERT_NAME_SIMPLE_DISPLAY_TYPE,
CERT_NAME_ISSUER_FLAG,
0,
szBuf,
128);
// 取出序列号
if (!parseX509CertSerialNumber(hCert, SerialNumber)){
bRet = CertCloseStore(hStore, 0);
throw "Fail to get serial number";
}
// SerialNumber存放了你想要的序列号,如:
// "df48a548cef576bb4ae7a726b6938424"
// 做你喜欢的事
......
}
// 关掉这个家伙
bRet = CertCloseStore(hStore, 0);
------------------------------------------------------------------------------------------------------------
补充:很讨厌这套API。真的。
相关文章推荐
- 一段 CryptAPI 取得 证书序列号 的代码
- CryptAPI 取得 证书序列号 的操作
- [转载]纯VB代码取得硬盘的物理序列号
- 通过身份证号码取得生日的一段代码(支持18位和15位身份证)
- 纯VB代码取得硬盘的物理序列号
- 纯VB代码取得硬盘的物理序列号
- 以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号)[转]
- 纯VB代码取得硬盘的物理序列号
- Delphi XE取得硬盘序列号代码
- 纯VB代码取得硬盘的物理序列号 (转)
- Delphi XE取得硬盘序列号代码
- 以下代码可以取得系统特征码(网卡MAC、硬盘序列号、CPU ID、BIOS编号)
- vbs:一段比较精简的代码实现取得字符串的"字节"数
- 纯VB代码取得硬盘的物理序列号
- javascript 一段代码引发的思考第1/2页
- 一段很诡异的代码
- 写的一段拖动对象的代码
- Jquery执行多个动画以后执行一段代码(:animated的妙用)
- 经典宏代码一段
- 如何用Java编写一段代码引发内存泄露