C++获取数字证书的序列号
目录
我们需要准备一个二进制的证书实体 或是 CRL,给出的例子可以直接解析出证书的序列号,而不需要通过任何的第三方的接口例如:openssl 、CryptoAPI
通过看ASN.1 得知:
- INTEGER 为任意一个整数 该标记码为 0x02
- asn.1这规范一般标记码后面是 长度
了解到证书的序列号的长度为 32字节 的十六进制的字符串
二进制的长度为16字节
举个证书序列号的栗子:
序列号 : 21 11 78 53 0b 64 aa 92 13 45 59 cd 49 f4 d8 c1
以下是一个简单的例子
/*
@作者:天空中的一米阳光
@由于我的环境是VS 2010 故用了fopen_s方法和sprintf_s方法
*/
#include<iostream>
#include<string>
using namespace std;
int main()
{
FILE *fp = NULL;
int iDataLen = 0;
unsigned char* crlData = NULL;
errno_t err;
//这里我是用的CRL ,用.cer的证书实体也是一样的
err = fopen_s(&fp,"crl.crl","rb+");
if (err!=0)
{
cout<<"File wasn't opened"<<endl;
return -1;
}
fseek(fp,0L,SEEK_END);
iDataLen = ftell(fp); //获取文件的大小
fseek(fp,0L,SEEK_SET);
crlData = new unsigned char[iDataLen+1];
memset(crlData,0x00,iDataLen+1);
fread(crlData,sizeof(unsigned char),iDataLen,fp);
int iCount = 0;
int i = 0;
iCount = iDataLen;
for ( i = 0;i<iDataLen;i++)
{
if (crlData[i]==2)
{
if (crlData[i+1]==16)
{
string strNum;
for (int j = 0;j<16;j++)
{
char str[3] = {0};
sprintf_s(str,3,"%02x",crlData[i+2]);//将二进制的数据转变为十六进制的字符串
strNum += str;
i++;
}
cout<<strNum<<endl;
}else{
continue;
}
}
}
fclose(fp);
delete[] crlData;
crlData = NULL;
return 0;
}